記事一覧に戻る
EC2 Instance Connect Endpointを利用してVSCode Remote SSHする

EC2 Instance Connect Endpointを利用してVSCode Remote SSHする

EC2 Instance Connect Endpointを使って、グローバルIPなしでプライベートサブネットのEC2インスタンスにVSCode Remote SSH接続する方法を紹介します。MFA対応のtipsも含めて解説します。

EC2インスタンスへのSSH接続、これまでは3つの選択肢がありました。

  1. EC2にグローバルIPを付与して直接SSH
  2. SSMのSession Managerを利用してシェルに接続
  3. 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を必要とせず、セキュリティグループはエンドポイントへのアクセスのみで十分です。

EC2 Instance Connect Endpointの概要

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つあります。

  1. 事前にSSH鍵を登録するsend-ssh-public-keyの実行が必要
  2. 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は非常に便利な機能なので、ぜひ活用してみてください。