✨
AWSのEC2インスタンスのメタデータ(IMDS)をCLIで取得する
はじめに
AWS のインスタンスメタデータ (IMDS: Instance MetaData Service) は、EC2 インスタンス内から HTTP リクエストでメタデータ取得できるサービスです。
インスタンスメタデータ(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