EC2 Instance Connect Endpoint経由でVPCピアリング先のEC2 インスタンスに接続してみた

2023.06.15

はじめに

EC2 Instance Connect Endpoint (以降 EIC エンドポイント) を使用すると、パブリック IP アドレスを使用せずに プライベート サブネット内のEC2インスタンスに SSH および RDP 接続できます。

ただし、制約として、1アカウントにつき最大で5つのEIC エンドポイントしか作成できません。現時点では、上限緩和も不可です

そのため、EIC エンドポイントで、6つ以上のVPC上にあるEC2 インスタンスに接続したい場合、VPC ピアリングで解決する方法を考え、構築手順をまとめました

EIC エンドポイントの概要は、下記を参考ください

構成図

今回構築する構成は、以下の通りです。

事前に準備

  • 下記の通り、VPCを2つ作成し、EC2を起動します。
    • EC2は、Amazon Linux 2023
    • EIC エンドポイント側をVPC A(10.0.0.0/16)、EC2側をVPC B(10.1.0.0/16)とします

VPC ピアリング接続

マネジメントコンソールのVPCの[ピアリング接続を作成]から、VPC AVPC Bを選択すると作成できます。

作成後、VPC ピアリング接続リクエストを承諾しましょう。

あとは、VPC Aのルートテーブルにルートを下記の通り追加します。

VPC A

送信先 ターゲット
10.1.0.0/16 (VPC BのCIDR) ピアリング接続(pcx-xxxxxx)
local 10.0.0.0/16

VPC Bは、変更はありません

送信先 ターゲット
local 10.1.0.0/16

セキュリティグループ作成

EIC エンドポイント用とEC2用のセキュリティグループを以下の通りに作成します

EICのエンドポイントのセキュリティグループ

VPC Aで作成します

セキュリティグループ プロトコル ポート 送信先
インバウンド なし なし なし
アウトバウンド TCP 22 EC2のセキュリティグループID

EC2のセキュリティグループ

VPC Bで作成します

セキュリティグループ プロトコル ポート 送信先
インバウンド TCP 22 EICのエンドポイントのセキュリティグループID
アウトバウンド すべて すべて 0.0.0.0/0

注意点としては、セキュリティグループIDを入力しても、見つかりませんと表示されます。

ただし、そのまま保存すると、問題なく適用されるため、保存して構いません。(原因は、作成するVPCと別のVPCにあるセキュリティグループのためです)

EIC エンドポイント作成

EIC エンドポイントを作成します。

VPC エンドポイントの作成から、サービスカテゴリでEC2 Instance Connect Endpointを選択します。

VPCは、VPC Aを選択します。

Preserve Client IPは、不要のため、チェックを入れずにエンドポイントを作成します

エンドポイント作成後、EC2に接続する際にエンドポイントIDが必要なため、コピーしておきます

EC2に接続

それでは、VPC Aにある EIC エンドポイント経由でVPC BにあるEC2に接続します。

EC2の[接続]に遷移します

接続タイプは、EC2 Instance Connect エンドポイントを使用して接続する、エンドポイントはコピーしたIDを貼り付けて、接続します

注意点としては、VPC Aにエンドポイントがあるため、検索窓からは選択できませんので、エンドポイントIDを貼り付けるとよいです。

無事接続できました!

AWS CLIの場合

AWS CLIでの接続方法は、下記のブログをご参照ください

別アカウント間の接続

AWSマネジメントコンソール上ですと、EIC エンドポイント経由での、別アカウントにあるEC2 インスタンスへの接続はできませんでした。

複数アカウント場合、各アカウントごとにEIC エンドポイントを作成する必要がありそうです。

AWS CLIでもうまくいきませんでした。どなたか、別アカウント間の接続方法がご存知であれば、教えてください。。

$ aws ec2-instance-connect ssh --instance-id インスタンスID \
--instance-ip EC2プライベートIP \
--eice-options endpointId=エンドポイントID \
--connection-type eice

Websocket Closure Reason: Unable to connect to target
ssh_exchange_identification: Connection closed by remote host
後日、弊社柴田から、pemキーを利用し、下記コマンドで別アカウント間の接続できる事がわかりました。

ただし、EC2のpemキーが必須になります。

# ProxyCommandに aws ec2-instance-connect open-tunnel を設定
ssh -i "キーペア秘密鍵のパス" ec2-user@"接続先Private IP" \
    -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-connect-endpoint-id "アカウントAのEIC Endpont ID" --private-ip-address "接続先Private IP"