AWSのEC2インスタンスのメタデータ(IMDS)をCLIで取得する

2024/03/26に公開

はじめに

AWS のインスタンスメタデータ (IMDS: Instance MetaData Service) は、EC2 インスタンス内から HTTP リクエストでメタデータ取得できるサービスです。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html

インスタンスメタデータ(IMDS)の取得方法

AWS のドキュメントなどでよく見かけるコマンドは以下のようなものです。

IPv4 IMDSv1 の場合

curl http://169.254.169.254/latest/meta-data/

IPv4 IMDSv2 の場合

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/

AWS の推奨としては IMDSv2 を使用することが推奨されていて、最近のコンソールからのインスタンス作成時のデフォルトは IMDSv2 のみ使用できるようになっています。

CLIツールを使ってIMDSの情報を取得する

そこで、 IMDSv2 の情報を取得するための CLI ツールを調査したところ、標準 AMI の Amazon Linux 2023 と Ubuntu 22.04 にはそれぞれコマンドが用意されているようでした。

OS コマンド 言語 ライセンス
Amazon Linux 2023 ec2-metadata Bash MIT
Ubuntu 22.04 ec2metadata Python3 GPLv2

いずれも単一のテキストファイルに書かれたスクリプトなので、移行するのは簡単そうです。

ec2-metadata --help の結果

ec2-metadata v0.1.4
Use to retrieve EC2 instance metadata from within a running EC2 instance. 
e.g. to retrieve instance id: ec2-metadata -i
                 to retrieve ami id: ec2-metadata -a
                 to get help: ec2-metadata --help
For more information on Amazon EC2 instance meta-data, refer to the documentation at
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

Usage: ec2-metadata <option>
Options:
--all                     Show all metadata information for this host (also default).
-a/--ami-id               The AMI ID used to launch this instance
-l/--ami-launch-index     The index of this instance in the reservation (per AMI).
-m/--ami-manifest-path    The manifest path of the AMI with which the instance was launched.
-n/--ancestor-ami-ids     The AMI IDs of any instances that were rebundled to create this AMI.
-b/--block-device-mapping Defines native device names to use when exposing virtual devices.
-i/--instance-id          The ID of this instance
-t/--instance-type        The type of instance to launch. For more information, see Instance Types.
-h/--local-hostname       The local hostname of the instance.
-o/--local-ipv4           Public IP address if launched with direct addressing; private IP address if launched with public addressing.
-k/--kernel-id            The ID of the kernel launched with this instance, if applicable.
-z/--availability-zone    The availability zone in which the instance launched. Same as placement
-R/--region               The region in which the instance launched.
-P/--partition            The AWS partition name.
-c/--product-codes        Product codes associated with this instance.
-p/--public-hostname      The public hostname of the instance.
-v/--public-ipv4          NATted public IP Address
-u/--public-keys          Public keys. Only available if supplied at instance launch time
-r/--ramdisk-id           The ID of the RAM disk launched with this instance, if applicable.
-e/--reservation-id       ID of the reservation.
-s/--security-groups      Names of the security groups the instance is launched in. Only available if supplied at instance launch time
-d/--user-data            User-supplied data.Only available if supplied at instance launch time.
-g/--tags                 Tags assigned to this instance.
--quiet                   Suppress tag keys from the output.

ec2metadata --help の結果

Syntax: /usr/bin/ec2metadata [options]

Query and display EC2 metadata.

If no options are provided, all options will be displayed

Options:
    -h --help               show this help

    --kernel-id             display the kernel id
    --ramdisk-id            display the ramdisk id
    --reservation-id        display the reservation id

    --ami-id                display the ami id
    --ami-launch-index      display the ami launch index
    --ami-manifest-path     display the ami manifest path
    --ancestor-ami-ids      display the ami ancestor id
    --product-codes         display the ami associated product codes
    --availability-zone     display the ami placement zone name
    --availability-zone-id  display the ami placement zone id
    --region                display the ami placement region name
    --group-name            display the ami placement group name
    --host-id               display the dedicated host id
    --partition-number      display the partition instance was launched from

    --instance-id           display the instance id
    --instance-type         display the instance type

    --local-hostname        display the local hostname
    --public-hostname       display the public hostname

    --local-ipv4            display the local ipv4 ip address
    --public-ipv4           display the public ipv4 ip address

    --block-device-mapping  display the block device id
    --security-groups       display the security groups

    --mac                   display the instance mac address
    --profile               display the instance profile
    --instance-action       display the instance-action

    --public-keys           display the openssh public keys
    --user-data             display the user data (not actually metadata)

    -u | --url URL          use URL (default: http://169.254.169.254/2009-04-04)

いずれも、デフォルトでは IPv4 を使うようで IPv6 を使う場合 Amazon Linux 2023 ではアクセス先を変える方法がなく、Ubuntu 22.04 は -u/--url オプションで変更できそうです。

Amazon Linux 2023 の場合の利用例

以下は Docker CLI で ECR にログインする例です。

export region=$(ec2-metadata --region --quiet)
export account=$(aws sts get-caller-identity --query Account --output text)
aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $account.dkr.ecr.$region.amazonaws.com

Discussion