Datadog エージェントを IMDSv2 に移行してみた
こんにちは。オペレーション部のしいなです。
はじめに
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 を要求してみます。
- 現在のメタデータオプションを確認します。
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 両方利用可能です。
- IMDSv2 を要求する。
aws ec2 modify-instance-metadata-options \
--instance-id i-XXXXXXXXXXXX \
--http-tokens required \
--http-endpoint enabled
- 現在のメタデータオプションを確認します。
{
"State": "applied",
"HttpTokens": "required",
"HttpPutResponseHopLimit": 2,
"HttpEndpoint": "enabled",
"HttpProtocolIpv6": "disabled",
"InstanceMetadataTags": "disabled"
}
"HttpTokens": "required" と出力されました。
IMDSv2 のみ要求できる状態となりました。
- Datadog エージェントを再起動し、影響が出ていないか確認してみます。
systemctl restart datadog-agent
- 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 が使用されていることがわかります。

Datadog エージェントの IMDSv2 対応
IMDSv2 を利用するには明示的にパラメータで指定が必要となります。
datadog.yaml でec2_prefer_imdsv2: trueと指定することで、Datadog エージェントは IMDSv2 を利用するようになります。
- datadog.yaml の修正
/etc/datadog-agent/datadog.yaml をエディタで修正し、保存します。
## @param ec2_prefer_imdsv2 - boolean - optional - default: false
ec2_prefer_imdsv2: true
- 設定反映のため、エージェントの再起動を行います。
systemctl restart datadog-agent
- 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 を利用するようになり、エージェント再起動以降、メトリクスが記録されなくなったことが確認できます。

EC2 インスタンスで IMDSv2 を要求する
EC2 インスタンスで IMDSv2 を要求してみます。
- 現在のメタデータオプションを確認します。
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 両方利用可能です。
- IMDSv2 を要求する。
aws ec2 modify-instance-metadata-options \
--instance-id i-XXXXXXXXXXXX \
--http-tokens required \
--http-endpoint enabled
- 現在のメタデータオプションを確認します。
{
"State": "applied",
"HttpTokens": "required",
"HttpPutResponseHopLimit": 2,
"HttpEndpoint": "enabled",
"HttpProtocolIpv6": "disabled",
"InstanceMetadataTags": "disabled"
}
"HttpTokens": "required" と出力されました。
IMDSv2 のみ要求できる状態となりました。
- Datadog エージェントを再起動し、影響が出ていないか確認してみます。
systemctl restart datadog-agent
- 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 を要求
- 現在のメタデータオプションを確認します。
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 のみ要求できる状態です。
- バージョンを指定し、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)"
- 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で始まる形式のホスト名で認識しています。

ホスト名が他のインスタンスと異なる場合、hostタグを利用したダッシュボードや既存モニター、通知などに影響が出る可能性があります。
例えば、グラフ上の表示にも違いが現れます。
hostを条件にしたグラフの場合、i-xxxxxxxxxxx と ip-xxx-xxx-xxx-xxx で始まる形式のホスト名が混在してしまいます。

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






