🎩

AWS CLI のレスポンスから、複数のプロパティをまとめて変数化する

2024/02/03に公開

概要

AWS CLI のレスポンスから、複数のプロパティを参照したい場面に遭遇しました。

自分の持つ知識だと、 --query でパースして一つのプロパティを得るのが限界でした。

これでは効率が悪いと思い、一度の AWS CLI で、プロパティをまとめて扱う方法を調べました。

結論

export , printf , --query を活用する。

例)aws sts get-caller-identity の結果から、UserId を除いて、 AccountArn だけ取り出す。

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つを実施しています。

  1. aws コマンドの --query オプションにて、必要なプロパティたちだけ抜き出す
  2. printf コマンドにて、"AWS_ACCOUNT=hoge ARN=fuga" という文字列を組み立てる
  3. 手順2で組み立てた文字列を、 export コマンドにて環境変数として読み込む

1. aws コマンドの --query オプションにて、必要なプロパティたちだけ抜き出す

以下のように記述すると、抜き出したいプロパティだけ抜き出すことが出来る。

--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

より詳しい情報は、公式ドキュメントを参照。

2. printf コマンドにて、"AWS_ACCOUNT=hoge ARN=fuga" という文字列を組み立てる

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

3. 手順2で組み立てた文字列を、 export コマンドにて環境変数として読み込む

手順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