コンテナが広く使われるようになり、
EC2 instanceは徐々に使わなくなってきたが、それでもEC2 instance を使っているところはまだまだ多い。
EC2 instance に接続するには ElasticIP を使ってssh を使うのが一般的だが、
ElasticIP は便利なために、長年運用している間に気がつけばだんだん増えていってしまいがちである。
踏み台サーバのような ssh しか使わないサーバであれば、極力 ElasticIP を使わずいけるようにしたい。
接続先のAWS EC2 側の設定と、接続元のMac に設定をまとめた。
接続先のAWS EC2 側の設定
Linux 側に SSM agent をインストールする
sudo yum install -y https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/linux_amd64/amazon-ssm-agent.rpm
ap-northeast-1 の場合は上記の通りだが、
他のリーションを使うことになれば上記よしなに変更する
IAM の設定
EC2 インスタンスに Attach している IAM role に
SSM のロールを Attach する。
AmazonSSMManagedInstanceCore
という AWS管理のポリシーがあるので、これを Attach
Mac の設定
直に aws コマンドをインストールしてもよいが、ローカル環境が汚れるのが嫌なので(これは完全に趣向性)
自分はaws コマンドを叩くと、aws cli のコンテナが動くようにしている。
公式のaws cli のコンテナは何のプラグインも入ってないプレーンな状態なので、
session-manager-plugin をインストールした。
vi Dockerfile
FROM amazon/aws-cli
RUN curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm" && \
yum install -y ./session-manager-plugin.rpm
docker image build -t ssm/aws-cli:latest .
.ssh/config
に以下の通り設定を入れる
host bastion
User ec2-user
ProxyCommand sh -c "docker run --rm -i -v ~/.aws:/root/.aws -v $(pwd):/aws --env AWS_PAGER="" ssm/aws-cli ssm --profile staging start-session --target i-08afxxxxxxxxxx --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
IdentityFile ~/.ssh/ec2-user
他のサーバに対して同様の設定をする際は
インスタンスID i-08afxxxxxxxxxx
や User, IdentityFileを変更すれば良い
また、今回は接続先が BT 環境のため --profile staging
としたが、他の環境に接続する際はここを適宜変更する。
動作確認
今まで ElasticIP を使って接続していたことと同様に接続できることを確認できた。
% ssh bastion
Last login: Mon May 9 10:31:34 2022 from localhost
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@bastion ~]$