ElasticIP を使わず EC2 instance へsshする

コンテナが広く使われるようになり、
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 ~]$