はじめに
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"