メンテナンス目的でEC2に対してsshやRDP(リモートデスクトップ)接続する場合、Session Managerをメインで利用していましたが、EC2 Instance Connect Endpointでも各種接続に対応できそうなので試してみました。
試したパターン
(1) AWSコンソールからの接続
(2) 端末からCUIによる接続
(3) 端末からGUIによる接続
(4) 端末から各サービスへの接続
検証に利用した構成
EC2 Instance Connect Endpoint、接続先のEC2、sshのポートフォワーディング接続用にsshdが起動しているEC2をAmazon Linux 2023で構築しています。
サブネットはプライベートサブネットとして外部への通信経路は無い構成です。
作成時の注意点
1. セキュリティグループ
EC2 Instance Connect Endpointで利用するセキュリティグループは2つあり、ログイン先EC2のセキュリティグループとエンドポイント用のセキュリティグループになります。
ログイン先EC2のセキュリティグループについては、EC2 Instance Connect Endpointを「クライアントIPの保持」で作成すると、プライベートのサブネットでグローバルIPの制限を行うポリシーを設定する必要があります。
エンドポイント用セキュリティグループ
- アウトバウンド:接続先EC2への通信(例:TCP/22)
接続先EC2のセキュリティグループ
- インバウンド:EC2 Instance Connect Endpointからの通信を許可
- 「クライアントIPの保持」を有効にする場合、EC2のセキュリティグループはクライアントからのトラフィックを許可
- 「クライアントIPの保持」を無効にする場合、EC2のセキュリティグループはVPCからのトラフィックを許可
- エンドポイント用セキュリティグループを接続元としてトラフィックを許可
(IP制限はできずIAM等で制限することになります)
2. 接続に利用するIAMユーザの権限
EC2 Instance Connect Endpointを利用して接続するIAMユーザに接続用の権限が必要となります。接続ポートやログインユーザ名の指定可能なポリシーがAWSドキュメントに記載されています。
(1) AWSコンソールからの接続
利用用途
AWSコンソール上からLinux系OSへコンソールログインするときに利用します。ブラウザ上で完結するので簡易的にコマンドを実行したい場合に利用します。
接続方法
AWSコンソール上で以下操作を実施
1. EC2の画面からインスタンスを選択して、[接続] を選択
2. [EC2 Instance Connect] タブを選択
3. [プライベートIPを使用して接続] を選択
4. [EC2 Instance Connect エンドポイント] については、利用するエンドポイントのIDを選択
5. [ユーザー名] にログインに利用するユーザ名を入力
(デフォルトユーザを利用するときには、[ec2-user 等]を指定)
6. [接続]を選択
7. インスタンスのターミナルウィンドウが開きます
(2) 端末からCUIによる接続
利用用途
ターミナルソフトを利用してEC2へログインしたい場合に利用します。
接続方法
-
接続元の端末(Windows想定)でPowerShellを起動し、AWS CLIでプライベートトンネルを作成します
# コマンド aws ec2-instance-connect open-tunnel --instance-id <接続先のInstance ID> --remote-port <接続先のPort> --local-port <ローカルのPort> # 実行例 aws ec2-instance-connect open-tunnel --instance-id i-12345678901234567 --remote-port 22 --local-port 10022
-
接続元端末のローカルポートが開くので、ターミナルソフト等で端末自身(127.0.0.1)に接続しログインします
(例だとリモートサーバのssh (22)に接続するため、[127.0.0.1:10022]に接続します# Windows(別窓)上でssh接続する場合 ssh ec2-user@127.0.0.1 -p 10022 -i "Private_Key.pem"
ターミナルソフトを使用しないで接続も可能です。
# ターミナルソフトを利用しない方法 aws --region ap-northeast-1 ec2-instance-connect ssh --instance-id i-12345678901234567
(3) 端末からGUIによる接続
利用用途
WindowsのRDPやLinuxでGUI接続をするときに利用します。
接続方法
-
接続元の端末(Windows想定)でPowerShellを起動し、AWS CLIでプライベートトンネルを作成します
# コマンド aws ec2-instance-connect open-tunnel --instance-id <接続先のInstance ID> --remote-port <接続先のPort> --local-port <ローカルのPort> # 実行例(RDP接続) aws ec2-instance-connect open-tunnel --instance-id i-12345678901234567 --remote-port 3389 --local-port 13389
-
プライベートトンネルが開いた状態で、端末自身(127.0.0.1)に指定したローカルポートでリモートデスクトップ接続を実施
(4) 端末から各サービスへの接続
利用用途
端末から直接DB接続をする場合や、プライベートサブネット上のWebサーバに対して端末からアクセスする場合に利用
接続方法
-
接続元の端末(Windows想定)でPowerShellを起動し、sshdサーバに対してAWS CLIでプライベートトンネルを作成
sshのポートフォワーディングを利用するため、sshdサーバに対してはsshで接続します# コマンド aws ec2-instance-connect open-tunnel --instance-id <sshdサーバのInstance ID> --remote-port 22 --local-port 10022 # 実行例 aws ec2-instance-connect open-tunnel --instance-id i-12345678901234567 --remote-port 22 --local-port 10022
-
sshのポートフォワーディングを利用して接続先のサービスに接続
# コマンド ssh <SSHDサーバのユーザ>@127.0.0.1 -N -p <ローカルのPort> -i "SSHDサーバのユーザのキー" -L <ローカルのPort 2>:<接続先IP>:<接続先のPort> # 実行例 ssh ubuntu@127.0.0.1 -p 10022 -i "Private_Key.pem" -N -L 11080:192.168.10.10:80
-
ブラウザ等を利用して対象のサービスにアクセス
# 実行例 Webアクセスの場合は、ローカルポート 2で指定した11080を指定 http://127.0.0.1:11080/
Session Managerとの比較表
Session ManagerとEC2 Instance Connect Endpointについては以下のような違いがあります。
項目 | Session Manager | EC2 Instance Connect Endpoint |
---|---|---|
VPC Endpointの料金 | 有料 | 無料 |
ポートフォワーディング | 対応 | 対応 |
マルチAZ | 対応 | 非対応 ※ |
EC2に必要なエージェント | SSM Agentが必要 | ec2-instance-connectが必要 |
EC2へのRole設定 | 必要 | 不要 |
※ EC2 Instance Connect Endpointは「VPCあたりのEC2 Instance Connect Endpointの最大数が1つ」という制限があるため、マルチAZ構成ができません
まとめ
EC2 Instance Connect Endpointを利用して各種接続はできることが確認できました。
EC2 Instance Connect EndpointではマルチAZ対応ができないなど制限がありますが、検証環境などではメインで利用してもよさそうな感じです。