AWS CLI のレスポンスから、複数のプロパティをまとめて変数化する
概要
AWS CLI のレスポンスから、複数のプロパティを参照したい場面に遭遇しました。
自分の持つ知識だと、 --query
でパースして一つのプロパティを得るのが限界でした。
これでは効率が悪いと思い、一度の AWS CLI で、プロパティをまとめて扱う方法を調べました。
結論
export
, printf
, --query
を活用する。
例)aws sts get-caller-identity
の結果から、UserId
を除いて、 Account
と Arn
だけ取り出す。
export $(
printf "AWS_ACCOUNT=%s ARN=%s" $(
aws sts get-caller-identity --query '[Account,Arn]' --output text
)
)
echo $AWS_ACCOUNT
echo $ARN
現プロセスの環境変数を汚したくないのであれば、サブプロセス内で実行する。
(
export $(
printf "AWS_ACCOUNT=%s ARN=%s" $(
aws sts get-caller-identity --query '[Account,Arn]' --output text
)
)
## 以下、セットした環境変数を使用した任意の処理
## ...
)
仕組み
大きく、以下の3つを実施しています。
-
aws
コマンドの--query
オプションにて、必要なプロパティたちだけ抜き出す -
printf
コマンドにて、"AWS_ACCOUNT=hoge ARN=fuga" という文字列を組み立てる - 手順2で組み立てた文字列を、
export
コマンドにて環境変数として読み込む
aws
コマンドの --query
オプションにて、必要なプロパティたちだけ抜き出す
1. 以下のように記述すると、抜き出したいプロパティだけ抜き出すことが出来る。
--query [{抜き出したいプロパティ名1},{抜き出したいプロパティ名2}]
$ aws sts get-caller-identity
{
"UserId": "hoge",
"Account": "fuga",
"Arn": "arn:aws:iam::fuga:hogera"
}
$ aws sts get-caller-identity --query '[Account,Arn]'
{
"fuga",
"arn:aws:iam::fuga:hogera"
}
--output text
オプションを追加することで、CLIで扱いやすい、タブ区切りの文字列になる。
$ aws sts get-caller-identity --query '[Account,Arn]' --output text
fuga arn:aws:iam::fuga:hogera
より詳しい情報は、公式ドキュメントを参照。
printf
コマンドにて、"AWS_ACCOUNT=hoge ARN=fuga" という文字列を組み立てる
2. printf
関数の %s
修飾子を使用して、export
の文法に合うよう、文字列を組み立てていく。
printf
関数 %s
修飾子の例
printf "first_str=%s second_str=%s" "hoge" "fuga"
first_str=hoge second_str=fuga
第一引数( "first_str=%s second_str=%s"
)
ここで %s
を設定した箇所は、第二引数( "hoge"
)、第三引数( "fuga"
)にて指定した文字列で置換できる。
- イメージとしては、 C言語の
printf
関数や、 python 文字列で使用できるformat
メソッドが近いか
以上を駆使し、 手順1 にて aws
コマンドで得たプロパティを整形していく。
$ printf "AWS_ACCOUNT=%s ARN=%s" $(aws sts get-caller-identity --query '[Account,Arn]' --output text)
AWS_ACCOUNT=hoge ARN=arn:aws:iam::fuga:hogera
printf
関数のより詳しい情報は、マニュアルを参照。
https://man7.org/linux/man-pages/man1/printf.1.html
export
コマンドにて環境変数として読み込む
3. 手順2で組み立てた文字列を、 手順2 が成功すると、以下のような文字列が得られる。
AWS_ACCOUNT=hoge ARN=arn:aws:iam::fuga:hogera
これらを export
コマンドでまとめて環境変数化する。
$ export $(printf "AWS_ACCOUNT=%s ARN=%s" $(aws sts get-caller-identity --query '[Account,Arn]' --output text))
$ echo $AWS_ACCOUNT
hoge
$ echo $ARN
arn:aws:iam::fuga:hogera
シェルスクリプトファイルに記述する場合、いくらか整形できる。
export $(
printf "AWS_ACCOUNT=%s ARN=%s" $(
aws sts get-caller-identity --query '[Account,Arn]' --output text
)
)
冒頭にも書いた通り、現プロセスの環境変数を汚したくないのであれば、サブプロセス内で実行する。
(
export $(
printf "AWS_ACCOUNT=%s ARN=%s" $(
aws sts get-caller-identity --query '[Account,Arn]' --output text
)
)
## 以下、セットした環境変数を使用した任意の処理
## ...
)
aws sts assume-role
コマンドから、AccessKeyId
, SecretAccessKey
, SessionToken
, Expiration
をまとめて取り出す
実践
ROLE_ARN="assume-roleしたいRoleのARN"
export $(
printf "ACCESS_KEY_ID=%s SECRET_ACCESS_KEY=%s SESSION_TOKEN=%s EXPIRATION=%s" $(
aws sts assume-role \
--role-arn $ROLE_ARN \
--role-session-name sample \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken,Expiration]' \
--output text
)
)
echo $ACCESS_KEY_ID
echo $SECRET_ACCESS_KEY
echo $SESSION_TOKEN
echo $EXPIRATION
Discussion