Datadog エージェントを IMDSv2 に移行してみた

Datadog エージェントを IMDSv2 に移行してみた

Datadog エージェントのバージョンごとに、EC2 インスタンスの IMDSv2 移行手順と動作への影響を実際に検証してみました。 対応せずに IMDSv2 を要求した場合にホスト名がどう変わるかについても確認してみました。
2026.02.10

こんにちは。オペレーション部のしいなです。

はじめに

AWS ではセキュリティ強化の観点から、EC2 インスタンスメタデータサービスの IMDSv2 への移行が推奨されています。
IMDSv1 はトークン不要でメタデータにアクセスできるため、SSRF などの攻撃による認証情報漏洩のリスクが指摘されてきました。
Datadog エージェントはホスト名の解決にメタデータサービスを利用しています。
利用しているエージェントバージョンによっては IMDSv2 移行時にエージェント側の対応も必要です。
今回は Datadog エージェントのバージョンごとに、IMDSv2 への移行を実際に試してみました。

メタデータサービスを利用する目的

Datadog エージェントは一意となるホスト名を決めるため、インスタンス ID 情報の取得を行う場合があります。[1]
その際、メタデータサービスにアクセスし、インスタンス ID を取得しています。
主にエージェントの起動時や定期的にメタデータサービスへのアクセスが発生します。

利用しているメタデータサービスのバージョン

Datadog エージェントのバージョンによって異なります。[2]

  • v7.64.0 以降:デフォルトで IMDSv2 を使用
  • v7.64.0 未満:デフォルトで IMDSv1 を使用

v7.64.0 未満で IMDSv2 を利用するには datadog.yaml のパラメータ ec2_prefer_imdsv2 の指定が必要です。[3]

移行方法のまとめ

v7.64.0 以降の場合
特に Datadog エージェント側の対応は不要で EC2 インスタンスで IMDSv2 を要求できます。
v7.64.0 未満の場合
次のいずれかの対応が必要です。

  • Datadog エージェントを最新バージョン(v7.64.0 以降)へバージョンアップする
  • datadog.yaml のパラメータ ec2_prefer_imdsv2: trueを指定する

IMDSv2 に移行してみる(v7.64.0 以降)

デフォルトで IMDSv2 を使用するバージョンの Datadog エージェントが稼働している Linux の EC2 インスタンスを IMDSv2 へ移行してみます。
既に IMDSv2 に Datadog エージェントが対応しているため、そのままインスタンスで IMDSv2 を要求します。

前提

  • Datadog エージェント v7.75.2 を利用

エージェントバージョンを確認

まずは導入している Datadog エージェントのバージョンを確認してみます。

datadog-agent version
Agent 7.75.2 - Commit: d7a183b727 - Serialization version: v5.0.177 - Go version: go1.25.6

v7.75.2 であることが確認できます。

Datadog エージェントのホスト名情報を確認

稼働中の Datadog エージェントにおける、ホスト名情報を確認してみます。

datadog-agent status
========
Hostname
========

  ccrid: arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/i-XXXXXXXXXXXX
  ec2-hostname: ip-10-0-0-180.ap-northeast-1.compute.internal
  host_aliases: [i-XXXXXXXXXXXX]
  hostname: i-XXXXXXXXXXXX
  hostname-resolution-version: 1
  instance-id: i-XXXXXXXXXXXX
  socket-fqdn: ip-10-0-0-180.ap-northeast-1.compute.internal.
  socket-hostname: ip-10-0-0-180.ap-northeast-1.compute.internal
  hostname provider: aws
  unused hostname providers:
    'hostname' configuration/environment: hostname is empty
    'hostname_file' configuration/environment: 'hostname_file' configuration is not enabled
    azure: azure_hostname_style is set to 'os'
    container: the agent is not containerized
    fargate: agent is not running in sidecar mode
    fqdn: 'hostname_fqdn' configuration is not enabled
    gce: unable to retrieve hostname from GCE: GCE metadata API error: status code 404 trying to GET http://169.254.169.254/computeMetadata/v1/instance/hostname

インスタンス ID 情報が取得されています。
特にプロバイダー aws において、メタデータ取得でエラーは発生していませんね。

EC2 インスタンスで IMDSv2 を要求する

EC2 インスタンスで IMDSv2 を要求してみます。

  1. 現在のメタデータオプションを確認します。
aws ec2 describe-instances \
  --instance-ids i-XXXXXXXXXXXX \
  --query 'Reservations[0].Instances[0].MetadataOptions' \
  --output json
{
    "State": "applied",
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 2,
    "HttpEndpoint": "enabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
}

