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 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 使ったら負けだよなと思いつつ、手抜き。