AWS CLI コマンドを利用可能な全てのリージョンに対して実行する方法
- aws ec2 describe-regionsと- jqによって利用可能な全てのリージョンを取得し、- xargsコマンドで全てのリージョンに対して任意の AWS CLI コマンドを実行すれば OK
全リージョンに対して ec2 describe-instances を実行する例
aws ec2 describe-regions | jq --raw-output ".Regions[].RegionName" | xargs -n 1 -I{} -P 5 aws --region {} ec2 describe-instances利用可能な AWS リージョンの取得
- EC2 で提供されている DescribeRegions API でリージョン情報を取得できる
- AWS CLI の場合 ec2 describe-regionsコマンド
- 厳密に全ての AWS リージョンを取得する場合 - --all-regionsオプションを指定する必要があるが、これは使用するためにオプトインが必要なリージョンがあり、どの AWS アカウントでも全てのリージョンが利用可能では無いので注意- aws ec2 describe-regions
- xargsコマンドに連携するためにリージョン情報を改行された raw text に整形するため- jqを使う
- 
aws ec2 describe-regions | jq --raw-output ".Regions[].RegionName"
xargs あれこれ
- xargsは標準入力で受け取った文字列を使って任意のコマンドを実行できる- この任意のコマンドはマルチプロセスで動かすことも可能なので、複数の処理が必要な場合に便利
 
- オプション - -n: 1コマンドラインが受け取る最大引数の個数
- -P: 最大プロセス数。 0 を指定すると可能な限り多くのプロセスを使う
- しかし Mac 環境で 0 指定すると xargs: max. processes must be >0というエラーが発生する。 BSD というより Mac 独自の制約かもしれない。
- -I: 入力内容の置換
- -I{}と指定することで、任意のコマンドを実行する際に- {}を使い、入力を挿入することができる
- 標準入力関係なく、あるコマンドをマルチプロセスで実行したいような場合 - seq 10 | xargs -n 1 -P 5 -I{} uuidgenという感じで- seqコマンドで回数指定しつつ- -I{}の- {}を使わないことで特定コマンドを任意の回数、マルチプロセスで動かせる- マルチプロセスで SQS にメッセージ投入する例: - seq 100 | xargs -n 1 -P 0 -I{} aws sqs send-message --queue-url $QUEUE_URL --message-body mybody- xargs -n 1 -I{} -P 3 aws --region {} ec2 describe-instances
 
 
■ -P 調整例
-P: 1
% time aws ec2 describe-regions | jq --raw-output ".Regions[].RegionName" | xargs -n 1 -I{} -P 1 aws --region {} ec2 describe-instances
...
aws ec2 describe-regions  0.65s user 0.24s system 87% cpu 1.009 total
jq --raw-output ".Regions[].RegionName"  0.03s user 0.01s system 3% cpu 1.008 total
xargs -n 1 -I{} -P 1 aws --region {} ec2 describe-instances  11.51s user 4.33s system 44% cpu 35.704 total-P: 5
% time aws ec2 describe-regions | jq --raw-output ".Regions[].RegionName" | xargs -n 1 -I{} -P 5 aws --region {} ec2 describe-instances
...
aws ec2 describe-regions  0.73s user 0.32s system 65% cpu 1.600 total
jq --raw-output ".Regions[].RegionName"  0.03s user 0.00s system 2% cpu 1.599 total
xargs -n 1 -I{} -P 5 aws --region {} ec2 describe-instances  15.39s user 5.32s system 148% cpu 13.934 totalこの記事を試した環境
% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H114
% aws --version
aws-cli/2.1.6 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off
% jq --version
jq-1.6- xargsはバージョン表示する機能が見当たらなかったが Mac に標準でインストールされているものを使用した