Memo/AmazonWebServices/awscli/parallel

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/awscli/parallel
 

parallelで並列実行


parallelを使って並列実行し、実行時間を短縮

  • 複数リージョン、複数アカウントを対象に順次実行すると遅い。並列実行して実行時間を短縮したい
    • 17リージョンがあり、2リージョンにec2がある場合、順次実行に比べて、3倍近く早く完了している
  • 環境
    • Win 10 Pro
    • Ubuntu 18.04 LTS on WSL2
    • awscli v2
  • 全リージョンを AWS_REGIONS 変数に入れる。2021-03時点で17リージョン
    AWS_PROFILE=example
    AWS_REGIONS=$(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text)
    
    parallel echo ::: ${AWS_REGIONS}
    eu-north-1
    ap-south-1
    ...
    us-west-2
  • 順次: ec2のリストを出力
    time for region in $AWS_REGIONS; do \
     aws ec2 describe-instances \
      --query 'sort_by(Reservations[].Instances[].{A_Name:Tags[?Key==`Name`].Value|[0],B_InstanceId:InstanceId,C_PublicDnsName:PublicDnsName,D_State:State.Name}, &D_State)' \
      --output text \
      --profile $AWS_PROFILE \
      --region $region >> ec2.txt; \
    done
    
    real    0m32.432s
    user    0m16.620s
    sys     0m1.444s
  • parallelで並列:
    • 「--query \''...'\'」のようにエスケープしないとエラーになる。
      time parallel aws ec2 describe-instances \
        --query \''sort_by(Reservations[].Instances[].{A_Name:Tags[?Key==`Name`].Value|[0],B_InstanceId:InstanceId,C_PublicDnsName:PublicDnsName,D_State:State.Name}, &D_State)'\' \
        --output text \
        --profile $AWS_PROFILE \
        --region ::: ${AWS_REGIONS} >> ec2.parallel.txt
      
      real    0m12.535s
      user    0m24.561s
      sys     0m3.500s
    • profile, regionも出力したい場合
    • {}: パラメータに置換される。A_0:`{}` がregionに置換される。
    • keyでソートされるので、A_0:として先頭に出力するようにしている
      time echo "${AWS_REGIONS}" | parallel --joblog joblog.txt aws ec2 describe-instances \
        --query \''sort_by(Reservations[].Instances[].{A_10:`'$AWS_PROFILE'`,A_20:`{}`,A_Name:Tags[?Key==`Name`].Value|[0],B_InstanceId:InstanceId,C_PublicDnsName:PublicDnsName,D_State:State.Name}, &D_State)'\' \
        --output text \
        --profile $AWS_PROFILE \
        --region {}
    • パイプ後に処理したい場合。perlで環境変数を出力している。parallel の処理対象外なので{}は展開されない。
      time echo "${AWS_REGIONS}" | parallel --joblog joblog.txt aws ec2 describe-instances \
        --query \''sort_by(Reservations[].Instances[].{A_20:`{}`,A_Name:Tags[?Key==`Name`].Value|[0],B_InstanceId:InstanceId,C_PublicDnsName:PublicDnsName,D_State:State.Name}, &D_State)'\' \
        --output text \
        --profile $AWS_PROFILE \
        --region {} \
        | perl -ane "s/^/${AWS_PROFILE}\t/;print $_;" >> ec2.parallel.txt

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-03-11 (木) 18:24:42 (142d)