概要
aws-cli の describe-instances ではインスタンスIDを指定してタグ情報を取得できる。
自身のインスタンスIDを取得するには、インスタンスメタデータ取得を利用する。
モチベーション
ansible でプロビジョニングの完了時にタグ情報を更新している。
ほかの独立したスクリプトでプロビジョニングの完了を待機したい。
そのためにタグ情報を取得したい。
スクリプト
# インスタンスメタデータを取得して、自身のインスタンスIDを取得する。
export INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# aws-cli の describe-instances でインスタンスIDを指定して情報を取得する。
# ここでは Name タグを取得している。
NAME=$(aws ec2 describe-instances --instance-ids "${INSTANCE_ID}" --query 'Reservations[0].Instances[0].Tags[?Key==`Name`]|[0].Value')
echo ${NAME}
上記の describe-instances の query では Name タグの値を取得している。
Name タグがない場合、 null の文字列が返ってくる。
$ NAME=$(aws ec2 describe-instances --instance-ids "${INSTANCE_ID}" --query 'Reservations[0].Instances[0].Tags[?Key==`Name`]|[0].Value')
$ echo ${NAME}
"null"
もしくは
"インスタンス名"
インスタンスメタデータ補足
取得について
インスタンスメタデータへのアクセスは「リクエスト/レスポンスメソッドの IMDSv1」と「セッション志向メソッドの IMDSv2」がある。
今回の記事のサンプルでは IMDSv1 を利用している。
インスタンスメタデータオプションにて「IMDSv2 でのアクセスのみ許可」や「インスタンスメタデータへのアクセスをすべてオフ」が設定できる。
うまくいかない場合は確認する。
メタデータまとめて取得
$ curl http://169.254.169.254/latest/dynamic/instance-identity/document/
{
"accountId" : "xxx",
"architecture" : "x86_64",
"availabilityZone" : "ap-northeast-1a",
"billingProducts" : null,
"devpayProductCodes" : null,
"marketplaceProductCodes" : [ "xxx" ],
"imageId" : "ami-xxx",
"instanceId" : "i-xxx",
"instanceType" : "t3.small",
"kernelId" : null,
"pendingTime" : "2019-12-13T10:47:08Z",
"privateIp" : "xxx.xxx.xxx.xxx",
"ramdiskId" : null,
"region" : "ap-northeast-1",
"version" : "xxx"
}
メタデータ各種取得
curl http://169.254.169.254/latest/meta-data/
で取得できるカテゴリがわかる。
$ curl 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-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
product-codes
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
$ curl http://169.254.169.254/latest/meta-data/public-ipv4
xxx.xxx.xxx.xxx
参考ドキュメント
参考記事