今回は久しぶりにAWSについてのお話です。
Problem
VPC内でWindowsServerが稼働中。
当該サーバーにリモートデスクトップ接続したいが、プライベートサブネット内にある上、仮にこれをパブリックサブネット内に移したとしてもインターネット経由の接続は組織のポリシーで禁止。
AWSCLIとIAMユーザー・アクセスキーを使用したリモートデスクトップ接続の手法はあるが、アクセスキーの作成も組織のポリシーで禁止。
Solution
AWS管理コンソールからフリートマネージャー(Fleet Manager)でリモートデスクトップ接続する。
ポイント
- WindowsServerが起動するEC2インスタンスには
AmazonSSMManagedInstanceCore
許可ポリシーを含むIAMロールをアタッチ - 3つのVPCエンドポイント
com.amazonaws.[region].ssm
・com.amazonaws.[region].ssmmessages
・com.amazonaws.[region].ec2messages
を作成 - EC2インスタンスとVPCエンドポイントの間でHTTPS(ポート443)の通信が可能になるようセキュリティグループを設定
- インスタンスのキーペアを使いAWS管理コンソールからフリートマネージャー(Fleet Manager)で接続
今回はEC2インスタンスを起動するにあたってWindowsServer2022のAMIを使用しているのでSSM Agentが初期インストールされていますが、OSバージョン/エディションによってはユーザー開発者自身でインストールしなくてはならないものもあるそうです。ご注意ください。
設定の例
まずは手順を説明するための例としてWindowsServerを起動します:
キーペアを作成。リモートデスクトップ接続時に必要になります:
VPCやサブネットに想定通りのものが選ばれているか確認しつつ(もちろん想定と異なっていたら設定変更)、「からのRDPトラフィックを許可」はOFFに:
ページ最下部右下の「インスタンスを起動」をクリック。
ここからがリモートデスクトップ接続のための設定手順。まずはWindowsServerのEC2インスタンスにアタッチするロールを作成します:
ユースケースとして「EC2 Role for AWS Systems Manager」を選択:
作成されるロールは AmazonSSMManagedInstanceCore
許可ポリシーを含み、以下の信頼関係を持つものになります(ec2.amazonaws.com
サービスによるAssumeRole
が可能なもの):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
続いて、VPCエンドポイントを作成していきます:
3つのエンドポイント ssm
・ssmmessages
・ec2messages
を作成します:
セキュリティグループについては今回は設定の手間を少なくするためにEC2インスタンス用に自動で作成されたものを流用することに・・・:
セキュリティグループのインバウンドルールに同じグループ内のIPアドレスからの接続を許可するルールを追加します。今回はEC2インスタンスとVPCエンドポイントを1つのグループに入れてしまっているのでソースには以下のように同じグループのIDを指定:
AWSの記事(前掲)にはEC2インスタンスにアタッチするセキュリティグループの設定に関して「[ソース] で、VPC CIDR を選択します」とありますが、何もそこまで広範囲で通信を許可する必要はないはず・・・ということで上記のような設定にしています。
SystemsManagerのメニューで「フリートマネージャー」をクリック。表示された「マネージドノード」の一覧にはセキュリティグループの設定後しばらく(数十秒から数分)するとEC2インスタンスが表示されるはずです:
フリートマネージャーの「ノードのアクション」→「接続」→「リモートデスクトップで接続」をクリック:
ここではキーペアを指定してログインをしていますが、「ユーザー認証情報」(ようするにユーザー名とパスワード)を使用してログインすることもできます。認証情報を使う場合はそれをまず入手してくる必要があり・・・ここではより簡単なキーペアを利用する方法をとりました。
あとは待っているとリモートデスクトップセッションが開始します:
VPCエンドポイントやセキュリティグループの設定が終わった後、フリートマネージャーから接続が可能になるまでに数十秒から数分の時間差があるようです。少なくとも私の場合はそうでした。
フロートマネージャーの「マネージドノード」一覧にEC2インスタンスが表示されなかったり、「ノードのアクション」からリモートデスクトップ接続を試みてもタイムアウトエラーになったり・・・
そうした時は設定内容はチェックしつつも、あれこれコロコロ設定変更して試すよりも「まずは数分待ってからリトライしてみる」というが良いかもしれません。