パブリック IP アドレスなしで EC2 インスタンスの Windows Server に RDP 接続できる EC2 Instance Connect (EIC) Endpoint を試しました

2023.06.15

コーヒーが好きな emi です。

2023/6/13、パブリック IP アドレスなしで SSH や RDP 接続ができる EC2 Instance Connect (EIC) Endpoint が発表されました。
本ブログでは EIC Endpoint を使って手元の端末から Windows Server に RDP 接続を試してみます。

検証

全体構成図

今回検証で作成する全体構成は以下のようになります。

VPC の作成

検証用の VPC を作成します。
詳細は記載しませんが、今回は検証用に 1 AZ で VPC とプライベートサブネットを作成しました。
Internet Gateway もアタッチせず、パブリックサブネットは無い構成です。

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

EC2 Instance Connect (EIC) Endpoint 用セキュリティグループと、EC2 インスタンス(Windows Server)用セキュリティグループの二つを作成します。

EC2 コンソールから、以下のようにセキュリティグループを作成します。

EC2 Instance Connect (EIC) Endpoint 用セキュリティグループ:eic-endpoint-test-endpoint-sg

セキュリティグループ タイプ プロトコル ポート範囲 送信先 説明
インバウンド なし なし なし なし なし
アウトバウンド RDP TCP 3389 sg-xxx(EC2 インスタンス(Windows Server)用セキュリティグループ) to eic-endpoint-test-ec2-win-sg

EC2 インスタンス(Windows Server)用セキュリティグループ:eic-endpoint-test-ec2-win-sg

セキュリティグループ タイプ プロトコル ポート範囲 送信先 説明
インバウンド RDP TCP 3389 sg-xxx(EC2 Instance Connect (EIC) Endpoint 用セキュリティグループ) from eic-endpoint-test-endpoint-sg
アウトバウンド すべてのトラフィック すべて すべて 0.0.0.0/0

EC2 Instance Connect (EIC) Endpointの作成

VPC コンソールの Endpoints から「エンドポイントを作成」をクリックし、以下のように VPC エンドポイントを作成します。

項目 設定値 備考
名前タグ - オプション eic-endpoint-test 任意のエンドポイント名
サービスカテゴリ EC2 Instance Connect Endpoint
VPC eic-endpoint-test-vpc 作成した VPC を設定
追加設定 - Preserve Client IP(クライアント IP の保持) チェックしない オン(true)の場合、インスタンスのセキュリティグループはクライアント IP アドレスからの受信トラフィックを許可する必要がある
セキュリティグループ eic-endpoint-test-endpoint-sg 作成しておいた EIC Endpoint 用セキュリティグループを設定
Subnet 作成済みのプライベートサブネットを設定
タグ key:Name、value:eic-endpoint-test 任意のタグを設定

EC2 インスタンス(Windows Server)の作成

EC2 コンソールから、以下のように Windows Server 2022 を作成します。

項目 設定値 備考
名前 eic-endpoint-test-ec2-win 任意の EC2 名
AMI ami-02e06112a2480834a Microsoft Windows 2022 Datacenter edition [English] 2023/6/15 時点で最新の Windows Server 2022 AMI
インスタンスタイプ t3.medium
キーペア 任意のキーペアを作成して設定
サブネット eic-endpoint-test-subnet-private1-ap-northeast-1a 作成済みの VPC とプライベートサブネットを設定
セキュリティグループ eic-endpoint-test-ec2-win-sg 作成しておいた EC2 用セキュリティグループを設定

Windows Server への接続にはキーペアが必要になりますので、あわせて作成・設定してください。 IAM ロール(IAM インスタンスプロファイル)の設定は不要です。

接続元の端末で AWS CLI の設定

接続元とする手元の端末で AWS CLI のインストールとプロファイルの設定(IAM ユーザーのアクセスキーの設定)をします。

