VPCエンドポイント経由でのSSMを用いたEC2への接続を図で整理する

# はじめに
プライベートサブネットに配置したEC2へ、VPCエンドポイント経由でセッションマネージャーを用いて接続する場合の構成を図でまとめました。

# 構成図
![EC2 SSM接続-構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/94c19563-6f28-8614-ce4d-41e738c6c174.png)

## ①EC2（SSMエージェント）からSystems Managerへの接続
SSMエージェントがインストールされたEC2インスタンスは、Systems Managerに接続を試みます。

* プライベートサブネット内からVPC外部（AWS内部ネットワーク）へ接続する経路としてVPCエンドポイントを作成しています。
* EC2には、Systems Manager接続のための権限（IAM Role）を割り当てる必要があります。
* EC2、およびVPCエンドポイントにはセキュリティグループを設定する必要があり、許可する通信を適切に設定する必要があります。

## ②クライアントからEC2への接続
ユーザーはAWSコンソール画面などのクライアントからセッションマネージャーを用いた接続を開始します。

# 接続できない場合の確認ポイント

セッションマネージャーを用いてEC2インスタンスへ接続できない場合、以下ポイントを確認しましょう。

1. EC2インスタンスにSSMエージェントはインストールされているか  
1. EC2インスタンスのIAMロールは適切か
1. VPCエンドポイントは作成しているか
1. EC2インスタンスのセキュリティグループでVPCエンドポイントへのアウトバウンドが許可されているか
1. VPCエンドポイントのセキュリティグループでEC2インスタンスからのインバウンドが許可されているか

![EC2 SSM接続-構成図_説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/0b4fed71-8349-32c3-ccc2-0f93f3b47e5e.png)

## 1. EC2インスタンスにSSMエージェントはインストールされているか
EC2インスタンスにSSMエージェントがインストールされていない場合は、インストールを行います。  
AWSマネージドのAMIであれば基本的にSSMエージェントはプリインストールされています。  
プリインストールされているAMIのリストは以下を参照ください。

https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html

## 2. EC2インスタンスのIAMロールは適切か
EC2インスタンスのIAMロールに`AmazonSSMManagedInstanceCore`ポリシーを追加します。  
その他のポリシーが不要な場合は、同ポリシーのみがセットされた同名のロールもAWSマネージドで用意されています。

![EC2 SSM接続-IAM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/5696ed99-2564-a46c-8041-f25d3b1ce23b.png)

## 3. VPCエンドポイントは作成しているか
EC2インスタンスがSystems Managerエンドポイントへ接続できるようにするため、以下のVPCエンドポイントが必要です。
* com.amazonaws.*region*.ssm
* com.amazonaws.*region*.ssmmessages

:::note
SSMエージェントのバージョンが3.3.40.0より前の場合、以下も必要です。  
* com.amazonaws.*region*.ec2messages

最新のAMIであれば基本的に3.3.40.0以降が入っているかと思います。  
　→Amazon Linux 2023 の2024/9/7時点の最新のAMI（`al2023-ami-2023.5.20240903.0-kernel-6.1-x86_64`）は3.3.380.0でした。
:::

## 4. EC2インスタンスのセキュリティグループにVPCエンドポイントへのアウトバウンドルールが設定されているか
EC2インスタンスに設定したセキュリティグループのアウトバウンドルールにおいて、VPCエンドポイントへのHTTPS（ポート443）が許可されている必要があります。

Interface型のVPCエンドポイントはENI（ネットワークインターフェース）が作成されるため、ENIのプライベートIPアドレスをEC2のセキュリティグループのアウトバウンドルールとして許可します。

![EC2 SSM接続-EC2セキュリティグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/f4a348ee-53cf-3da0-71fd-c4818c9229f0.png)

## 5. VPCエンドポイントのセキュリティグループでEC2インスタンスからのインバウンドが許可されているか
VPCエンドポイントに設定したセキュリティグループのインバウンドルールにおいて、EC2インスタンスからのHTTPS（ポート443）が許可されている必要があります。

![EC2 SSM接続-エンドポイントセキュリティグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/17dd4267-470d-b9b1-d5ff-4063c20bf29f.png)

## IPアドレスを表現した構成図
![EC2 SSM接続-構成図_IP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/a3c75516-62f5-fe3c-9991-404869e1ae4c.png)

## 接続失敗時のエラー
EC2からSystems Managerに接続できない時、EC2のAWSコンソール画面から接続する際には以下エラーが表示されます。
> インスタンスはセッションマネージャーに接続されていません。  
> セッションマネージャーを使用してインスタンスに接続するには、インスタンスがSystems Manager エンドポイントに接続できる必要があります。

![エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/67cfe390-0ca5-82f8-b447-2049681b9dc2.png)

以下エラーが表示される場合もあります（おそらくIAMロールが適切でないとき）
> SSMエージェントはオンラインではありません  
> SSMエージェントは Systems Manager エンドポイントに接続して自身をサービスに登録できませんでした。

![エラーiamなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/7a9ef877-2e7b-4777-5eda-5578c8a08eb4.png)

ちなみに、セッションマネージャーでの接続が成功している状態でセキュリティグループを編集して接続できない状態にしても、再起動をかけるまでは接続することができました。
EC2インスタンスからSystemsManagerへの接続（構成図の青矢印）は、インスタンス起動時に行われ、SSMエージェントがSystems Managerへ登録を行っているのだと思います。