EC2 の ImdsV1Enabled メトリクスで IMDSv2 を必須にしていないインスタンスを特定してみた

EC2 の ImdsV1Enabled メトリクスで IMDSv2 を必須にしていないインスタンスを特定してみた

Amazon EC2 の CloudWatch メトリクス ImdsV1Enabled で、IMDSv2 を必須にしていないインスタンスを特定できるか試しました。get-metric-data の SEARCH を使うと3台分の値を1回の問い合わせで取得でき、required に変更すると、今回の3回ではいずれも4分59秒以内に 0 が見えました。
2026.11.16

はじめに

2026年11月5日、EC2 の CloudWatch メトリクス ImdsV1Enabled が追加されました。

https://aws.amazon.com/about-aws/whats-new/2026/11/ec2-imdsv1enabled-cloudwatch-metric/

このメトリクスは、どのインスタンスで 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 として保存しました。

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 環境であれば、特に有効と考えられます。

https://dev.classmethod.jp/articles/cloudwatch-metrics-centralization-cross-account/

また、是正済みの環境でも、アカウントレベルで IMDSv2 を強制適用できなければ、IMDSv2 を必須にしていないインスタンスが起動する可能性は残ります。AWS Config ルールより素早く検知したい場合は、ImdsV1Enabled を利用したアラームなどをご活用ください。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事