EC2でAWS CLIの認証トークンを取得する

EC2インスタンス上でAWS CLIなどで使うAWS_SESSION_TOKENに設定するトークンをIMDSv2を利用して取得するには以下の手順で実行する

# IMDSv2のトークンを取得する
token=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 300")
# ロール名を取得する
role=$(curl -s -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/iam/security-credentials/)
# ロール名を指定してcrednetialを取得する
credential=$(curl -s -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/iam/security-credentials/${role})
# トークンを取得して環境変数に設定する
AWS_SESSION_TOKEN=$(echo $credential | python3 -c 'import json; print(json.loads(input())["Token"])')

IMDSv2のトークンを取得する

IMDSv2のトークンを取得するには、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秒(5分)に設定している。

ロール名を取得する

http://169.254.169.254/latest/meta-data/iam/security-credentials/にGETでロール名を取得する。

$ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/
example-role

ロール名を指定してcrednetialを取得する

http://169.254.169.254/latest/meta-data/iam/security-credentials/ロール名にGETリクエストを送信することで、credentialを取得する。 credentialにはToken などが含まれ、JSON形式で取得できる。

$ curl -s -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/iam/security-credentials/${role}
{ "Code" : "Success", "LastUpdated" : "2024-07-04T23:07:34Z", "Type" : "AWS-HMAC", "AccessKeyId" : "XXXXXXXXXXXXXXXXXXXX", "SecretAccessKey" : "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "Token" : "省略", "Expiration" : "2024-07-05T05:43:29Z" }

アクセスキーやシークレットアクセスキーも含まれる。

トークンを取得して環境変数に設定する

上記で取得したJSON形式のcredentialからTokenを取得して、AWS_SESSION_TOKENに設定する。
jqコマンドが使える場合はjqコマンドを使っても良い。
ここではpythonを使ってTokenを取得している。

echo $credential | python3 -c 'import json; print(json.loads(input())["Token"])'
...TOKEN(省略)

jqコマンドを使う場合は以下のようになる。

echo $credential | jq -r '.Token'
...TOKEN(省略)