EC2 インスタンスメタデータの中身をちゃんと確認してみた

2023.12.12

この記事は アノテーション株式会社 AWS Technical Support Advent Calendar 2023 | Advent Calendar 2023 - Qiita 12日目の記事です。

概要

EC2 でインスタンスメタデータ取得を行うとどの様なデータが取得できるかを改めて確認しました。

メタデータを取得するシチュエーションや、 AWS CLI コマンドの describe-instances との違いも一緒に見ていきたいと思います。

基本のインスタンスメタデータ取得

インスタンスメタデータを取得することで、実行中のインスタンスの情報 (インスタンス ID や、AMI ID、 IP アドレス、ホスト名等) を確認することができます。

インスタンスから curl や wget を実行することで情報が取得できます。

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

Windows の場合は、Powershell で下記を実行することで情報が取得できます。

Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/

インスタンスメタデータの中身

インスタンスメタデータは下記の様な階層にデータが格納されています。

$ curl -s http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
iam/
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
managed-ssh-keys/
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/

試しにいくつかのメタデータを取得してみます。

$ curl -s http://169.254.169.254/latest/meta-data/hostname
ip-192-168-1-218.ap-northeast-1.compute.internal

$ curl -s http://169.254.169.254/latest/meta-data/local-ipv4
192.168.1.218

$ curl -s http://169.254.169.254/latest/meta-data/placement/region
ap-northeast-1

$ curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone
ap-northeast-1a

$ curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
TEST_EC2_role

インスタンスメタデータで取得できる情報の詳細は、下記の AWS ドキュメントに記載があります。

インスタンスメタデータのカテゴリ - Amazon Elastic Compute Cloud

インスタンスメタデータ ユーザデータや動的データ

インスタンスメタデータでは、対象インスタンスのユーザデータや動的データを取得する方法もあります。

http://169.254.169.254/latest/ の中身を見てみると、下記の構成になっています。

$ curl -s http://169.254.169.254/latest/
dynamic
meta-data
user-data

user-data では、対象インスタンスのユーザデータを確認することができます。
dynamic では、動的データ (インスタンスが停止して起動、再起動、起動するときに生成される情報) を纏めて取得することができます。

$ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document
{
  "accountId" : "123456789012",
  "architecture" : "x86_64",
  "availabilityZone" : "ap-northeast-1a",
  "billingProducts" : null,
  "devpayProductCodes" : null,
  "marketplaceProductCodes" : null,
  "imageId" : "ami-XXXXXXXXXXX",
  "instanceId" : "i-XXXXXXXXXXX",
  "instanceType" : "t3.micro",
  "kernelId" : null,
  "pendingTime" : "2023-12-11T04:57:22Z",
  "privateIp" : "192.168.1.218",
  "ramdiskId" : null,
  "region" : "ap-northeast-1",
  "version" : "2017-09-30"
}
$

http://169.254.169.254/latest/meta-data/ を利用することがほとんどだと思いますが、ユーザデータ等の情報を確認する方法も用意されていました。便利ですね。

インスタンスメタデータでしか取得できない情報、利用用途

インスタンスメタデータを取得することで、インスタンスの様々な情報が簡単に取得できることが分かりました。

AWS CLI を利用できないシチュエーションやインターネット接続環境が無い場合にも、確実にインスタンスの情報を取得することが可能です。


ここまでインスタンスメタデータで取得できる情報を見てきましたが、取得できる情報のほとんどは AWS CLI コマンドの describe-instances で代用できるように見えます。

ですが、実際に見比べてみると、取得できる情報には違いがありました。


運用で利用できそうな情報としては、インスタンスのメンテナンス情報が記録されている events/maintenance/history events/maintenance/scheduled などです。

メンテナンスイベントは、インスタンスを利用する上で必ず PHD (Personal Health Dashboard) やメール通知を確認して対応していく必要があります。

インスタンスメタデータで確認することで、対象インスタンスのメンテナンスイベント履歴一覧を確認したい場合等に役立ちそうです。

その他にも、あらゆるトラブルシューティングで必要な情報を取得できるようにインスタンスメタデータは用意されている様でした。


インスタンスメタデータでしか取得できない情報は、下記表の通りです。

カテゴリ 説明
ami-manifest-path Amazon S3 での AMI のマニフェストファイルのパス。Amazon EBS-backed AMI を使用してインスタンスを起動した場合、返される結果は unknown です。
ancestor-ami-ids この AMI を作成するために再バンドルされたあらゆるインスタンスの AMI ID。この値は、AMI マニフェストファイルが ancestor-amis キーを含む場合にのみ存在します。
autoscaling/target-lifecycle-state Auto Scaling インスタンスの移行先となる、ターゲットの Auto Scaling ライフサイクルの状態を示す値。2022 年 3 月 10 日以降、インスタンスがターゲットのライフサイクル状態の 1 つに移行したときに表示されます。
block-device-mapping/ephemeralN 非 NVMe インスタンスストアボリュームの仮想デバイス。N は、各ボリュームのインデックスを示します。ブロックデバイスマッピングのインスタンスストアボリュームの数は、インスタンスのインスタンスストアボリュームの実際の数に一致しない場合があります。
block-device-mapping/swap swap に関連付けられた仮想デバイス。存在しない場合もあります。
events/maintenance/history インスタンスの完了またはキャンセルされたメンテナンスイベントがある場合は、イベントに関する情報を含む JSON 文字列を含みます。詳細については、「完了またはキャンセルされたイベントのイベント履歴を表示するには」を参照してください。
events/maintenance/scheduled インスタンスがアクティブなメンテナンスイベントがある場合は、イベントに関する情報を含む JSON 文字列を含みます。詳細については、予定されたイベントの表示 を参照してください。
events/recommendations/rebalance EC2 インスタンスの再調整推奨通知がインスタンスに対して送信されるおおよその時間 (UTC)。このカテゴリのメタデータの例を次に示します。
identity-credentials/ec2/info identity-credentials/ec2/security-credentials/ec2-instance の認証情報に関する情報。
identity-credentials/ec2/security-credentials/ec2-instance インスタンス上のソフトウェアが自身を AWS に識別し、EC2 Instance Connect や AWS Systems Manager デフォルトのホスト管理設定などの機能をサポートできるようにするインスタンスアイデンティティロール用の認証情報。
instance-action バンドルの準備のために再起動する必要があることをインスタンスに伝えます。有効な値: none, shutdown, bundle-pending。
network/interfaces/macs/mac/network-card-index ネットワークカードのインデックス。インスタンスタイプによっては、複数のネットワークカードがサポートされているものもあります。
services/partition リソースが置かれているパーティションです。標準の AWS リージョンの場合、パーティションは aws です。他のパーティションにリソースがある場合、パーティションは aws-partitionname です。例えば、中国 (北京) リージョンにあるリソースのパーティションは、aws-cn です。

最後に

インスタンスメタデータの概要を知るために、メタデータで取得できる情報を改めて調べました。
このブログがどなたかのお役にたてば幸いです。

参考資料

インスタンスメタデータとユーザーデータ - Amazon Elastic Compute Cloud

インスタンスメタデータの取得 - Amazon Elastic Compute Cloud

インスタンスメタデータのカテゴリ - Amazon Elastic Compute Cloud

インスタンスアイデンティティドキュメント - Amazon Elastic Compute Cloud

describe-instances — AWS CLI 2.0.34 Command Reference

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。