AWS SSMでプライベートサブネットのAmazon EC2(Windows OS)へリモートアクセスする

AWSの本番環境でプライベートサブネットにEC2インスタンスにRDPしたいという場面は結構あると思います。社内環境で利用するサーバなので、インターネットからアクセスできる状態はよろしくないので、プライベートサブネットで構築しているというパターンです。メンテナンスなどでサーバにログインしたいときによくあるパターンは踏み台サーバを別パブリックサブネットに構築して、踏み台経由でのアクセスというケースですが、そもそも踏み台サーバ分の料金が...とか、踏み台サーバの管理って誰がするの...とかの悩みが尽きないと思います。そんなときに便利なAWS System Manager（SSM）を使ったリモートデスクトップ接続をお試ししたいと思います。


# 今回のゴール
![SSM＿概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/aa504cd5-9229-8e34-c140-d254e1812d1c.png)

こんな感じで、プライベートサブネットにデプロイしたEC2にSSM経由でリモートデスクトップ接続できることが目標です。
踏み台サーバなしで、直接PCからプライベートサブネットのEC2にアクセスできますので、シンプルかつ踏み台サーバない分料金がお安く済みます。


# 前提条件

- EC2はWindows OSで構築する
- セキュリティグループはユーザPCからRDPできるように必要なポートを解放しておく
- ユーザPCにはAWS CLI をインストールしておく
- 利用するリージョンは東京

# 構築手順
①プライベートサブネットへEC2のデプロイ
②EC2をデプロイしたVPCにSSMと接続できるエンドポイントを構築
③EC2がSSM と接続できるようにロールを作成、適用し、SSM コンソール画面のマネージドインスタンスに該当EC2が表示されるようにする
④AWS CLIを利用するIAM ユーザを作成し、IDとシークレットキーを発行して、SSM用のロールをアタッチする
⑤ユーザPCからAWS CLI でコマンド実行し、SSM経由でセッションを張る
⑥Windows のリモートデスクトップ接続でEC2へ接続

# やってみる
①についてはいつものように割愛します。とりあえずWindows OSのEC2をデプロイできればＯＫです。
②ですがVPCのコンソールで[エンドポイント]から作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/46ef9d08-75f3-b61f-a5b8-788b919bff7a.png)

以下のように[エンドポイントの作成]を選択して、[サービスカテゴリ]から[AWSサービス]を選択し以下３つのサービスを選択して、エンドポイントを作成します。
"com.amazonaws.ap-northeast-1.ec2"、
"com.amazonaws.ap-northeast-1.ec2messages"
"com.amazonaws.ap-northeast-1.ssm"

### 2023年6月追記
プライベートサブネットからSSMで通信するために作成するエンドポイントですが、”com.amazonaws.ap-northeast-1.ssmmessages”も必要でしたでの修正です。

![エンドポイント作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/0929a62f-f500-601b-fcb9-1e8bddf23db5.png)
作成後、しばらくしてステータスが「利用可能」になればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/16f084d8-aa22-c096-af07-21262a407ad3.png)



続いて③ですがEC2用にまずロールを作成します。必要なポリシーは"AmazonSSMManagedInstanceCore"です。
![EC2_role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/27c71844-7d35-8150-d3c5-1bc233fdce64.png)
とりあえずこのポリシーがアタッチされたロールを作成し、以下のようにEC2へアタッチします。
![IAM_role_attch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7d83dfd9-2fdd-9de6-b1e1-3e6e107f452b.png)

ポリシーアタッチ後、数分後にSSM コンソール画面の[マネージドインスタンス]にアクセスし、該当EC2の[Pingの状態]が以下のようにオンラインになっていることを確認します。
オンラインになっていない場合は下記原因が考えられます。
 
![マネージドinstance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/94b6b34b-8a46-0e2d-09be-2c6109eb713c.png)

【想定される原因】
 - VPCのDNS設定（DHCPオプション）がおかしい
 - ②で作成したSSM向けのエンドポイントがおかしい
 - EC2用のIAMロールが正しくアタッチされていないか、ロールのポリシーが正しくない
 - デプロイしたEC2 でSSMエージェントが起動していない

④ですがIAMユーザを作成し、CSVファイルなどでusercredential（ID/secret key）をDLして保存しておいてください。作成したIAMユーザに対して、SSMへ接続できるようにロール作成し、アタッチしていきます。
とりあえず今回ポリシーは"SSMFullAccess"にしておきます。
※FullAccessまではなくてもいいのですけどね...
![SSM_IAM_role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/62c9bac6-8ea4-4eef-73cb-bb25e8d8b861.png)
今回はSSMでリモートデスクトップ接続のセッションを張るだけでなく、AWS CLI でEC2の起動もやっていたので、"AmazonEC2FullAccess"もアタッチされていますが、起動しているならこちらはなくてもOKです。