"HttpTokens": "optional"と出力されているので、IMDSv1、IMDSv2 両方利用可能です。

  1. IMDSv2 を要求する。
aws ec2 modify-instance-metadata-options \
    --instance-id i-XXXXXXXXXXXX \
    --http-tokens required \
    --http-endpoint enabled
  1. 現在のメタデータオプションを確認します。
{
    "State": "applied",
    "HttpTokens": "required",
    "HttpPutResponseHopLimit": 2,
    "HttpEndpoint": "enabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
}

"HttpTokens": "required" と出力されました。
IMDSv2 のみ要求できる状態となりました。

  1. Datadog エージェントを再起動し、影響が出ていないか確認してみます。
systemctl restart  datadog-agent
  1. Datadog エージェントのホスト名情報を確認してみます。
datadog-agent status
========
Hostname
========

  ccrid: arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/i-XXXXXXXXXXXX
  ec2-hostname: ip-10-0-0-180.ap-northeast-1.compute.internal
  host_aliases: [i-XXXXXXXXXXXX]
  hostname: i-XXXXXXXXXXXX
  hostname-resolution-version: 1
  instance-id: i-XXXXXXXXXXXX
  socket-fqdn: ip-10-0-0-180.ap-northeast-1.compute.internal.
  socket-hostname: ip-10-0-0-180.ap-northeast-1.compute.internal
  hostname provider: aws
  unused hostname providers:
    'hostname' configuration/environment: hostname is empty
    'hostname_file' configuration/environment: 'hostname_file' configuration is not enabled
    azure: azure_hostname_style is set to 'os'
    container: the agent is not containerized
    fargate: agent is not running in sidecar mode
    fqdn: 'hostname_fqdn' configuration is not enabled
    gce: unable to retrieve hostname from GCE: GCE metadata API error: status code 401 trying to GET http://169.254.169.254/computeMetadata/v1/instance/hostname

先ほど同様にインスタンス ID 情報が取得されています。
特にプロバイダー aws において、メタデータ取得でエラーは発生していません。
特に Datadog エージェント側で設定せずとも、IMDSv2 を要求することができます。

IMDSv2 に移行してみる(v7.64.0 未満)

デフォルトで IMDSv1 を使用するバージョンの Datadog エージェントが稼働している Linux の EC2 インスタンスを IMDSv2 へ移行してみます。
まず、Datadog エージェントを IMDSv2 を利用するように更新し、インスタンスで IMDSv2 を要求します。

前提

  • Datadog エージェント v7.63.0 を利用
  • 上記以外に IMDSv1 を利用するソフトウェアは導入されていない

エージェントバージョンを確認

まずは導入している Datadog エージェントのバージョンを確認してみます。

datadog-agent version
Agent 7.63.0 - Commit: 2bbd8a37c4 - Serialization version: v5.0.141 - Go version: go1.23.5

v7.63.0 であることが確認できます。

Datadog エージェントのホスト名情報を確認

稼働中の Datadog エージェントにおける、ホスト名情報を確認してみます。

datadog-agent status
========
Hostname
========

  ec2-hostname: ip-10-0-0-87.ap-northeast-1.compute.internal
  host_aliases: [i-XXXXXXXXXXXX]
  hostname: i-XXXXXXXXXXXX
  hostname-resolution-version: 1
  instance-id: i-XXXXXXXXXXXX
  socket-fqdn: ip-10-0-0-87.ap-northeast-1.compute.internal.
  socket-hostname: ip-10-0-0-87.ap-northeast-1.compute.internal
  hostname provider: aws
  unused hostname providers:
    'hostname' configuration/environment: hostname is empty
    'hostname_file' configuration/environment: 'hostname_file' configuration is not enabled
    azure: azure_hostname_style is set to 'os'
    container: the agent is not containerized
    fargate: agent is not runnning on Fargate
    fqdn: 'hostname_fqdn' configuration is not enabled
    gce: unable to retrieve hostname from GCE: GCE metadata API error: status code 404 trying to GET http://169.254.169.254/computeMetadata/v1/instance/hostname

インスタンス ID 情報が取得されています。
特にプロバイダー aws において、メタデータ取得でエラーは発生していませんね。

次に CloudWatch の MetadataNoToken メトリクスを確認してみましょう。
値が記録されていることが確認できます。
Datadog エージェントにおいて、IMDSv1 が使用されていることがわかります。
new メトリクス1

Datadog エージェントの IMDSv2 対応

IMDSv2 を利用するには明示的にパラメータで指定が必要となります。
datadog.yaml でec2_prefer_imdsv2: trueと指定することで、Datadog エージェントは IMDSv2 を利用するようになります。

  1. datadog.yaml の修正
    /etc/datadog-agent/datadog.yaml をエディタで修正し、保存します。
