EC2 Instance Connect Endpoint経由でVPCピアリング先のEC2 インスタンスに接続してみた
はじめに
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 AとVPC 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
ただし、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"