Windows端末からPrivate環境下のWindowsサーバにSSMポートフォワード経由でRDPする方法をまとめてみた

2020.12.13

どうも、コンサルティング部の後藤です。

タイトルから何番煎じだよ!って思われるかも知れませんが、普段SSMをあまり使用せずサーバにログインしている私がスゴイ便利と思ったのでやり方を自分なりにまとめてみました。

そもそも何するの?

ローカル環境(Windows)から外部接続を許可していないEC2(Windwos)に対してSSMポートフォワードを使用してRDP接続します。他にプロキシや踏み台が不要になるのですごく便利です。図にすると以下のような感じです。

ローカル環境設定

今回ローカル環境はWindowsを想定しています。

AWS CLI導入

コマンドプロンプト等でSSMのコマンドを発行する必要があるため、AWS CLIを導入します。

Windowsの場合、以下からmsiをダウンロードできます。ダウンロードしたら画面に従ってインストールを行います。

Windows での AWS CLI バージョン 2 のインストール、更新、アンインストール

Credentialの設定は後程実施します。

SSM Plugin導入

AWS CLIでSSMコマンド使用してインスタンスに接続するセッションを開始する際にはSession Manager pluginが必要になります。Pluginが無いとSessionManagerPlugin is not found.と怒られます。

Windowsの場合、以下からSetup.exeをダウンロードできます。ダウンロードしたら画面に従ってインストールを行います。

Windows に Session Manager plugin をインストールする

AWS環境設定

IAMユーザ作成

ローカル端末からAWS CLIを発行するため、SSMセッションが許可されたIAMユーザを発行してそのCredentialを使用する必要があります。

IAMユーザには最低限以下の権限を与える必要があります。

  • ssm:ResumeSession
  • ssm:DescribeSessions
  • ssm:TerminateSession
  • ssm:StartSession

EC2にIAMロール付与

接続先となるPrivate環境下のEC2にはSSM経由で接続するため、EC2に以下IAMポリシーを設定したIAMロールを付与する必要があります。

  • AmazonSSMManagedInstanceCore(AWS管理ポリシー)

VPCエンドポイント作成

SSM経由でPrivate通信するための出入り口であるVPCエンドポイントを作成します。SSMポートフォワードを行うためには、以下3つのエンドポイントを作成する必要があります。

  • com.amazonaws.ap-northeast-1.ssmmessages
  • com.amazonaws.ap-northeast-1.ec2messages
  • com.amazonaws.ap-northeast-1.ssm

また、それぞれにインバウンドルールでHTTPS 443、接続先となるPrivate環境下のEC2に接続出来るソースを設定したセキュリティグループを付与します。

私の場合、VPCエンドポイントに設定するセキュリティグループのソースにはEC2に付与されているセキュリティグループやSubnetのCIDRで許可しています。

アウトバウンドの設定は特に必要ありません。

実際に接続してみる

まず、コマンドプロンプト等でAWS CLIを発行できるようCredentialを設定します。

>aws configure
AWS Access Key ID [****************E2U6]:
AWS Secret Access Key [****************NV9D]:
Default region name [ap-northeast-1]:
Default output format :

AWS configureで設定されたファイルはC:\User\User_Name\.aws\配下に格納されています。

次にSSMコマンドを発行してポートフォワード可能なセッションを開始します。

ターゲットとなるInstanceID、LocalPortNumberは環境に合わせて変更して実行。以下のようにセッションIDが払い出されれば成功です。

>aws ssm start-session --target i-xxxxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters portNumber=3389,localPortNumber=11111

Starting session with SessionId: xxxxxxxxxxx
Port 33890 opened for sessionId xxxxxxxxxxx

リモートデスクトップでlocalhost:11111を指定。

PrivateIPアドレスのみのWindowsにRDP接続することが出来ました。

まとめ

如何だったでしょうか。すごく便利な機能なので様々な所でまとめられているので、今更感が否めませんが、普段からSSMを使用しない私にとっては非常に良い発見でした。まだ試した事が無い人やこれから設定する人のお役に立てば幸いです。