⑤ですがAWS CLI がインストールされたPCからコマンド入力して、セッションを張っていきます。
AWS CLI のインストールは[AWS 公式インストールガイド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html)からインストールしておいてください。
AWS CLI をインストールすると[C:\Users\”ユーザ"\.aws] にフォルダが作成され、その中の「credentials」というファイルにAWS CLIを動作させるIAM ユーザの情報が書き込まれています。

    # credentials の中身
    [default]
    aws_access_key_id = XXXX
    aws_secret_access_key = XXXXX

このcredentials のidとkey のところを④でDLしておいてたIAMユーザのものに書き換えておきます。

ちなみに同じフォルダにconfig というファイルも作成され、こちらには動作させる環境が記述されています。

    # configの中身
    [default]
    region = ap-northeast-1
    output = json

準備ができたらAWS CLIが正しくインストールされているかPCでコマンドプロンプトを立ち上げて以下コマンドで確認します。

    #AWS CLIが正しくインストールされているか確認
    aws --version

出力に以下のように表示されていれば、正しくインストールされています。

    aws-cli/2.1.26 Python/3.7.9 Windows/10 exe/AMD64 prompt/off

続いてAWS CLI の設定が正しくされているを確認します。以下コマンドを入力します。

    aws configure

以下のように表示されていれば設定OKです。

    AWS Access Key ID [****************GR4Y]:   -->④で作成したIAMユーザのID
    AWS Secret Access Key [****************abKl]:  -->④で作成したIAMユーザのsecret key
    Default region name [ap-northeast-1]:
    Default output format [json]:    

続いてEC2が起動していなければAWS CLIからEC2を起動します。

    aws ec2 start-instances --instance-ids "インスタンスID" 

以下のように表示されてば正常に起動しています。

    {
    "StartingInstances": [
        {
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "InstanceId": "インスタンスID",
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        }
    ]
    }

では起動したEC2に対して、SSMでセッションを張っていきます。

    aws ssm start-session --target インスタンスID --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=13389"

以下のように表示されればセッションは正常に構築されています。

    Starting session with SessionId: SSM_access-xxxxxxxxxxxxx
    Port 13389 opened for sessionId SSM_access-xxxxxxxxxx
    Waiting for connections...

最後にリモートデスクトップ接続できるか確認になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5250f9d8-3fbf-58c6-0d7c-fd3a440044ae.png)

アクセス先は[localhost:13389]にして、ユーザ名とPWを入力します。
これでリモートデスクトップ接続できればＯＫです。

リモートデスクトップ接続を終了するときにはコマンドプロンプトで[Ctrl]+[c]でコマンドを終了させましょう。リモートデスクトップ接続中に[Ctrl]+[c]してしまうとセッションが切れるため、リモートデスクトップ接続も切れてしまいます。

# おまけ
マネージドインスタンスに表示されること= SSMでアクセスできる ということになります。
"マネージドインスタンスに表示される"状態にするために、ロールを作ったり、ポリシーをアタッチしたりしましたが実はもっと簡単に設定する方法があります、それが[高速セットアップ]です。

###高速セットアップについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/f5e3d3a5-1e6a-f099-7b99-b63fb27d514e.png)
SSMコンソール画面の一番上に表示されている[高速セットアップ]を選択し、どのリージョンかを選択すれば、そのリージョン内のSSMエージェントインストール済みEC2に自動的にロールをアタッチして、マネージドインスタンスに表示されるようにしてくれるみたいです。
※エンドポイントは要自力作成

### SSMを使ったEC2の操作
今回構築しているリモートデスクトップ接続だけなく他にもSSMを使えば色々ことができます。
何個か参考までにご紹介します。
##### Windows Update
サーバにログインして、コントロールパネルからWindows Update クリックしなくてもできます。
[Run Command]を選択し、コマンドドキュメントからAWS-InstallWindowsUpdate を選択して、該当インスタンスをターゲットにしてやるだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/121e7898-9a7e-7d18-5838-f0920f1dd843.png)


結果もこんな感じで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/cd670c72-82c2-e015-8014-9a5f74942db1.png)

##### サーバのイベントログの収集やレジストリの管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/d10db362-b256-507f-3d7b-7f3726ee7006.png)

ちょっとした確認ならリモートデスクトップ接続しなくても出来ちゃいます！

# 参考にしたサイト
https://business.ntt-east.co.jp/content/cloudsolution/column-try-27.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/