【やってみた】アカウント内のすべての EC2 インスタンスでデフォルトで AWS Systems Manager を有効にする機能が発表されました（デフォルトのホスト管理設定、DHMC）

2022/2/17 に、アカウント内のすべての EC2 インスタンスでデフォルトで AWS Systems Manager を有効にするという機能が発表されました。
この機能は **「デフォルトのホスト管理設定（Default Host Management Configuration、DHMC）」** と呼ぶそうです。

https://aws.amazon.com/about-aws/whats-new/2023/02/enable-aws-systems-manager-default-all-ec2-instances-account/


# デフォルトのホスト管理設定（DHMC）の概要
- Systems Manager で DHMC（デフォルトのホスト管理設定）という機能を特定のリージョンで有効にすると、有効にしたリージョン内のすべての EC2 インスタンスを Systems Manager のマネージドノードとして管理できる
- DHMC（デフォルトのホスト管理設定）はアカウント単位でアクセス許可を付与する
- Systems Manager を有効にするためにインスタンスプロファイル（IAM ロール）を設定する必要がなくなった
- 中国 (北京) リージョン・中国 (寧夏) リージョン以外の商用および AWS GovCloud (米国) リージョンで利用可能

## 有効にすると何ができるようになるか
EC2 インスタンスを Systems Manager マネージドノードとして管理するときと同じことができるようです。
- セッションマネージャーが使用できる
- パッチマネージャーを使用して、自動化された毎日のパッチスキャンを実行できる
- インベントリを使用して、インスタンスのビューを取得できる
- Fleet Manager を使用してインスタンスを追跡できる
- SSM エージェントを自動的に更新できる

# ドキュメント
まだ日本語が出ていないので英語で閲覧してください。

https://docs.aws.amazon.com/systems-manager/latest/userguide/managed-instances-default-host-management.html


# これまで Systems Manager で EC2 インスタンスを管理するために必要だったこと
これまで Systems Manager で EC2 インスタンスを管理するために以下の事前準備が必要でした。

**1. EC2 インスタンスに SSM エージェントがインストールされていること**
**2. IAM インスタンスプロファイル（IAM ロール）を EC2 インスタンスにアタッチする**
**3. EC2 インスタンスから Systems Manager への通信経路確保**

今回のアップデートで発表された機能を有効化すると、、**「2. IAM インスタンスプロファイル（IAM ロール）を EC2 インスタンスにアタッチする」が不要になった**そうです。

# やってみる

## 0. 前提条件
- EC2 インスタンスにインストールされる SSM エージェントはバージョン `3.2.582.0` 以降であること
- Instance Metadata Service バージョン 2 (IMDSv2) を使用していること
 
上記を満たした EC2 インスタンスすべてが自動的にマネージド インスタンスになります。
デフォルトのホスト管理設定は、Instance Metadata Service バージョン 1 をサポートしていません。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html#instance-metadata-transition-to-version-2

## 1. デフォルトで EC2 インスタンスを立ち上げておく（オプション）
DHMC（デフォルトのホスト管理設定）を有効化したあと既存の EC2 インスタンスがどうなるのか確かめたいので、DHMC（デフォルトのホスト管理設定）を有効化する前に EC2 インスタンスを立ち上げておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/c0aad155-6e5b-25e3-2778-c50c80806a6e.png)

以下のように EC2 インスタンスを作成しました。

|設定項目|パラメータ|備考|
|:--|:--|:--|
|名前とタグ|before-dhmc-ec2|任意の名前|
|AMI ID|ami-0ffac3e16de16665e|Amazon Linux 2 Kernel 5.10 AMI 2.0.20230207.0 x86_64 HVM gp2（20230219 時点のデフォルト AMI）|
|インスタンスタイプ|t2.micro| |
|キーペア|任意のキーペア| |
|VPC|デフォルト VPC| |
|セキュリティグループ|default|デフォルトのセキュリティグループに、自分がアクセスするグローバル IP アドレスからのインバウンド SSH を許可するルールを追加（SSM エージェントをアップデートするのにログインするため）|
|IAM インスタンスプロフィール|なし|IAM ロールは付与しない|

Systems Manager セッションマネージャーでアクセスできるか見てみます。
デフォルト VPC のパブリックサブネットに作成しましたが、IAM ロールを付与していないので、想定通り接続はできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/00faf673-b62d-0c35-6889-c532a2d9e705.png)

