【初心者】AWS Systems Manager Session Manager を使ってみる

# 目的
- 今までインスタンスに接続するのにレガシーにTeratermでssh接続していたが、心を入れ替えて、セキュアにSesson Managerを使うように変えていこうかなと思い、使い方を確認する。

# AWS Systems Manager Session Manager とは（自分の理解）
- AWS Systems Managerの中の一機能で、sshをせずに、AWSの機能としてLinuxにシェルアクセス(WindowsにはPowerShell)できる。

# やったこと
- 以下の環境のEC2インスタンス(Amazon linux 2)へSession Managerを用いて接続できることを確認する。
    - インターネット接続あり(IGW/EIP, NatGateway)
    - インターネット接続なし(VPCエンドポイント)
- 接続のログが取れることを確認する。

# 構成図

![ssm構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/87b46cfe-1db5-9a09-546d-51145182b8f1.png)

# 予習
- 公式ドキュメント等を見て、Session ManagerでEC2インスタンスにアクセスするには何が必要なのかを予習する。
    - 公式ドキュメント：　[「Systems Manager を使用してインターネットアクセスなしでプライベート EC2 インスタンスを管理できるように、VPC エンドポイントを作成するにはどうすればよいですか?」](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/)
    - Developers.IO記事：　[「プライベートサブネットにあるEC2インスタンスを Systems Manager で管理する」](https://dev.classmethod.jp/articles/tsnote-private-ec2-ssm-vpc-endpoint/)

- 以下の3つの条件が必要と理解した。
    - 条件1: インスタンスにSSM Agentがインストールされ起動していること。
    - 条件2: 対象のEC2インスタンスに適切なIAM Roleが付与されていること。
    - 条件3: VPCの外にあるSSM用のAPIと通信できること。

# 手順
## 環境準備
- VPC/Subnet の作成
    - 構成図のVPC(2個)/Subnet(3個)を作成する。
    - IGWを作成しVPC1にアタッチする。
- インスタンスの作成
    - 構成図の通り4つのインスタンス(mksamba-ssm01～04)を作成する。今回は全てAmazon Linux 2を使用(SSM Agentがプリインストールされているため)。

## Session Manager 利用の準備
- 条件1(SSM Agent起動)
    - Amazon Linux 2の場合、プリインストールされているので追加は不要。一応動作確認を行う。（状態がActiveになっていることを確認する。）
     
```
[ec2-user@ip-10-0-0-220 ~]$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
   Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-07-18 15:21:24 UTC; 18min ago
 Main PID: 3251 (amazon-ssm-agen)
   CGroup: /system.slice/amazon-ssm-agent.service
           mq3251 /usr/bin/amazon-ssm-agent
```
- 条件2(適切なIAM Roleの付与)
    - Session Managerを使用するために必要とされる権限「AmazonSSMManagedInstanceCore」を含むIAM Role「mksamba_AmazonSSMManagedInstanceCore」を作成し、4つのインスタンスに割り当てる。

![ssm01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4d22a03c-f123-77fd-a5f9-752adcc92623.png)

- 条件3(VPC外のSSM用のAPIとの疎通)
    - IGWによる外部接続
        - インスタンス(mksamba-ssm01)にEIPを割り当てる。(比較のため、同じsubnetのインスタンス(mksamba-ssm02)にはEIPを割り当てない)
    - NatGatewayによる外部接続
        - NatGatewayを作成し、インスタンス(mksamba-ssm03)が所属するsubnetのRoutetableにNatGatewayへの経路を設定する。
    - VPCエンドポイントによる接続
        - 以下の3つのエンドポイントを作成し、エンドポイントの作成先としてインスタンス(mksamba-ssm04)が所属するsubnetを指定する。
            - com.amazonaws.ap-northeast-1.ssm
            - com.amazonaws.ap-northeast-1.ec2messages
            - com.amazonaws.ap-northeast-1.ssmmessages

![ssm04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b1cc0c51-cfd9-580f-42d1-235e261b51a7.png)

## 接続確認
- 「AWS Systems Manager」 - 「インスタンスとノード」 - 「マネージドインスタンス」　のメニューを開き、対象のインスタンスが「マネージドインスタンス」として表示されていることを確認する。
- インスタンスssm01(IGW/EIPあり)、ssm03(NatGateway)、ssm04(VPCエンドポイント)は経路があるので管理対象として表示されている。ssm02(IGW/EIPなし)は経路がないので表示されない。

![ssm05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e3a43c76-e32d-e740-0953-bac9876e350b.png)

- 上記の画面からインスタンスを選択し、「アクション」- 「Start Session」を選択し、ブラウザから接続する。sshして接続するのと同様にコマンド実行することができる。ローカルPCとのテキストのコピーペーストも可能。

![ssm06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ec6e5626-56d9-6e60-0977-16ce593c1573.png)

## ログの確認
- 接続の概要(接続したIAMユーザ, 接続先インスタンス、時刻)についてはマネージメントコンソールで確認可能。

![ssm09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4cf57303-c8a0-9837-e4ca-88d9f6ad21a3.png)

- 接続してどんなコマンドを打ったのかの詳細をS3バケットやCloudWatch Logsに出力可能。そのためには以下の追加設定(3点)が必要。
    - Roleへの権限追加
        - インスタンスに付与しているRole「mksamba_AmazonSSMManagedInstanceCore」にS3バケット及びCloudWatchLogsへのアクセス権を追加する。（今回は検証なので「S3FullAccess」「CloudWatchLogsFullAccess」を追加。本来は必要最小限に）
    - S3エンドポイントの追加
        - インターネット接続がない場合(今回はインスタンスssm04)はS3エンドポイントの追加が必要。
        - VPCエンドポイント「com.amazonaws.ap-northeast-1.s3」を追加する。 

    - セッションマネージャーでのログ出力の設定
        - 「AWS Systems Manager」 - 「インスタンスとノード」 - 「セッションマネージャー」-「設定」にて、セッションのログをS3バケット及びCloudWatch Logsに出力する設定を追加する。(S3はバケット、CloudWatch Logsはロググループを指定)
       
![ssm10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1d932c95-3a46-b5e5-46a2-43fa8e57b686.png)

- S3バケットの中にセッション毎にログファイルが作成される。各ファイルの中に実施したコマンドが保存される。

![ssm11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/9000ae46-4275-d62d-b56e-8e905b5fa5f0.png)

``` S3のログファイル(IAMユーザ-セッションID.log)
Script started on 2020-09-02 07:06:54+0000
sh-4.2$ 
sh-4.2$ date
Wed Sep  2 07:06:51 UTC 2020
sh-4.2$ pwd
/usr/bin
sh-4.2$ exit
exit
Script done on 2020-09-02 07:06:54+0000
```

- CloudWatch Logsでも同様にセッション毎にログが保存される。

![ssm12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/fa09dbe5-bd99-dcb5-fe49-525da75e51c5.png)


# 所感
- 慣れればそんなに面倒ではないのかも、、