図解で、もう踏み台要らずAWS SSM経由Windowsサーバーにリモートデスクトップ接続

# AWSなら、踏み台サーバー無しでWindowsサーバにRDP接続できるようになった。便利だけど、設定方法をすぐ忘れちゃうのでメモ。

### 今まで：
Linux 踏み台サーバーを経由して、AWS Windowsサーバーにリモートデスクトップ接続していた（RDP over SSH）

- メリット：使い慣れている。SSH鍵を所有する人だけがOSにログインできた
- デメリット：会社のHTTP/HTTPSプロキシ経由では、RDPがブロックされて接続できない

### これから：
AWS Systems Manager (SSM)のセッションマネージャー経由でEC2 Windowsサーバーにリモートデスクトップ接続したい。

- メリット：会社のHTTP/HTTPSプロキシ経由でも、クラウドのサーバーOSにSSHクライアントやRD接続でログインできるかも
- デメリット：AzureやIBM Cloudなどの他クラウドと異なるアクセス方法を運用することになる

## システム構成図
PCの[AWS CLI]とAWS管理ポータルの[SSM]を経由して、PCからWindowsサーバーにRD接続する。言い換えるとPCのWEBブラウザと同じhttps(443)でWindowsサーバーにリモートデスクトップ接続します。この時、VPCのセキュリティグループは全てのInboundを拒否しておいて構いません。
下図の赤丸番号ごとに手順を説明しています「図①の手順が(1)」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/69c6f415-fce4-09e4-f528-ad744cba50a8.png)

## (1) AWSコンソールでSSMを準備する
AWS管理コンソールのSystems Manager を有効にしたら、セッションマネージャーでRD接続するVMを選択する。クイックセットアップでまとめて設定できる。これ、設定してから［保留中］［成功］になるまで数十分かかるので、別の作業をしてから戻った方がいいみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/e7e80837-89d9-894d-dd33-118320250252.png)

対象のVM(EC2)に、IAMロール（AmazonSSMRoleForInstancesQuickSetup）を割り当てする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/74624228-94dd-3810-ce88-e85299628fb3.png)

## (2) EC2にSSMエージェントをインストールする
EC2をデプロイすると、AWSデフォルトでSSMエージェントがインストール済み。

- 対象：Windows Server 2016, 2019のAMIから作成した場合。
- 条件：System Manager エージェントのバージョン 2.3.672.0以上
- 　　　Session Manager プラグインのバージョン 1.1.26.0以上

## (3) 保守PC側の準備（AWS CLIをインストール）
AWS CLIをインストールして、"aws configure"を実行して以下のユーザ情報をPCに登録しておく
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/8b38d9e6-d150-9f4e-49ad-794f98a615c8.png)

```
PS C:\> aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: JSON
```

## (4) 保守PC側の準備（SSM用のプラグインを追加する）

インストーラーをダウンロードして実行
https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe

実行した時、ディレクトリの指定ができないので、自分でAWSコマンドと同じフォルダに複写するか、PATHを指定すること。

## (5) 保守PC側でポートフォワードを実行する
PowerShellでコマンドを実行する。--targetのi-xxxxは対象のインスタンスIDを書く。"\"は&yen;マークに置き換えてください。

```
PS C:\> aws ssm start-session --target i-0exxxxxxx4f --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=13389"

Starting session with SessionId: username-xxxxxxxxx
Port 13389 opened for sessionId username-xxxxxxxxx.
Connection accepted for session username-xxxxxxxxx.
```

### プロキシ経由でインターネットにアクセスする場合
もしも"Starting session with.."に続く"port 13389 opend"が表示されず、ローカルポートがListtenされない場合はプロキシ経由の設定が必要になります。
> https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-proxy-with-ssm-agent.html

▽プロキシ名とポート番号は入れ替えてください

```
PS C:\> set https_proxy=hoge.company.co.jp:port
PS C:\> aws ssm start-session --target i-0exxxxxxx4f --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=13389"
```

恒久的に使うなら下記ファイルに追加する
/etc/yum.conf

```
[main]
proxy=https://[proxy]:[port]
```

## (6) 保守PC側でリモートデスクトップ接続を実行
リモートデスクトップの接続先は自分PCのポート「localhost:13389」を指定する。OSログインのIDとパスワードは、AWS管理ポータルで取得するやつ。Windows標準の"リモートデスクトップ接続"そのものなので、[Ctrl+C][Ctrl+V]も実行可能（PCからサーバーに、クリップボード経由でファイルをアップロードできた）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/fc718870-1f95-bbb6-3db3-2a2d2cbc1f75.png)

## その他
- 対象サーバーがLinuxの場合も、SSM経由でSSH接続ができます（ここでは割愛）
- 保守用PC（クライアントVPN）からサブネットにVPN接続する方法もあるのか
- https://aws.amazon.com/jp/about-aws/whats-new/2019/05/aws-client-vpn-now-available-in-asia-pacific-mumbai-and-asia-pacific-tokyo-aws-regions/
- AWS管理コンソールのSystem Managerのセッションマネージャーから、WEBブラウザ経由でOSコマンドラインにもアクセス可。