プライベートサブネットにあるEC2にSSMで接続する方法

## 環境
- VPC作成済み
- プライベートサブネットにあるEC2作成済み
  - OS: Amazon Linux 2023

:::note warn
各VPCエンドポイントは、AZごとに課金されるため、基本料金 × AZ数 × エンドポイントの種類数になり、かなり高くなります。
本番環境や長時間稼働する環境では、事前にコストを見積もることを強くおすすめします。
:::

## 手順1：VPCでSSM接続に必要なDNS設定を確認
1. VPC管理画面 → VPC選択
2. 「DNS 解決」、「DNS ホスト名」が両方有効になっているか確認

### 両方有効になっていなかった場合
1. 「アクション」→「VPCの設定を編集」
2. 「DNS 解決」、「DNS ホスト名」の両方を有効化にして`保存`をクリック

## 手順2：VPCエンドポイントのセキュリティグループを作成
### 基本的な詳細
| 設定項目 | 入力内容 |
|:-----------|:------------|
| セキュリティグループ名 | `sample-vpc-endpoint-security-group` |
| 説明 | 使用目的などを入力 |
| VPC | 対象のVPC名 |

### インバウンドルール
| 設定項目 | 入力内容 |
|:-----------|:------------|
| タイプ | HTTPS |
| リソースタイプ | カスタム |
| ソース | EC2のセキュリティグループ |

### アウトバウンドルール
| 設定項目 | 入力内容 |
|:-----------|:------------|
| タイプ | すべてのトラフィック |
| 送信先タイプ | カスタム |
| 送信先 | 0.0.0.0/0 |

入力が完了しましたら、`セキュリティグループを作成`をクリックします

## 手順3：VPCエンドポイント作成
VPCエンドポイントのサービス
- `com.amazonaws.region.ssm`
- `com.amazonaws.region.ssmmessages`
- `com.amazonaws.region.ec2messages`

※ regionは`ap-northeast-1`などの使用しているリージョン名に置き換えてください

3つのVPCエンドポイントのサービスをつけるために合計3つのVPCエンドポイントを作成します。
下記はそのうちの1つです。

### エンドポイントの設定
| 設定項目 | 入力内容 |
|:-----------|:------------|
| 名前タグ | `sample-vpc-endpoint-ssm` |
| タイプ | AWSのサービス |

### サービス
| 設定項目 | 入力内容 |
|:-----------|:------------|
| サービス | com.amazonaws.region.ssm |

### ネットワークの設定
| 設定項目 | 入力内容 |
|:-----------|:------------|
| VPC | 対象のVPC名 |
| DNS名を有効化 | ON |
| DNS レコードの IP タイプ | IPv4 |

### サブネット
| 設定項目 | 入力内容 |
|:-----------|:------------|
| アベイラビリティーゾーン | EC2があるAZ |
| サブネットID | EC2があるサブネット |
| IPアドレスタイプ | IPv4 |

### セキュリティグループ
| 設定項目 | 入力内容 |
|:-----------|:------------|
| セキュリティグループ | `sample-vpc-endpoint-security-group` |

### ポリシー
| 設定項目 | 入力内容 |
|:-----------|:------------|
| ポリシー | カスタム |

```
{
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"ssm:*",
				"ssmmessages:*",
				"ec2messages:*"
			],
			"Resource": "*",
			"Condition": {
				"StringEquals": {
					"aws:SourceVpc": "vpc-xxxxxxxxxxxxxxxxx"
				}
			}
		}
	]
}
```
- `aws:SourceVpc`で対象のVPCだけ許可
- `Action`で必要な操作だけ許可
- `Resource`はさらに限定可能（ARNで絞る）

入力が完了しましたら、`エンドポイントを作成`をクリックします

## 手順4：EC2インスタンスからSSMセッションマネージャーに接続するためのIAMロールの作成
### 信頼されたエンティティを選択 
| 設定項目 | 入力内容 |
|:-----------|:------------|
| 信頼されたエンティティタイプ | AWSのサービス |
| ユースケース | EC2 |

入力が完了しましたら、`次へ`をクリックします

### 許可を追加
| 設定項目 | 入力内容 |
|:-----------|:------------|
| 許可ポリシー | AmazonSSMManagedInstanceCore |

入力が完了しましたら、`次へ`をクリックします

### 名前、確認、および作成
| 設定項目 | 入力内容 |
|:-----------|:------------|
| ロール名 | `sample-ec2-role` |
| 説明 | `Allows EC2 instances to call AWS services on your behalf.` |

入力が完了しましたら、`ロールを作成`をクリックします

## 手順5：EC2のIAMロールを変更
EC2管理画面 → インスタンス選択 → 「アクション」→「セキュリティ」→「IAM ロールの変更」
| 設定項目 | 入力内容 |
|:-----------|:------------|
| IAMロール | `sample-ec2-role` |

入力が完了しましたら、`IAM ロールの更新`をクリックします

## 手順6：SystemsManager Agent（SSM Agent）のインストール確認
EC2インスタンスに接続し、SSM Agentがインストールされているかを確認します
```bash
$ dnf info amazon-ssm-agent
Last metadata expiration check: 0:00:23 ago on Fri May 16 09:28:58 2025.
Installed Packages
Name         : amazon-ssm-agent
Version      : 3.3.1957.0
Release      : 1.amzn2023
Architecture : x86_64
Size         : 116 M
Source       : amazon-ssm-agent-3.3.1957.0-1.amzn2023.src.rpm
Repository   : @System
Summary      : Manage EC2 Instances using SSM APIs
URL          : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
License      : ASL 2.0
Description  : This package provides Amazon SSM Agent for managing EC2 Instances using SSM
             : APIs
```
`Installed Packages
Name         : amazon-ssm-agent`となっていることから、インストール済みであることがわかります

SSM Agentが起動しているか確認する
```bash
systemctl status amazon-ssm-agent
```
`Active: active (running)`起動していることがわかります

## 手順7：SSMを使ったEC2インスタンスへの接続確認
EC2管理画面 → インスタンス選択 → 「接続」→「セッションマネージャー」→「接続」
※SSMでの接続が可能になるまで、反映に時間がかかります

SSMから操作するユーザーは`ssm-user`です
```bash
$ whoami
ssm-user
```
EC2でローカル接続していて、設定やファイル作成を行っていた場合の場所`/home/ec2-user`
SSMの中で作業を行う場合、ルートユーザーになった方がスムーズに行えます
```bash
sudo su -
```

## まとめ
プライベートサブネット上のEC2インスタンスにSSMで接続するために、VPCエンドポイントやIAMロール、SSM Agentなど必要な設定を段階的に行いました。