Systems Manager フリートマネージャーからマネージドノードに登録されているかも確認しますが、想定通り表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/9d0bccce-4f83-7d8d-00e5-5314fb40b938.png)


今回使用した AMI から起動した EC2 インスタンスでは SSM エージェントのバージョンが以下のように `3.1.1732.0` でした。
```
[ec2-user@ip-172-31-33-131 ~]$ yum info amazon-ssm-agent
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
Name        : amazon-ssm-agent
Arch        : x86_64
Version     : 3.1.1732.0
Release     : 1.amzn2
Size        : 90 M
Repo        : installed
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

[ec2-user@ip-172-31-33-131 ~]$
```

[Amazon Linux 2 インスタンスに SSM Agent を手動でインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/agent-install-al2.html#quick-install-al2) の手順を参考に、SSM エージェントをバージョン3.2.582.0 以降にアップデートします。

- SSM エージェントバージョンアップするコマンド
```
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
```
- コマンド実行結果
```
[ec2-user@ip-172-31-33-131 ~]$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amazon-ssm-agent.rpm                                     |  24 MB     00:08
Examining /var/tmp/yum-root-aG4Vh5/amazon-ssm-agent.rpm: amazon-ssm-agent-3.2.582.0-1.x86_64
Marking /var/tmp/yum-root-aG4Vh5/amazon-ssm-agent.rpm as an update to amazon-ssm-agent-3.1.1732.0-1.amzn2.x86_64
Resolving Dependencies
--> Running transaction check
---> Package amazon-ssm-agent.x86_64 0:3.1.1732.0-1.amzn2 will be updated
---> Package amazon-ssm-agent.x86_64 0:3.2.582.0-1 will be an update
--> Finished Dependency Resolution
amzn2-core/2/x86_64                                      | 3.7 kB     00:00

Dependencies Resolved

================================================================================
 Package              Arch       Version            Repository             Size
================================================================================
Updating:
 amazon-ssm-agent     x86_64     3.2.582.0-1        /amazon-ssm-agent      99 M

Transaction Summary
================================================================================
Upgrade  1 Package

Total size: 99 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : amazon-ssm-agent-3.2.582.0-1.x86_64                          1/2
  Cleanup    : amazon-ssm-agent-3.1.1732.0-1.amzn2.x86_64                   2/2
Failed to execute operation: File exists
  Verifying  : amazon-ssm-agent-3.2.582.0-1.x86_64                          1/2
  Verifying  : amazon-ssm-agent-3.1.1732.0-1.amzn2.x86_64                   2/2

Updated:
  amazon-ssm-agent.x86_64 0:3.2.582.0-1

Complete!
[ec2-user@ip-172-31-33-131 ~]$
```

- SSM エージェントアップデート後のバージョン確認
```
[ec2-user@ip-172-31-33-131 ~]$ yum info amazon-ssm-agent
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
Name        : amazon-ssm-agent
Arch        : x86_64
Version     : 3.2.582.0
Release     : 1
Size        : 99 M
Repo        : installed
Summary     : Manage EC2 Instances using SSM APIs
URL         : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
License     : Apache License, Version 2.0
Description : This package provides Amazon SSM Agent for managing EC2 Instances
            : using SSM APIs

[ec2-user@ip-172-31-33-131 ~]$
```

SSM エージェントの最新版は以下で確認できます。
2023/2/19 時点では、2023/2/5 にリリースされた `3.2.582.0` が最新版のようです。 

https://github.com/aws/amazon-ssm-agent/releases


## 2. [デフォルトのホスト管理構成] 設定をオンにする
Systems Manager フリートマネージャーコンソールから管理者がおこないます。

既存の Amazon EC2 インスタンスにインスタンスプロファイル（IAM ロール）がアタッチされている場合、`ssm:UpdateInstanceInformation` オペレーションを許可するすべての権限を削除する必要があるようです。

Systems Manager コンソールにアクセスし、フリートマネージャーを開きます。
青い枠で DHMC（デフォルトのホスト管理設定） に関する情報が出ています。今回は [アカウント管理]-[デフォルトのホスト管理設定の構成] から設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/838bfbac-9ce5-2989-b5a2-017a1434745c.png)

