ec2のssm導入時にはまったポイント

# これは何？
ec2のssmを有効化して，AWSコンソールのセッションマネージャから接続できるようにしようとしました。その際に設定ではまったポイントです。ec2インスタンスがセッションマネージャのリストに出てこず，切り分けと対処に手こずりました。（将来の自分への備忘録）

# ssm(system manager agent）とは何？
ssmを設定しておくと，AWSコンソールからec2のシェルにログイン（つまりブラウザだけでログイン）できるようになります。踏み台サーバを準備したり，sshのポートを開放しなくて済むメリットがあります。その他にもパッチの管理など，ec2インスタンスを管理するいろいろな機能があるようです。

# 一般的な導入手順（ec2インスタンスをパブリックサブネット配置する場合）
- ec2インスタンスでssm agentを有効化する（Amazonlinux2023など，おおよそのAMIはデプロイした時点で有効になっているようです）
- ec2インスタンスに，IAMロール（AmazonSSMManagedInstanceCore）をアタッチする。
（詳細は参考文献のリンク参照）

# 一般的な導入手順（ec2インスタンスをプライベートサブネット配置する場合）
- ec2インスタンスでssm agentを有効化する（Amazonlinux2023など，おおよそのAMIはデプロイ時点で有効になっているようです）。
- ec2インスタンスに，IAMロール（AmazonSSMManagedInstanceCoreを含むポリシー）をアタッチする。
- プライベートサブネット上にVPCエンドポイントを三つ作成する(ssm,ssmmessages,ec2messages)。
（詳細は参考文献のリンク参照）

# はまったポイント
## 発生した事象
- AWSコンソールのセッションマネージャから，プライベートサブネット設置のec2インスタンスが見えない。
## 切り分けの結果
- ec2インスタンスが，ssmサーバ(?)と通信できていない。(ssm-cliの結果より）
## 原因
- VPCエンドポイントを作成した際に複数サブネットで有効化していたが，他サブネットのec2インスタンスからVPCエンドポイントのIPアドレスに疎通できていなかった。
- セキュリティグループで，他のサブネットからのTCP/443を許可していなかった。
## 対処
- セキュリティグループで，他のサブネットからのTCP/443を許可した。

# 切り分けの方法
シェルが使えるならssm-agentの状態を見る。

## systemctlコマンド。ssm-agentの起動状態確認
```
$ sudo systemctl status amazon-ssm-agent.service
● amazon-ssm-agent.service - amazon-ssm-agent
     Loaded: loaded (/etc/systemd/system/amazon-ssm-agent.service; enabled; preset: enabled)
     Active: active (running) since Sun 2023-09-10 11:33:12 UTC; 14min ago
   Main PID: 5917 (amazon-ssm-agen)
      Tasks: 26 (limit: 510)
     Memory: 162.0M
        CPU: 1.144s
     CGroup: /system.slice/amazon-ssm-agent.service
             ├─4425 /usr/bin/ssm-session-worker root-************************
             ├─4446 sh
             ├─4447 bash
             ├─5917 /usr/bin/amazon-ssm-agent
             └─5978 /usr/bin/ssm-agent-worker

```

## ssm-cliコマンド
ec2インスタンスが，ssmサーバ(?)とかVPCエンドポイントと疎通できているか確認できる。
VPCエンドポイント(ssm，ec2messages，ssmmessages）と通信できていない場合には，当該の箇所がfailedとかunreachableと表示される。以下の結果は，正常動作の場合。
```
$ sudo ssm-cli get-diagnostics
{
  "DiagnosticsOutput": [
    {
      "Check": "EC2 IMDS",
      "Status": "Success",
      "Note": "IMDS is accessible and has instance id i-******************* in region us-east-1"
    },
    {
      "Check": "Hybrid instance registration",
      "Status": "Skipped",
      "Note": "Instance does not have hybrid registration"
    },
    {
      "Check": "Connectivity to ssm endpoint",
      "Status": "Success",　★
      "Note": "ssm.us-east-1.amazonaws.com is reachable"
    },
    {
      "Check": "Connectivity to ec2messages endpoint",
      "Status": "Success",　★
      "Note": "ec2messages.us-east-1.amazonaws.com is reachable"
    },
    {
      "Check": "Connectivity to ssmmessages endpoint",
      "Status": "Success",　★
      "Note": "ssmmessages.us-east-1.amazonaws.com is reachable"
    },
    {
      "Check": "Connectivity to s3 endpoint",
      "Status": "Success",
      "Note": "s3.us-east-1.amazonaws.com is reachable"
    },
    {
      "Check": "Connectivity to kms endpoint",
      "Status": "Success",
      "Note": "kms.us-east-1.amazonaws.com is reachable"
    },
    {
      "Check": "Connectivity to logs endpoint",
      "Status": "Success",
      "Note": "logs.us-east-1.amazonaws.com is reachable"
    },
    {
      "Check": "Connectivity to monitoring endpoint",
      "Status": "Success",
      "Note": "monitoring.us-east-1.amazonaws.com is reachable"
    },
    {
      "Check": "AWS Credentials",
      "Status": "Success",
      "Note": "Credentials are for arn:aws:sts::***************:assumed-role/AmazonSSMManagedInstanceCore/i-************* and will expire at 2023-09-10 18:08:24 +0000 UTC"
    },
    {
      "Check": "Agent service",
      "Status": "Success",
      "Note": "Agent service is running and is running as expected user"
    },
    {
      "Check": "Proxy configuration",
      "Status": "Skipped",
      "Note": "No proxy configuration detected"
    },
    {
      "Check": "SSM Agent version",
      "Status": "Success",
      "Note": "SSM Agent version is 3.2.1542.0 which is the latest version"
    }
  ]
}
```

# 切り分けのポイント
- VPCエンドポイントの実態はサブネットにAWSが設置するホストで，他のAWSサービス宛てのリバプロのようなものだと理解するとよい。IPアドレスを持ち，TCP/443でlistenする。
- ssm agentは，VPCエンドポイントに対してTCP/443でコネクションを接続する。

# 何を理解していればハマらなかったのか
- VPCエンドポイントにもセキュリティグループが適用されることを理解しておけばよかった。

# 参考文献
- [パブリックサブネット配置のec2インスタンスにおける設定方法](https://dev.classmethod.jp/articles/ec2-access-with-session-manager/)
- [プライベートサブネット配置のec2インスタンスにおける設定方法](https://dev.classmethod.jp/articles/terraform-session-manager-linux-ec2-vpcendpoint/)