AWS CLI の最新バージョンをインストールまたは更新します。 を参考に AWS CLI を手元の端末にインストールします。
私の手元の端末は Windows 11 なので、Windows の手順を参考に設定しました。今回インストールした AWS CLI のバージョンは 2.12.0 です。
コマンドプロンプトで以下のようにバージョンを確認できます。

C:\Users\kitani.emi>aws --version
aws-cli/2.12.0 Python/3.11.3 Windows/10 exe/AMD64 prompt/off

C:\Users\kitani.emi>

AWS CLI 用の IAM ユーザーを作成し、アクセスキーを手元の端末に設定します。
EC2 Instance Connect Endpoint を使用するための IAM 権限は以下のドキュメントを参考にしました。

Allow users to use EC2 Instance Connect Endpoint to connect to instances

ec2-instance-connect:OpenTunnel アクションを許可してやれば OK です。
今回私が設定した権限は以下になります。

eic-endpoint-test-policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2InstanceConnect",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance-connect-endpoint/eice-0d728cde724d6f675",
            "Condition": {
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "3389"
                },
                "IpAddress": {
                    "ec2-instance-connect:privateIpAddress": "10.0.10.106/32"
                }
            }
        },
        {
            "Sid": "Describe",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

10.0.10.106/32 は作成した Windows Server のプライベート IP アドレスです。
この権限を付与した IAM ユーザーのアクセスキーを発行し、aws configure で手元の端末に設定しておきます。

Windows Server に RDP 接続する

準備ができたので、作成した Windows Server に RDP 接続します。

① Windows Server のパスワードを発行しておく

RDP を使用した Windows インスタンスへの接続 を参考に、Windows Server のパスワードを発行しておきます。キーペアを使用してパスワードを発行したらメモしておきましょう。

② AWS CLI コマンドで Websocket トンネルを張る

手元の端末で以下構文のコマンドを実行し、Websocket トンネルを張ります。

aws ec2-instance-connect open-tunnel

手元の端末のコマンドプロンプトで実行したコマンド

aws ec2-instance-connect open-tunnel ^
    --instance-id i-008b893fce3cdcf5b ^
    --remote-port 3389 ^
    --local-port 13389

実行結果

C:\Users\kitani.emi>aws ec2-instance-connect open-tunnel ^
More?     --instance-id i-008b893fce3cdcf5b ^
More?     --remote-port 3389 ^
More?     --local-port 13389
Listening for connections on port 13389.

--remote-port は RDP の 3389 番ポートを指定し、--local-port には任意のポートを設定します。今回は 13389 を指定しています。
コマンドが成功すると Listening for connections on port 13389. と表示され、指定されたポート番号(今回は 13389)で他のコンピューターやプロセスからの接続を待機している状態になります。
コマンドプロンプトはこの状態で開いたままにしておきます。

③ Windows Server に RDP 接続する

コマンドプロンプトは Listening for connections on port 13389. の状態で開いたまま、Windows Server に RDP 接続します。
接続情報は以下です。

項目 設定値
コンピューター localhost:13389
ユーザー名 Administrator

パスワードを求められるので、先ほどキーペアを使って複合しておいたパスワードを入力します。

証明書エラーは「はい」をクリックして続行します。

Windows Server 2022 に RDP 接続できました。

終わりに

手元の端末に AWS CLI を導入しアクセスキーを設定する必要があり、SSM のポートフォワード機能に似ている感じがしました。
本アップデートに関して既に多くのブログが公開されていますので、あわせて参照ください。

EC2 Instance Connect エンドポイント登場!パブリックIPのないEC2にSSH・RDPできるようになりました

[アップデート]パブリック IP アドレスなしで、EC2インスタンスにSSH接続できる EC2 Instance Connect Endpointがリリースしました

EC2 Instance Connect Endpoint と Session Managerの違いをまとめてみた

EC2 Instance Connect Endpoint経由でRDSに接続してみた

AWS CLIの実装からEC2 Instance Connect Endpointを読み解いてみた

EC2 Instance Connect Endpoint経由でWindows ServerにRDP接続してみた

参考