[デフォルトのホスト管理設定の構成] 画面に遷移します。
マネジメントコンソールから設定すると、現在のリージョンのアカウントレベルで DHMC（デフォルトのホスト管理設定） が有効になるそうです。
「デフォルトのホスト管理設定を有効にする」にチェックを入れると、IAM ロールを選択する画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/006a456c-6996-2e97-a51d-268390278f48.png)

DHMC（デフォルトのホスト管理設定） を有効にするには `AmazonSSMManagedEC2InstanceDefaultPolicy` が付与された IAM ロールが必要だそうです。
IAM ロールの選択画面のリストをクリックすると、「作成 AWSSystemsManagerDefaultEC2InstanceManagementRole（レコメンデーション）」という選択肢がありました。
`AmazonSSMManagedEC2InstanceDefaultPolicy` が付与された IAM ロール ` AWSSystemsManagerDefaultEC2InstanceManagementRole` を自動作成してくれそうな雰囲気なので、これをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/045fe5dc-de83-044a-eb8a-03d3eff40510.png)

最後に「設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/4b4bdf4e-ddb4-a880-93b9-54c9831f60f2.png)

緑のバーで「デフォルトのホスト管理設定を正常に有効化」と表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/132da150-a66a-b872-9ce0-4a8137fd7c39.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/69af98f5-e45c-f2ab-fccf-1df097a86b97.png)


### 補足：AWS マネージドポリシー `AmazonSSMManagedEC2InstanceDefaultPolicy` について
このポリシーは EC2 インスタンスで以下の操作を許可する権限を付与します。 
- SSM Agent がドキュメントを取得すること
- Run Command を使用してコマンドを実行すること
- Session Manager を使用してセッションを確立すること
- インスタンスのインベントリを収集すること
- Patch Manager を使用してパッチとパッチコンプライアンスをスキャンすること

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonSSMManagedEC2InstanceDefaultPolicy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/8b9ac628-abf6-2f39-bb50-2eb270c1bb59.png)


## 3. 既存の EC2 インスタンス（before-dhmc-ec2）の確認（オプション）
1 分くらい待っていると、以下のようにマネージドノードに準備しておいた既存の EC2 インスタンス（before-dhmc-ec2）が表示されました。やったー！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3702264d-131a-fd1e-772c-f8e73ee5d748.png)

セッションマネージャーでも接続できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/809dbe46-8661-ec99-5605-5a27061a02c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/65c88212-e4b1-01ba-5758-c2974aef07f7.png)

EC2 コンソールから既存の EC2 インスタンス（before-dhmc-ec2）を確認すると、IAM ロールは空っぽでした。
EC2 インスタンスに自動付与されるわけではないようです。
Systems Manager のデフォルトのホスト管理設定（DHMC）側で、権限をうまいこと調整してくれているのでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d4835159-def7-d3c4-ddc1-84b4e535573b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/c695f792-d597-3eb6-0166-e51941733856.png)

## 4．EC2 インスタンスを新規作成（オプション）
Systems Manager の DHMC（デフォルトのホスト管理設定）を有効にした状態で、新しく EC2 インスタンスを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a7750dce-1d7a-e18b-3ba0-c9096b787775.png)

|設定項目|パラメータ|備考|
|:--|:--|:--|
|名前とタグ|after-dhmc-ec2|任意の名前|
|AMI ID|ami-0ffac3e16de16665e|Amazon Linux 2 Kernel 5.10 AMI 2.0.20230207.0 x86_64 HVM gp2（20230219 時点のデフォルト AMI）|
|インスタンスタイプ|t2.micro| |
|キーペア|任意のキーペア| |
|VPC|デフォルト VPC| |
|セキュリティグループ|default|デフォルトのセキュリティグループに、自分がアクセスするグローバル IP アドレスからのインバウンド SSH を許可するルールを追加（SSM エージェントをアップデートするのにログインするため）|
|IAM インスタンスプロフィール|なし|IAM ロールは付与しない|

Systems Manager セッションマネージャーでアクセスできるか見てみます。
デフォルト VPC のパブリックサブネットに作成しましたが、IAM ロールを付与していないので、想定通り接続はできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/35afccef-d967-ca60-3469-25e523725221.png)

Systems Manager フリートマネージャーからマネージドノードに登録されているかも確認しますが、想定通り表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a76b5720-4482-bd95-5072-0dc87a7d28e7.png)

SSM エージェントをバージョン3.2.582.0 以降にアップデートします。