datadog.yaml
## @param ec2_prefer_imdsv2 - boolean - optional - default: false
ec2_prefer_imdsv2: true
  1. 設定反映のため、エージェントの再起動を行います。
systemctl restart datadog-agent
  1. Datadog エージェントのホスト名情報を確認してみます。
datadog-agent status
========
Hostname
========

  ec2-hostname: ip-10-0-0-87.ap-northeast-1.compute.internal
  host_aliases: [i-XXXXXXXXXXXX]
  hostname: i-XXXXXXXXXXXX
  hostname-resolution-version: 1
  instance-id: i-XXXXXXXXXXXX
  socket-fqdn: ip-10-0-0-87.ap-northeast-1.compute.internal.
  socket-hostname: ip-10-0-0-87.ap-northeast-1.compute.internal
  hostname provider: aws
  unused hostname providers:
    'hostname' configuration/environment: hostname is empty
    'hostname_file' configuration/environment: 'hostname_file' configuration is not enabled
    azure: azure_hostname_style is set to 'os'
    container: the agent is not containerized
    fargate: agent is not runnning on Fargate
    fqdn: 'hostname_fqdn' configuration is not enabled
    gce: unable to retrieve hostname from GCE: GCE metadata API error: status code 404 trying to GET http://169.254.169.254/computeMetadata/v1/instance/hostname

先ほど同様にインスタンス ID 情報が取得されています。
特にプロバイダー aws において、メタデータ取得でエラーは発生していません。

次に CloudWatch の MetadataNoToken メトリクスを確認してみましょう。
Datadog エージェントは IMDSv2 を利用するようになり、エージェント再起動以降、メトリクスが記録されなくなったことが確認できます。
new メトリクス2

EC2 インスタンスで IMDSv2 を要求する

EC2 インスタンスで IMDSv2 を要求してみます。

  1. 現在のメタデータオプションを確認します。
aws ec2 describe-instances \
  --instance-ids i-XXXXXXXXXXXX \
  --query 'Reservations[0].Instances[0].MetadataOptions' \
  --output json
{
    "State": "applied",
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 2,
    "HttpEndpoint": "enabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
}

"HttpTokens": "optional"と出力されているので、IMDSv1、IMDSv2 両方利用可能です。

  1. IMDSv2 を要求する。
aws ec2 modify-instance-metadata-options \
    --instance-id i-XXXXXXXXXXXX \
    --http-tokens required \
    --http-endpoint enabled
  1. 現在のメタデータオプションを確認します。
{
    "State": "applied",
    "HttpTokens": "required",
    "HttpPutResponseHopLimit": 2,
    "HttpEndpoint": "enabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
}

"HttpTokens": "required" と出力されました。
IMDSv2 のみ要求できる状態となりました。

  1. Datadog エージェントを再起動し、影響が出ていないか確認してみます。
systemctl restart  datadog-agent
  1. Datadog エージェントのホスト名情報を確認してみます。
datadog-agent status
========
Hostname
========

  ec2-hostname: ip-10-0-0-87.ap-northeast-1.compute.internal
  host_aliases: [i-XXXXXXXXXXXX]
  hostname: i-XXXXXXXXXXXX
  hostname-resolution-version: 1
  instance-id: i-XXXXXXXXXXXX
  socket-fqdn: ip-10-0-0-87.ap-northeast-1.compute.internal.
  socket-hostname: ip-10-0-0-87.ap-northeast-1.compute.internal
  hostname provider: aws
  unused hostname providers:
    'hostname' configuration/environment: hostname is empty
    'hostname_file' configuration/environment: 'hostname_file' configuration is not enabled
    azure: azure_hostname_style is set to 'os'
    container: the agent is not containerized
    fargate: agent is not runnning on Fargate
    fqdn: 'hostname_fqdn' configuration is not enabled
    gce: unable to retrieve hostname from GCE: GCE metadata API error: status code 401 trying to GET http://169.254.169.254/computeMetadata/v1/instance/hostname

先ほど同様にインスタンス ID 情報が取得されています。
特にプロバイダー aws において、メタデータ取得でエラーは発生していません。

IMDSv2 への移行が完了です。

パラメータを指定せずに IMDSv2 を要求した場合どうなるのか

IMDSv2 を要求した Linux の EC2 インスタンスを作成し、デフォルトで IMDSv1 を使用するバージョンの Datadog エージェントを導入してみます。
ec2_prefer_imdsv2 パラメータを指定せずに Datadog エージェントの動作を確認してみます。

