LoginSignup
6
2

More than 3 years have passed since last update.

AWS CLI v2 と Session ManagerでEC2にログインする時のssh config

Posted at

目的

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というプロファイルを設定して利用する

~/.aws/config

(抜粋)

[profile foo]
output=json
region=ap-northeast-1

アクセスキーとシークレットキーをfooに設定する

~/.aws/credentials

(抜粋)
[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で実行権限を与えておく)

aws-ssm-ec2-proxy-command.sh
#!/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 設定

~/.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を気にすることなく接続できるようになった。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2