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(省略)
\手を動かしながらTerraformを学びたい人にオススメ!/