はじめに
AWSのVPC内にあるWindowsインスタンスにローカルPCからSSM PortforwardをしようとしたらコマンドとIAMポリシーにつまづいたので記録として残しておきます。
環境
接続先はVPC内Windowsサーバ(3389のRDPポートにつなぎたい)
接続元OSはWindows
Windowsサーバには適切なIAMロール(AmazonSSMManagedInstanceCore)とNetwork設定、SSMAgentがインストールされている前提です。
AWS CLIのコマンド
ドキュメント等を参考にコマンドを用意したが以下はNG
(コマンドプロンプトかpowershellからはNG)
aws ssm start-session --target i-xxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["3389"],"localPortNumber":["50001"]}' --region ap-northeast-1
コマンドプロンプトかpowershellでは以下がOKのコマンド。
--parametersの括弧内のダブルクォーテーションをエスケープする必要がありました。
aws ssm start-session --target i-xxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters="{\"portNumber\":[\"3389\"],\"localPortNumber\":[\"50001\"]}" --region ap-northeast-1
上記コマンドが通った後、ローカルPCからRDPクライアントでlocalhost:50001に接続することになります。
ローカルPCへ入れるクレデンシャルのIAMポリシー
AWS CLIを利用してSSMポートフォワードするには、
ローカルPCへはIAMユーザを作成しクレデンシャルを登録する必要があります。
ポートフォワード先を制限したいときのIAMポリシー例を以下に残しておきます。
※arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSessionにはAWSアカウント番号を入れないのがポイントのようです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:ap-northeast-1:99999999:instance/i-XXXXXXXXXXXX",
"arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:TerminateSession",
"ssm:ResumeSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:username}-*"
]
}
]
}
99999999は自身のAWSアカウント番号に置き換えて下さい。
i-XXXXXXXXXXXXは接続したい(それだけに絞りたい)インスタンスIDに置き換えてください。