VSCodeのRemote SSHをAWS SSM Session Manager経由かつ認証にMFAを使う場合のやり方

December 18, 2023
tag icon
VSCode
tag icon
mfa
tag icon
ssh
tag icon
ec2

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
                }
            }
〜省略〜

設定手順の流れ

  1. awsumeのインストール
  2. AWS CLIのプロファイルの設定
  3. SSH Configの設定
  4. 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に接続することができます。

参考文献

  1. VSCode Remote to EC2 instance (via SSH over SSM) #941
  2. マネコン起動もできるAWSのスイッチロール用CLIツール「AWSume」の紹介
  3. AWS CLI で MFA を有効化してみた

Profile picture

i氏 システムのデザインが好きな自称システムアーキテクト。データサイエンティスト見習い。Jamstackのアーキテクチャーに感動して、Gatsbyでブログを始めました。