Systems Manager のポートフォワーディングを利用してRDP接続でファイル転送する。
はじめに
皆様こんにちは、あかいけです。
あなたは Windows Server に RDP 接続でファイル転送したいと思ったことはありますか?
私は最近ありました。
というわけで今回は、
Systems Manager のポートフォワーディングを利用して RDP 接続でファイル転送する方法をまとめてみました。
モチベーション
プライベートサブネット上 Windows Windows Server にファイル転送する方法として、
一般的には以下の二種類が考えられます。
S3バケットを経由してファイル連携する
- 大まかな転送手順
- ローカル端末から S3 へファイルをアップロードする
- EC2 は S3 からファイルをダウンロードする
- 必要となる設定
- EC2 にてAWS CLIをダウンロード/設定する
- EC2 用のIAMロールの作成
- ファイル転送用の S3 バケットを作成する
ローカル端末から直接EC2へファイル連携する
- 大まかな転送手順
- ローカル端末から SSM セッションマネージャーでポートフォワードする
- ポートフォワードしたポートから RDP 接続してファイル連携する
- 必要となる設定
- EC2 用のIAMロールの作成、SSM Agent
- EC2 にてSSM Agentをダウンロード/設定する
- ローカル端末での AWS CLI、Session Manager プラグイン のインストールと設定
- ローカル端末用の IAM ユーザーの作成と作成
なお RDP 接続するだけならフリートマネージャーで問題ないのですが、
残念ながら現時点 (2025 年 8 月) において、 フリートマネージャーではファイル転送ができません…。
そのため前述のどちらかの方法でファイル転送する必要があるわけですね。
前提条件
- Windows Server が作成済みであり、SSM エージェントが利用できること
- マネジメントコンソールへログインでき、AWS リソースを作成する権限があること
AWS 側
今回は CloudShell で実行する前提で、
AWS CLI でローカル側から利用する IAM ユーザーと IAM ロールを作成してます。
また今回は、最小権限の IAM ユーザーから、 Systems Manager の権限を持った IAM ロールへスイッチロールする方式とします。
まずは各種リソースで使う環境変数を設定します。
それぞれの NAME はお好みの値を設定してください。
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
IAM_ROLE_POLICY_NAME="test-role-policy"
IAM_USER_POLICY_NAME="test-user-policy"
IAM_ROLE_NAME="test-role"
IAM_USER_NAME="test-user"
まずは各種ポリシーの内容をファイルとして作成します。
cat > trust-policy.json << EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::${ACCOUNT_ID}:user/${IAM_USER_NAME}"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
cat > ssm-session-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnableSSMSession",
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ssm:*:*:document/AWS-StartPortForwardingSession",
"arn:aws:ssm:*:*:document/SSM-SessionManagerRunShell"
]
},
{
"Sid": "EnableSSMTerminate",
"Effect": "Allow",
"Action": [
"ssm:TerminateSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/*"
]
}
]
}
EOF
cat > assume-role-policy.json << EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "arn:aws:iam::${ACCOUNT_ID}:role/${IAM_ROLE_NAME}"
}
]
}
EOF
次に IAM ポリシーを作成します。
aws iam create-policy \
--policy-name ${IAM_ROLE_POLICY_NAME} \
--policy-document file://ssm-session-policy.json
aws iam create-policy \
--policy-name ${IAM_USER_POLICY_NAME} \
--policy-document file://assume-role-policy.json
次に IAM ユーザーと IAM ロールを作成します。
aws iam create-user --user-name ${IAM_USER_NAME}
aws iam create-role \
--role-name ${IAM_ROLE_NAME} \
--assume-role-policy-document file://trust-policy.json
次に IAM ポリシーを IAM ユーザーと IAM ロールにアタッチします。
aws iam attach-role-policy \
--role-name ${IAM_ROLE_NAME} \
--policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${IAM_ROLE_POLICY_NAME}
aws iam attach-user-policy \
--user-name ${IAM_USER_NAME} \
--policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${IAM_USER_POLICY_NAME}
最後に IAM ユーザーのアクセスキーを作成します。
aws iam create-access-key --user-name ${IAM_USER_NAME}
コマンドの実行結果として以下のような出力がされるので、
AccessKeyId
と SecretAccessKey
をメモしておきます。
{
"AccessKey": {
"UserName": "test-user",
"AccessKeyId": "AKIAXXXXXXXXXXXXXXXXXXXXX",
"Status": "Active",
"SecretAccessKey": "YYYYYYYYYYYYYYYYYYYYYYYYYY",
"CreateDate": "2025-08-21T14:51:01+00:00"
}
}
なお本来であれば IAM ユーザーを利用する際は MFA 認証の利用が推奨されますが、
今回は本筋から逸れるので設定していません。
本番環境で利用する際は必ず MFA 認証を設定しましょう。
ローカル側
次はローカル側の作業です。
今回はローカル側の端末も Windows を使っています。
AWS CLI インストール
以下ドキュメントに従って AWS CLI をインストールします。
ドキュメント通りですが以下 URL へアクセスして インストーラをダウンロードして、
https://awscli.amazonaws.com/AWSCLIV2.msi
あとはインストーラを起動して案内にそってインストールするだけです。
インストール後、PowerShell を起動して以下のコマンドを実行して、
バージョンが表示されればインストールできています。
> aws --version
aws-cli/2.28.14 Python/3.13.4 Windows/11 exe/AMD64
次に AWS CLI の設定をします。
credentials の方には IAM ユーザーのアクセスキーとシークレットアクセスキーを設定します。
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYY
config の方には IAM ロールへスイッチロールする設定をします。
お好みのプロファイル名と、作成した IAM ロールの ARN を設定してください。
[default]
region = ap-northeast-1
output = json
[profile <profile-name>]
role_arn = arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>
source_profile = default
以下のコマンドを実行して、正常に実行できればスイッチロールできています。
> aws sts get-caller-identity --profile start-session
{
"UserId": "XXXXXXXXXXXXXXXXXXXXXXXX:botocore-session-XXXXXXXXXX",
"Account": "XXXXXXXXXXXX",
"Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/test-role/botocore-session-XXXXXXXXXX"
}
Session Manager プラグイン インストール
以下ドキュメントに従って Session Manager プラグイン をインストールします。
ドキュメント通りですが以下 URL へアクセスして インストーラをダウンロードして、
https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe
あとはインストーラを起動して案内にそってインストールするだけです。
インストール後、PowerShell を起動して以下のコマンドを実行して、
バージョンが表示されればインストールできています。
> session-manager-plugin --version
1.2.707.0
接続する
では接続してみましょう。
RDP 接続とは関係ないですが、PowerShell へ接続する方法もご紹介します。
PowerShell
まずは PowerShell へ接続する方法です。
クライアント側で以下のオプションを指定して、コマンドを実行します。
- --target:接続対象の EC2 インスタンス ID
- --profile:config で設定したプロファイル名
> aws ssm start-session --target i-XXXXXXXXXXXXXXXXX --profile <profile-name>
問題なくコマンド実行できれば、以下のように PowerShell へ接続できます。
Starting session with SessionId: botocore-session-XXXXXXXXXX-XXXXXXXXXXXXXXXXX
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows
PS C:\Windows\system32> hostname
EC2AMAZ-QGRVCAD
RDP
次に本題の RDP です。
まずはマネジメントコンソールから、Windows の管理者パスワードを取得します
あとは以下ドキュメントに従って、RDP 接続します。
まずは以下コマンドでポートフォワーディングを設定します。
- --parameters
- portNumber:ポートフォワード先のポート番号
- localPortNumber:ポートフォワード元のポート (任意)
> aws ssm start-session --target i-xxxxxxxxxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=8888" --profile <profile-name>
実行後に以下のような出力がされれば OK です。
実行したままにしておきます。
Starting session with SessionId: botocore-session-XXXXXXXXXX-XXXXXXXXXXXXXXXX
Port 8888 opened for sessionId botocore-session-XXXXXXXXXX-XXXXXXXXXXXXXXXX
Waiting for connections...
次にリモートデスクトップ接続を開いて、全般のタブにて以下の情報を入力します。
- コンピューター(C):localhost:<ポートフォワード元のポート>
- ユーザー名:Administrator
次にローカルリソースのタブで、
「ローカルデバイスとリソース」の詳細をクリックします。
ドライブにて共有したいボリュームを選択して、「OK」 をクリックします。
ここまで設定したら、全般のタブから「接続」をクリックします。
(毎回設定するのは面倒なので、接続設定を保存するのをおすすめします)
あとはマネジメントコンソールで取得した Windows の管理者パスワードを入力して、
特に問題なければログインできます。
フォルダを開いてみると、先ほど指定したドライブが見えることが確認できるかと思います。
ここまでできれば、あとはこのドライブとファイル転送するだけです。
さいごに
以上、Systems Manager のポートフォワーディングを利用して RDP 接続でファイル転送する方法でした。
いつもは S3 経由でファイルを転送することが大半だったので、RDP でファイル転送する方法を知る良い機会になりました。
ただ個人的には正直ファイル転送するだけにしては面倒臭い作業かなと感じており、
早くフリートマネジャーでファイル転送ができるようになったら嬉しいですね…。