curlコマンドでIMDSv1のアカウントIDを取得する
EC2インスタンスでは169.254.169.254
にHTTPでアクセスするとインスタンスのメタデータを取得できる。
アカウントIDはhttp://169.254.169.254/latest/dynamic/instance-identity/document
に含まれている。
EC2でcurl
を使って以下のように確認できる。
$ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document
{
"accountId" : "123456789012",
"architecture" : "",
"availabilityZone" : "",
"billingProducts" : null,
"devpayProductCodes" : null,
"marketplaceProductCodes" : null,
"imageId" : "",
"instanceId" : "",
"instanceType" : "",
"kernelId" : null,
"pendingTime" : "",
"privateIp" : "",
"ramdiskId" : null,
"region" : "",
"version" : ""
}
そのEC2インスタンスが属するAWSアカウントのアカウントIDはaccountId
キーで取得できる。
IMDSv1でアカウントIDを取得するワンライナー
jqコマンドを使う場合
jq
コマンドを使ってaccountId
キーの値を取得する。
$ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | \
jq -r .accountId
123456789012
sedコマンドを使う場合
jq
コマンドをインストールしていないサーバの場合は以下のようにsed
コマンドを使ってaccountId
キーの値を取得できる。
$ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | \
sed -n 's/.*"accountId" : "\(.*\)".*/\1/p'
123456789012
awkコマンドを使う場合
以下ではawk
コマンドを使ってaccountId
キーの値を取得する。
$ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | \
awk -F'"' '/accountId/ {print $4}'
123456789012
grepコマンドを使う場合
以下ではgrep
コマンドを使ってaccountId
キーの値を取得する。
$ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | \
grep -oP '"accountId" : "\K[^"]+'
123456789012
IMDSv2でアカウントIDを取得するワンライナー
IMDSv2では事前にトークンを取得し、X-aws-ec2-metadata-token
ヘッダに指定してリクエストする必要がある。
トークンを取得するにはhttp://169.254.169.254/latest/api/token
に対してPUT
メソッドでリクエストする。
$ TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 300")
X-aws-ec2-metadata-token-ttl-seconds
ヘッダでは取得したトークンの有効期限を指定する。
上記では300秒に設定している。
こうして取得したトークンをX-aws-ec2-metadata-token
ヘッダに指定して以下のように情報を取得する。
$ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/dynamic/instance-identity/document
{
"accountId" : "123456789012",
"architecture" : "",
"availabilityZone" : "",
"billingProducts" : null,
"devpayProductCodes" : null,
"marketplaceProductCodes" : null,
"imageId" : "",
"instanceId" : "",
"instanceType" : "",
"kernelId" : null,
"pendingTime" : "",
"privateIp" : "",
"ramdiskId" : null,
"region" : "",
"version" : ""
}
jqコマンドを使う場合
IMDSv2でもjq
コマンドを使ってaccountId
キーの値を取得する。
TOKENを取得してヘッダに指定する部分を除けばIMDSv1と同じ。
$ TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 300")
$ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/dynamic/instance-identity/document | \
jq -r .accountId
123456789012
sedコマンドを使う場合
IMDSv2でsed
コマンドを使ってaccountId
キーの値を取得する。
$ TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 300")
$ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/dynamic/instance-identity/document | \
sed -n 's/.*"accountId" : "\(.*\)".*/\1/p'
123456789012
awkコマンドを使う場合
IMDSv2でawk
コマンドを使ってaccountId
キーの値を取得する。
$ TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 300")
$ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/dynamic/instance-identity/document | \
awk -F'"' '/accountId/ {print $4}'
123456789012
grepコマンドを使う場合
IMDSv2でgrep
コマンドを使ってaccountId
キーの値を取得する。
$ TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 300")
$ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/dynamic/instance-identity/document | \
grep -oP '"accountId" : "\K[^"]+'
123456789012