
EC2 の ImdsV1Enabled メトリクスで IMDSv2 を必須にしていないインスタンスを特定してみた
はじめに
2026年11月5日、EC2 の CloudWatch メトリクス ImdsV1Enabled が追加されました。
このメトリクスは、どのインスタンスで IMDSv1 が有効かを CloudWatch で確認できるようにするものです。値は、メタデータオプションが optional のインスタンスで 1、required のインスタンスで 0 です(ドキュメント)。
このメトリクスで IMDSv2 を必須にしていないインスタンスを特定できるか、また required に変更してから 0 が見えるまでの時間を確かめました。
インスタンスと設定変更
ap-northeast-1 で、Amazon Linux 2023(arm64)の AMI から、最小スペックの t4g.nano を新規に起動しました。最初に起動した3台の構成は、optional・基本モニタリング、optional・詳細モニタリング、required・基本モニタリングです。
起動時の指定は次のとおりです。
- optional:
--metadata-options HttpTokens=optional - required:
--metadata-options HttpTokens=required - 基本モニタリング:
--monitoring Enabled=false - 詳細モニタリング:
--monitoring Enabled=true
設定変更がメトリクスに反映されるまでの時間を測るため、optional・基本モニタリングのインスタンスを2台追加し、合計5台で検証しました。この2台を、追加の1台目、2台目と呼びます。optional から required への変更には、modify-instance-metadata-options を使いました。
aws ec2 modify-instance-metadata-options \
--instance-id <インスタンスID> \
--http-tokens required
特定方法
get-metric-data で SEARCH 式を使うと、InstanceId ごとの系列を1回の問い合わせで取得できます。クエリは queries.json として保存しました。
[
{
"Id": "q1",
"Expression": "SEARCH('{AWS/EC2,InstanceId} MetricName=\"ImdsV1Enabled\"', 'Maximum', 60)",
"ReturnData": true
}
]
aws cloudwatch get-metric-data \
--metric-data-queries file://queries.json \
--start-time <開始時刻> --end-time <終了時刻> \
--query 'MetricDataResults[?length(Values)>`0`].[Label,Timestamps,Values]'
検証したアカウントでは、過去2週間にデータのあった別のインスタンスの系列も、Values が空のまま結果に含まれました。そのため --query で、値のある系列だけを残しています。取得範囲は、取得時刻の15分前から取得時刻までにしました。
3台の起動から約2分後に取得した結果のうち、Label と Values を次の表に示します。Label はインスタンスIDで、ここでは3台を区別する表記に置き換えています。各系列の値は1つずつでした。
| Label | Values |
|---|---|
| <optional・基本> | 1.0 |
| <optional・詳細> | 1.0 |
| <required・基本> | 0.0 |
値はタイムスタンプの新しい順に返るため、先頭が最新のデータポイントです。required に変更した直後は、先頭が変更前の 1 のままのことがあり、変更後のデータポイントが現れると 0 に変わります。取得範囲に変更前後のデータポイントが含まれると、1つの系列に 1 と 0 が並びます。
結果
optional のインスタンスを required に変更してから 0 が見えるまでの時間を、3回測りました。取得には、InstanceId を指定した get-metric-data(Maximum、Period 60)を使いました。変更した時刻は、直前の5分刻みの時刻(UTC の 12:35 など)からの経過時間で示します。取得は一定間隔で繰り返したため、表の時間は変更から 0 が見えた取得までの経過時間で、実際に 0 が現れたのはそれより前の可能性があります。そのため、すべて「以内」を付けています。
| 対象 | 変更した時刻 | 0 が見えるまで |
|---|---|---|
| optional・基本、optional・詳細(同時に変更) | 12:35 の2分14秒後(12:35 のデータポイントは見えていた) | 3分33秒以内(2台とも同じ取得で見えた) |
| optional・基本(追加の1台目) | 12:50 の3秒後(12:50 のデータポイントはまだ見えていなかった) | 21秒以内 |
| optional・基本(追加の2台目) | 13:00 の44秒後(13:00 のデータポイントが 1 で見えた直後) | 4分59秒以内 |
最も遅かったのは、13:00 のデータポイントが 1 で見えた直後に変更した3回目でした。
Period に 60 秒を指定しても、レスポンスのタイムスタンプは5分刻みでした。同時に変更した基本モニタリングと詳細モニタリングの2台では、詳細モニタリングによる短縮は見られませんでした。
まとめ
ImdsV1Enabled メトリクスのサポートにより、IMDSv2 を必須にしていないインスタンスを get-metric-data の SEARCH による1回の問い合わせで特定できました。required への変更は、5分以内に反映されることを確認できました。
是正対象となる IMDSv2 を必須にしていないインスタンスを、効率的に洗い出す手段として使えます。メトリクスの集約を実施している AWS Organizations 環境であれば、特に有効と考えられます。
また、是正済みの環境でも、アカウントレベルで IMDSv2 を強制適用できなければ、IMDSv2 を必須にしていないインスタンスが起動する可能性は残ります。AWS Config ルールより素早く検知したい場合は、ImdsV1Enabled を利用したアラームなどをご活用ください。








