VSCodeのRemoteエクステンションでAWS EC2にSSH接続して開発する際に、SSHをAWS SSM Session Manager経由、かつAWS CLIの認証にMFAを使っている場合のやり方について、日本語の情報がなかったので記載します。元ネタはVSCode Remote to EC2 instance (via SSH over SSM) #941です。
システム要件
- クライアント側
- VSCode
- AWS CLI v2
- awsume
- SSHクライアント(openSSHなど)
- AWS側
- AWS CLIを利用するためのアクセスキーの発行
- MFAの設定
- MFAを必須にする設定(IAM PolicyのCondition句)
〜省略〜
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": false
}
}
〜省略〜
設定手順の流れ
- awsumeのインストール
- AWS CLIのプロファイルの設定
- SSH Configの設定
- SSH Configで使うヘルパーシェルの作成
awsumeのインストール
sudo pip install awsume
通常ユーザーでpip installをしてしまうと、VSCodeから呼び出された時に動きません(PATHが通ってないところにインストールされてしまう)。このためsudoでグローバルインストールが必要です。
詳細は公式ドキュメントが詳しいですが、.bashrcなどで下記のようにailiasを設定すると、プロファイル名を補完して呼び出してくれます。
_awsume() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts=$(awsume-autocomplete)
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
}
complete -F _awsume awsume
AWS CLIのプロファイルの設定
awsumeを使ったプロファイルの切り替えをするため、ホームフォルダ配下の ~/.aws/credential と ~/.aws/config に設定をします。
[default]
aws_access_key_id = *****
aws_secret_access_key = *****
[default]
region = ap-northeast-1
output = json
mfa_serial = arn:aws:iam::AWSアカウントID:mfa/MFAデバイス名
[profile プロファイル名]
role_arn = arn:aws:iam::AWSアカウントID:role/ロール名
source_profile = default
ここまで設定すると、awsumeの機能が動きます。一度コンソールで動作確認をしてみてください。
awsume プロファイル名
MFAの数字を入力
SSH Configの設定
ホームフォルダ配下の ~/.ssh/config ファイルに接続するホストの設定を記載します。下記では「インスタンス名.プロファイル名」という命名規則で指定することで、今回の環境を利用するように設定しています。aws cliでawsにログインしている場合、インスタンス名で接続先の指定が可能です。
(ホスト決めうちの例)
host i-0123456789abcdefg
User ec2-user
ProxyCommand sh -c "./ssh-helper.sh i-0123456789abcdefg プロファイル名 %p"
(汎用的に記載する例)
host i-*.*
User ec2-user
ProxyCommand sh -c "./ssh-helper.sh $(echo %h|cut -d'.' -f1) $(echo %h|/usr/bin/cut -d'.' -f2) %p"
ヘルパーシェルにはインスタンスIDとプロファイル名、転送用ポートを渡しています。
公開鍵認証する場合は、一緒にconfigに記載してしまうのが楽です。
SSH Configで使うヘルパーシェルの作成
SSH Configで指定したヘルパーシェルを下記のように作成します。今回はホームフォルダ直下にssh-helper.shとして作成しています。作成したら、実行権限を付与してください(chmod 755 ./ssh-helper.sh)。
#!/bin/bash
. awsume $2
aws ssm start-session --target $1 --document-name AWS-StartSSHSession --parameters "portNumber=$3"
利用手順
コンソールでawsumeを実行し、MFA認証します。
awsume [プロファイル名]
MFAの数字を入力
その状態で、VSCodeのリモートSSHを実行します。するとEC2に接続することができます。