【AWS CLI】jq不要!Assume Roleの一時クレデンシャルを環境変数にセットする完全ワンライナー
AWS CLIで別のアカウントやEC2用のIAMロールを引き受ける(Assume Roleする)際、~/.aws/config を汚さずに環境変数でサクッと済ませたい場面があります。
EC2に割り当てたロールでしか書き込めないS3バケットにちょっとファイルを上げるために、EC2にファイルを上げて、EC2に入ってS3に上げる、がなんか面倒くさくてワンライナー書いてみました。
一時クレデンシャル(AccessKey、SecretKey、SessionToken)を取得して環境変数にエクスポートする処理は、通常JSONのパースが必要になるため jq コマンドがよく使われます。しかし、環境によっては jq が入っていないこともあります。
そこで今回は、AWS CLIの標準機能と awk だけを使い、1行で完結させる完全ワンライナーを備忘録としてまとめました。
🚀 ワンライナーのコマンド
以下のコマンドの arn:aws:iam::123456789012:role/your-role-name の部分を、引き受けたいIAMロールのARNに書き換えて実行してください。(※事前に元のIAMユーザーから対象ロールへのAssumeRole権限が許可されている必要があります)
eval $(aws sts assume-role --role-arn arn:aws:iam::123456789012:role/your-role-name --role-session-name S3AccessSession --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text | awk '{print "export AWS_ACCESS_KEY_ID="$1" AWS_SECRET_ACCESS_KEY="$2" AWS_SESSION_TOKEN="$3}')
これを実行するだけで、現在のシェルに3つの環境変数がセットされ、以降のAWS CLIコマンドが指定したロールの権限で実行されるようになります。
🔍 コマンドの解説(何が起きているのか)
この1行は、大きく4つのステップに分解できます。
1. ロールの引き受け(APIリクエスト)
aws sts assume-role --role-arn arn:aws:iam::... --role-session-name S3AccessSession
sts assume-role コマンドで一時クレデンシャルを要求します。--role-session-name はCloudTrailなどのログに残る識別名なので任意の文字列で構いません。
2. 必要な値の抽出とテキスト化(AWS CLIの機能)
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text
ここが jq を不要にしている肝です。
AWS CLI標準の --query オプション(JMESPathによるフィルタリング)を使い、JSONの中から必要な3つの値だけを配列として取り出します。さらに --output text を指定することで、JSONではなくタブ区切りのプレーンテキストとして出力させます。
出力イメージ:
ASIAXXXX... yyyyyy/zzzzzz... IQoJb3JpZ2...
3. exportコマンド文字列の組み立て(awk)
| awk '{print "export AWS_ACCESS_KEY_ID="$1" AWS_SECRET_ACCESS_KEY="$2" AWS_SESSION_TOKEN="$3}'
パイプ(|)で渡されたタブ区切りの文字列を awk で受け取ります。$1, $2, $3 にそれぞれキーが格納されているので、それらを繋ぎ合わせてシェルで実行可能な export コマンドの文字列を作ります。
出力イメージ:
export AWS_ACCESS_KEY_ID=ASIAXXXX... AWS_SECRET_ACCESS_KEY=yyyyyy/zzzzzz... AWS_SESSION_TOKEN=IQoJb3JpZ2...
4. カレントシェルでの実行(eval)
eval $(...)
最後に、全体を $() で囲んで実行結果(awk が作った文字列)を取得し、eval コマンドに渡します。これにより、単なる文字列だったものが現在のシェル環境で実際のコマンドとして実行され、環境変数が適用されます。
✅ 確認とリセットの方法
正しくセットされたか確認する
env | grep AWS_
3つの変数が表示されれば成功です。
元の権限(IAMユーザー)に戻す
作業が終わり、一時クレデンシャルを破棄したい場合は以下のコマンドで環境変数を削除します。
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
または、ターミナルのウィンドウ(タブ)を閉じてシェルを抜けるだけでもリセットされます。
Note
スクリプトやCI/CDのパイプラインに組み込む場合にも、ツールへの依存を減らせるためこの書き方は非常に重宝します。