はじめに
以下のようにCloudShellでAWS CLIコマンドを並列実行する際、同時実行数が20を超えてくるとError when retrieving credentials from container-role
というエラーが発生するようになる。
こちらの対処方法について調べても見つからなかったので、AWSに問い合わせてみた。
# このくらいであればエラー無し
$ for i in {1..5}; do (aws ec2 describe-regions > /dev/null && echo $i) & done
~略~
3
2
4
1
5
# 20件を超えると発生しやすくなる
$ for i in {1..30}; do (aws ec2 describe-regions > /dev/null && echo $i) & done
~略~
27
2
~略~
28
Error when retrieving credentials from container-role: Error retrieving metadata: Received non 200 response (503) from ECS metadata: <html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>
Error when retrieving credentials from container-role: Error retrieving metadata: Received non 200 response (503) from ECS metadata: <html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>
Error when retrieving credentials from container-role: Error retrieving metadata: Received non 200 response (503) from ECS metadata: <html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>
~略~
回答
Cloud Shell の内部仕様により、一定回数以上のAWS CLIコマンドを実行すると、実行に必要な認証情報の取得に失敗するとのこと。
また、こちらの緩和申請もできないとのこと。
そのため、Cloud Shellで並列実行する際は、xargs
のP
オプション等で実行回数を制限した方が良い。
# 同時実行回数を実行回数と同等(=30回)にする (-P 30)
seq 30 | xargs -P 30 aws ec2 describe-regions --query "Regions[0].RegionName" ;
~略~
Error when retrieving credentials from container-role: Error retrieving metadata: Received non 200 response (503) from ECS metadata: <html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>
~略~
# 同時実行回数を10回に制限する (-P 10)
seq 30 | xargs -P 10 aws ec2 describe-regions --query "Regions[0].RegionName" ;
# エラーなし
get-user
の例
list-users
で取得した全ユーザーでget-user
を行う場合。
# for文だと、ユーザー数によってはエラーになる
$ for u in `aws iam list-users --query 'Users[*].UserName' --output text`; do aws iam get-user --user-name $u & done
~
Error when retrieving credentials from container-role: Error retrieving metadata: Received non 200 response (503) from ECS metadata: <html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>
# xargs
## -P 100 だとエラー
$ aws iam list-users --query 'Users[*].UserName' | jq -r '.[]' | xargs -I NAME -P 100 aws iam get-user --user-name NAME
~
Error when retrieving credentials from container-role: Error retrieving metadata: Received non 200 response (503) from ECS metadata: <html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>
## -P 20 だとエラーなし
$ aws iam list-users --query 'Users[*].UserName' | jq -r '.[]' | xargs -I NAME -P 20 aws iam get-user --user-name NAME