おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

fishでAWS Organizations配下のアカウントに同じコマンドを投げるスクリプト

環境調査のためにOrganization配下のAWSアカウントすべてにコマンド実行したいということがあったりする。fishを使っているので、関数を作って使っているのでメモ。

~/.config/fish/functions/ 配下に maws.fish としてつくる

function maws
  set accounts (aws organizations list-accounts --query 'Accounts[].Id' --output text | string match -ra '\d+')
  echo "call aws command in these accounts: $accounts"

  for account in $accounts
    echo "[$account]"

    set assumerole (aws sts assume-role --role-arn arn:aws:iam::$account:role/OrganizationAccountAccessRole --role-session-name (whoami))

    if test $status -eq 0
      set -x AWS_ACCESS_KEY_ID (echo $assumerole | jq -r '.Credentials.AccessKeyId')
      set -x AWS_SECRET_ACCESS_KEY (echo $assumerole | jq -r '.Credentials.SecretAccessKey')
      set -x AWS_SESSION_TOKEN (echo $assumerole | jq -r '.Credentials.SessionToken')

      aws $argv
    end

    echo ""

    set -e AWS_ACCESS_KEY_ID
    set -e AWS_SECRET_ACCESS_KEY
    set -e AWS_SESSION_TOKEN
  end

end

一旦、 ふつうのaws cli

aws ec2 describe-vpcs --query Vpcs[].[OwnerId,VpcId,CidrBlock] --output text

といった感じで単一アカウントで確認してOKだったら

maws ec2 describe-vpcs --query Vpcs[].[OwnerId,VpcId,CidrBlock] --output text

とするだけ。

動作の補足

環境変数に認証情報が存在すると、優先順位として強いので、Organizationの親アカウントの認証情報をもって実行し、Assume Roleして、環境変数をセット、削除するという流れ

jq 使ったら負けだよなと思いつつ、手抜き。