EC2 Instance Connect Endpointを利用してVSCode Remote SSHする
EC2 Instance Connect Endpointを使って、グローバルIPなしでプライベートサブネットのEC2インスタンスにVSCode Remote SSH接続する方法を紹介します。MFA対応のtipsも含めて解説します。
EC2インスタンスへのSSH接続、これまでは3つの選択肢がありました。
- EC2にグローバルIPを付与して直接SSH
- SSMのSession Managerを利用してシェルに接続
- EC2 Instance Connectを利用して公開鍵を送り込みSSH
最近追加されたEC2 Instance Connect Endpointにより、状況が大きく変わりました。
従来のEC2 Instance Connect
EC2 Instance ConnectはIAM権限を使用してSSH公開鍵をEC2インスタンスに送信する機能です。
aws ec2-instance-connect send-ssh-public-key \
--instance-id <インスタンスID> \
--instance-os-user ec2-user \
--ssh-public-key file://<公開鍵ファイルのパス>
このコマンド実行後、60秒間だけSSH接続が可能になります。ただし、実際の疎通にはグローバルIPやセキュリティグループの穴が必要でした。
EC2 Instance Connect Endpoint
新しいアプローチでは、VPC内のプライベートサブネットにインターフェース型VPC Endpointが作成されます。接続したいEC2インスタンスはグローバルIPを必要とせず、セキュリティグループはエンドポイントへのアクセスのみで十分です。

WebSocketを介したトンネル形成により、任意のネットワークからSSH接続が可能になります。
接続方法
awscli sshコマンド
aws ec2-instance-connect ssh \
--instance-id ${instance_id} \
--private-key-file ${path_to_private_key}
--os-user ${os_user}
手動でSSH鍵登録とトンネル形成
# 公開鍵の登録
aws ec2-instance-connect send-ssh-public-key \
--instance-id ${instance_id} \
--instance-os-user ${os_user} \
--ssh-public-key file://${path_to_public_key}
# ProxyCommandを利用してトンネルを経由したSSHを実行
ssh -i ${path_to_private_key} ${os_user}@${instance_id} \
-o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id %h'
ssh_configに設定しておくと便利です。
Host instance1
HostName <インスタンスID>
User <OSユーザ名>
IdentityFile <秘密鍵のパス>
ProxyCommand aws ec2-instance-connect open-tunnel --instance-id %h
ssh instance1で接続できます。インスタンスIDは再起動後も変わらないため、設定変更が不要というメリットがあります。
VSCode Remote SSHへの応用
Remote SSHでこの方法を使う際の問題点が2つあります。
- 事前にSSH鍵を登録する
send-ssh-public-keyの実行が必要 - ProxyCommandで実行される
open-tunnelがIAM権限エラーになる可能性がある
解決策として、両方をまとめたシェルスクリプトを作成します。
#!/bin/bash
# ~/ec2_instance_connect.sh
# なんらかの方法でAssumeRoleをする(今回はawsumeを使用)
. awsume <プロファイル名>
aws ec2-instance-connect send-ssh-public-key \
--instance-id $1 \
--instance-os-user $2 \
--ssh-public-key file://$3
aws ec2-instance-connect open-tunnel --instance-id $1
ssh_configを更新します。
Host instance1
HostName <インスタンスID>
User <OSユーザ名>
IdentityFile <秘密鍵のパス>
ProxyCommand ~/ec2_instance_connect.sh %h <OSユーザ名> <公開鍵のパス>
MFAへの対応
VSCode Remote SSHはインタラクティブコマンドを実行できないため、MFA認証が問題になります。awsumeを使えば、MFA成功後の有効期限内では再入力が不要になるため、事前に一度MFAを通すだけでRemote SSHが利用可能になります。
EC2 Instance Connect Endpointは非常に便利な機能なので、ぜひ活用してみてください。