前提

  • Datadog エージェント v7.63.0 を利用
  • EC2 インスタンスは IMDSv2 を要求
  1. 現在のメタデータオプションを確認します。
aws ec2 describe-instances \
  --instance-ids i-XXXXXXXXXXXX \
  --query 'Reservations[0].Instances[0].MetadataOptions' \
  --output json
{
    "State": "applied",
    "HttpTokens": "required",
    "HttpPutResponseHopLimit": 2,
    "HttpEndpoint": "enabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
}

"HttpTokens": "required" と出力されているため、IMDSv2 のみ要求できる状態です。

  1. バージョンを指定し、Datadog エージェントを導入します。
DD_API_KEY=<YOUR_API_KEY>
DD_AGENT_MAJOR_VERSION=7
DD_AGENT_MINOR_VERSION=63.0
bash -c "$(curl -L https://install.datadoghq.com/scripts/install_script_agent7.sh)"
  1. Datadog エージェントのホスト名情報を確認してみます。
datadog-agent status
========
Hostname
========

  host_aliases: [i-XXXXXXXXXXXX]
  hostname: ip-10-0-0-91.ap-northeast-1.compute.internal
  hostname-resolution-version: 1
  socket-fqdn: ip-10-0-0-91.ap-northeast-1.compute.internal.
  socket-hostname: ip-10-0-0-91.ap-northeast-1.compute.internal
  hostname provider: os
  unused hostname providers:
    'hostname' configuration/environment: hostname is empty
    'hostname_file' configuration/environment: 'hostname_file' configuration is not enabled
    aws: Unable to determine hostname from EC2: status code 401 trying to GET http://169.254.169.254/latest/meta-data/instance-id
    azure: azure_hostname_style is set to 'os'
    container: the agent is not containerized
    fargate: agent is not runnning on Fargate
    fqdn: 'hostname_fqdn' configuration is not enabled
    gce: unable to retrieve hostname from GCE: GCE metadata API error: status code 401 trying to GET http://169.254.169.254/computeMetadata/v1/instance/hostname

メタデータサービスにアクセスできず、4xx エラーが発生していることがわかります。
aws: Unable to determine hostname from EC2: status code 401 trying to GET http://169.254.169.254/latest/meta-data/instance-id

Datadog のホスト名選択ルールにより、メタデータにアクセスできない場合、hostname -fを利用してホスト名を決めます。
以下の値がホスト名として使用されていることが確認できます。

hostname -f
ip-10-0-0-91.ap-northeast-1.compute.internal

動作影響

Datadog コンソールの 「Infrastructure」から「Hosts」を選択し、 Host List を確認してみると、ip-xxx-xxx-xxx-xxxで始まる形式のホスト名で認識しています。
影響2

ホスト名が他のインスタンスと異なる場合、hostタグを利用したダッシュボードや既存モニター、通知などに影響が出る可能性があります。

例えば、グラフ上の表示にも違いが現れます。
hostを条件にしたグラフの場合、i-xxxxxxxxxxxip-xxx-xxx-xxx-xxx で始まる形式のホスト名が混在してしまいます。
影響1

運用現場が混乱する原因にもなるため、古いバージョンの Datadog エージェントを利用している場合はec2_prefer_imdsv2パラメータで IMDSv2 対応を行うことが重要です。

まとめ

Datadog エージェントの IMDSv2 対応はバージョンによって異なり、v7.64.0 以降であればエージェント側の追加設定なしでそのまま IMDSv2 へ移行できます。
v7.64.0 未満の場合は、ec2_prefer_imdsv2: true の設定追加またはエージェントのバージョンアップが必要です。
対応せずに IMDSv2 を要求すると、ホスト名がインスタンス ID から FQDN のホスト名に変わり、ダッシュボードやモニターに影響が出る可能性があるため注意が必要です。
IMDSv2 への移行を検討されている方は、まずエージェントのバージョンを確認するところから始めてみてください。

本記事が参考になれば幸いです。

参考

https://docs.datadoghq.com/integrations/guide/aws-integration-troubleshooting/#ec2-metadata-with-imds-v2
https://docs.datadoghq.com/ja/agent/faq/how-datadog-agent-determines-the-hostname/?tab=agentv6v7#potential-host-names

脚注
  1. https://github.com/DataDog/datadog-agent/tree/main/pkg/util/hostname#hostnames-and-aliases-on-ec2 ↩︎

  2. https://docs.datadoghq.com/agent/faq/ec2_imdsv2_transition_payload_enabled/ ↩︎

  3. https://github.com/DataDog/datadog-agent/blob/main/pkg/config/config_template.yaml ↩︎

この記事をシェアする

FacebookHatena blogX

関連記事