```
[ec2-user@ip-172-31-5-114 ~]$ yum info amazon-ssm-agent
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
Name        : amazon-ssm-agent
Arch        : x86_64
Version     : 3.2.582.0
Release     : 1
Size        : 99 M
Repo        : installed
Summary     : Manage EC2 Instances using SSM APIs
URL         : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
License     : Apache License, Version 2.0
Description : This package provides Amazon SSM Agent for managing EC2 Instances
            : using SSM APIs

[ec2-user@ip-172-31-5-114 ~]$
```

SSM エージェントをアップデートしてから 1 分くらい待っていると、以下のようにマネージドノードに新規作成した EC2 インスタンス（after-dhmc-ec2）が表示されました。やったー！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/16281d57-b48d-947b-87c1-78af58a5a537.png)

セッションマネージャーでも接続できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/728ba218-c650-ec20-99a3-8c50a75d57c6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/bee0c4dc-87e4-c878-a307-4e9f06fbb0f4.png)

EC2 コンソールから新規作成した EC2 インスタンス（after-dhmc-ec2）を確認すると、先ほどと同様 IAM ロールは空っぽでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6b207856-141c-3589-3be6-71149181c983.png)

## 5. IAM ロールの確認
IAM コンソールから確認すると、`AmazonSSMManagedEC2InstanceDefaultPolicy` が付与された IAM ロール `AWSSystemsManagerDefaultEC2InstanceManagementRole` が自動作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e241d26a-f377-4ba0-6263-a49396d9e99a.png)


## 6. デフォルトのホスト管理設定（DHMC）をオフにする
デフォルトのホスト管理設定（DHMC）をオフにしてみます。
Systems Manager コンソールにアクセスし、フリートマネージャーを開きます。
 [アカウント管理]-[デフォルトのホスト管理設定の構成] から設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/fa3cbff1-c8a8-2722-2ffb-fc1b76a4cba8.png)

[デフォルトのホスト管理設定の構成] 画面に遷移します。
「デフォルトのホスト管理設定を有効にする」のチェックを外し、「設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/9b6a17ac-d7e7-8244-69fe-4f4158034d4b.png)

緑のバーで「デフォルトのホスト管理を正常に無効にしました」と表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ad3be311-7cd5-b3c8-7941-1e0c64bff25a.png)

5 分くらい待ってみましたが、先ほど登録された EC2 インスタンス 2 台はそのままマネージドノードに表示され続けています。EC2 インスタンスを再起動しても同様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/481d226e-48b1-216d-4c9f-189b5beb53bc.png)



EC2 インスタンスを停止してみます。
ノードの状態が「停止中」になり、「接続が失われました」となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d4ae033a-8673-e33b-939c-dcfa4a2ced95.png)

EC2 インスタンスを開始してみると、ノードの状態が「実行中」になり、「オンライン」となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/0ab87c70-f724-324a-12e6-96d257bd9143.png)

[ノードアクション]-[このマネージドノードの登録を解除する] は選択できませんでした。
EC2 インスタンスを停止しても同様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b99eea8c-27bc-8c2b-1f19-2cfbe89f2853.png)

デフォルトのホスト管理設定（DHMC）をオフにしても、マネージドノードには残り続ける模様です。
24 時間後に再度確認しましたが、変わらずマネージドノードに表示されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/28434505-eb95-533a-fe22-03d2b116eed0.png)

## おまけ：IAM ポリシー `AmazonSSMManagedEC2InstanceDefaultPolicy` と `AmazonSSMManagedInstanceCore` の差：
IAM ポリシー `AmazonSSMManagedEC2InstanceDefaultPolicy` と `AmazonSSMManagedInstanceCore` の差分として、`AmazonSSMManagedEC2InstanceDefaultPolicy` には以下のアクションが含まれていませんでした。

- `"ssm:GetParameter"`
- `"ssm:GetParameters"`

# 終わりに
セッションマネージャーで EC2 インスタンスにアクセスしたいことは多いので、利用する機会がありそうなアップデートだなと感じました。個人で検証する際はデフォルトのホスト管理設定（DHMC）はオンにしておくと便利そうです。
SSM エージェントのバージョンの確認と、EC2 インスタンスから Sysytems Manager への通信経路の確保は必要なので、変わらず注意が必要です。

# 参考

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent.html

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonSSMManagedEC2InstanceDefaultPolicy

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html