目的
AWSのEC2インスタンスにSession Managerで接続する場合に接続先としてインスタンスIDを指定しなければならないがインスタンスIDは再作成などで変更される場合がある。
インスタンスIDが変更になってもSSH Configを変更しなくて良いように設定する。
前提条件
- 利用環境にAWS CLI v2 がインストールされている (インストール方法https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)
- 利用するIAM User は作成済み
- 利用するアクセスキーとシークレットキー も発行済み
- 接続先のEC2インスタンスにはtagにインスタンス名が設定されている
このようにインスタンスにNameタグが付いているとする
$ aws --profile foo ec2 describe-instances --query "Reservations[*].Instances[*].Tags[]" --output table
----------------------------------------------------
| DescribeInstances |
+-----------------+--------------------------------+
| Key | Value |
+-----------------+--------------------------------+
| Name | development-01 |
| Name | development-02 |
| Name | staging-01 |
| Name | staging-02 |
+-----------------+--------------------------------+
今回の環境
macOS 10.14.6
AWS CLI v2 (aws-cli/2.0.0dev2 Python/3.7.4 Darwin/18.7.0 botocore/2.0.0dev1)
設定方法
AWS CLIの Profile
今回は fooというプロファイルを設定して利用する
(抜粋)
[profile foo]
output=json
region=ap-northeast-1
アクセスキーとシークレットキーをfooに設定する
(抜粋)
[foo]
aws_access_key_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SSH configの設定
このような構成
$ tree ~/.ssh
├── aws-ssm-ec2-proxy-command.sh
├── config
└── foo-key
sshのプロキシコマンドのスクリプト(作成したらchmodで実行権限を与えておく)
#!/bin/sh
instanceId=$(aws --profile $1 ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId" --filters "Name=tag:Name,Values=[$2]" --output text)
echo "ssm start session... to $2(${instanceId})"
aws --profile $1 ssm start-session --target ${instanceId} --document-name AWS-StartSSHSession --parameters 'portNumber=[22]'
1行目: AWS CLIを使ってインスタンスIDを取得している
3行目: 1行目で取得したインスタンスIDでSessionを開始するコマンドを実行している
SSH config 設定
Host pj-d1
User ec2-user
IdentityFile ~/.ssh/foo-key
ServerAliveInterval 60
TCPKeepAlive yes
ProxyCommand ./aws-ssm-ec2-proxy-command.sh foo development-01
Host: 自分が指定したいホスト名(覚えやすい任意の名前をつける)
User: sshログインユーザ
IdentityFile: 秘密鍵ファイルのパス
ServerAliveInterval: 接続タイムアウトする秒数
TCPKeepAlive: 接続を維持するかどうか
ProxyCommand: 上記で作成したsshのプロキシコマンドのスクリプトファイル(引数1:AWS CLIのprofile名, 引数2: 接続したいEC2インスタンスのタグに指定した名称
SSH接続する
$ ssh pj-d1
SCPでファイル転送する
カレントのbar.txtファイルをpj-d1のホームディレクトリにアップロードする。
$ scp ./bar.txt pj-d1:~
インスタンスIDを気にすることなく接続できるようになった。