[AWS]Default Host Management Configration(DHMC)でIAMロールなしでEC2をマネージドインスタンスに

# はじめに

本投稿ではSystemsManagerの機能の一つであるDefault Host Management Configration(DHMC)を使って、EC2インスタンスにIAMロールをアタッチせずにマネージドインスタンス化する方法について解説したいと思います。

:::note warn
`IAMロールなしで`とタイトルに冠しましたが、厳密には`インスタンスプロファイルにSSM操作用のIAMロールをアタッチすることなしで`となります。
DHMC用にIAMロールは用意する必要がありますのでご了承ください。
:::

# Default Host Management Configration(DHMC)とは

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

詳細は上記ドキュメントの通りですが、端的に言うと`EC2にIAMロールがアタッチされていない場合に、デフォルトで使用されるIAMロールを指定しておける`機能になります。
※より厳密な機能の仕組みについては後述します。

こちらの機能を使用するためには下記の制約があります。

```text:DHMCを使用する際の制約
* SSM Agent バージョン 3.2.582.0 以降がインストールされていること
* インスタンスメタデータサービスバージョン 2 (IMDSv2) を使用していること
```
最初の制約であるSSM Agentですが、使用するAMIによっては要件を満たすバージョンがインストールされていない場合があります。
将来的には最新のAMIを使えば問題なくなるとは思われますが、もしエージェントのバージョンが古い場合はインスタンス起動時にuserdataで更新してあげましょう。
```shell:userdata
#!/bin/bash
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
REGION_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')
yum install -y https://s3.${REGION_NAME}.amazonaws.com/amazon-ssm-${REGION_NAME}/latest/linux_arm64/amazon-ssm-agent.rpm

systemctl restart amazon-ssm-agent
```
上記はGravitonベースのインスタンス向けに`linux_arm64`用パッケージを指定しています。
お使いのインスタンスに合わせて適宜`linux_amd64`などに書き換えてください。

なお、DHMCを使用する場合でもSSM APIへの通信経路は必要となりますので、
インターネットゲートウェイ、NATゲートウェイ、VPCエンドポイント等は別途用意してください。

# DHMCの有効化
今回はマネジメントコンソールからDHCMを有効化していきます。
Systems Managerコンソールから`フリートマネージャー`を選択し、`デフォルトのホスト管理設定の構成`を選択してください。
![スクリーンショット 2023-07-25 22.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/225a0630-70f7-3504-0429-aa8111bfb68f.png)

トグルボタンで機能を有効化します。
IAMロールを指定する必要がありますが、レコメンデーションに従って必要なロールを作成し設定しましょう。
![スクリーンショット 2023-07-25 23.16.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/9e866fa0-1405-fe8b-2b84-fd0bd00849f3.png)

これで完了です。
わずか数クリックで設定ができましたね。

今後アカウント内のEC2インスタンスが要件を満たすと自動的にマネージドインスタンスとして登録されます。

CLIから有効化したい、CloudFormation StackSetsで複数アカウントにまとめて設定したいという方は下記の記事を参考にしてください。

https://aws.amazon.com/jp/blogs/mt/enable-management-of-your-amazon-ec2-instances-in-aws-systems-manager-using-default-host-management-configuration/

# 結局なにが嬉しいの？

さて、本記事を読んでいただいている方の中には、
EC2を自動でマネージドインスタンスに、ってSSMのQuickSetupで元々できましたよね？🤔
と思われた方もいるかもしれません。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/quick-setup-host-management.html

では、QuickSetupではなくDHMCを使うことでなにが嬉しいのかというと、**`管理用（SSM用）のロールと開発用のロールを分離できる`** という点です。

ご存知の通り、EC2のインスタンスプロファイルに含めることができるIAMロールは1つのみで、この制限を増やすことはできません。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#ec2-instance-profile

この制限下で開発をしていると何が起こるかというと、1つのIAMロールに管理用のポリシーと開発用ポリシーが同居することになります。
もし管理（運用）と開発を別々のチームが担当していた場合、このロールの変更に関する統制をとることが非常に困難になります。

そこで、

`管理（運用）チーム : DHMC用ロール`
`開発チーム : インスタンスプロファイル用ロール`

と管理する範囲を分離することでお互いに干渉することなく開発を進めることができます。


# 1つのインスタンスに2つのロールが紐付いてるということ？どちらの権限が優先されるの？

細かい話ですが、
* インスタンスプロファイルに設定されたIAMロール
* DHMCに設定されたIAMロール

が同時に存在する場合、どちらの権限が使用されるか気になった方もいるかと思います。

答えは、
> SSM Agent は、デフォルトのホスト管理設定の許可を使用する前に、インスタンスプロファイルの許可の使用を試みます。インスタンスプロファイルで ssm:UpdateInstanceInformation オペレーションを許可すると、インスタンスはデフォルトのホスト管理設定のアクセス許可を使用しません。

と[ドキュメント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/managed-instances-default-host-management.html)にある通りとなります。

少しわかりにくいですので表にすると、

|| EC2インスタンス | SSMに使用されるIAMロール |
|:-|:-|:-|
|1| インスタンスプロファイルがアタッチされて`いない`  | DHMCに設定されたIAMロール  |
|2| インスタンスプロファイルがアタッチされて`いる` <br> かつ <br> ssm:UpdateInstanceInformation アクションが許可されて`いない`  | DHMCに設定されたIAMロール  |
|3| インスタンスプロファイルがアタッチされて`いる` <br> かつ <br> ssm:UpdateInstanceInformation アクションが許可されて`いる`  | インスタンスプロファイルに設定されたIAMロール  |

といったような対応となります。
なお、2のようなケースでもSSM以外のサービス（例えばS3やLambdaへのアクセスなど）はインスタンスプロファイル側のロールの権限が参照されますのでご安心ください。


# おわりに

いかがでしたか？

EC2をマネージドインスタンスにすることで、SessionManagerによる接続が可能になります。
以前に投稿したEC2 Instance Connect Endpointと合わせて、秘密鍵を使用せずにEC2インスタンスへ接続する選択肢としてぜひご検討いただければと思います。

https://qiita.com/sshimoyama/items/4a59cc540bda96a8238f

無くそう、秘密鍵の管理。