用于并行运行 AWS Cli 命令以减少时间的 Bash 脚本

Posted

技术标签:

【中文标题】用于并行运行 AWS Cli 命令以减少时间的 Bash 脚本【英文标题】:Bash Script to run AWS Cli command in parallel to reduce time 【发布时间】:2022-01-01 19:34:46 【问题描述】:

对不起,我还是 bash 脚本的新手。我有大约 10000 个 EC2 实例,我创建了这个 bash 脚本来更改我的 EC2 实例类型,所有实例名称和类型都存储在一个文件中。代码正在运行,但逐个实例运行需要很长时间。

有谁知道我是否可以一次性在所有 EC2 实例上运行 AWS Cli 命令?谢谢:)

#!/bin/bash

my_file='test.txt'

declare -a instanceID
declare -a fmo #Future Instance Size

while IFS=, read -r COL1 COL2; do

   instanceID+=("$COL1")
   fmo+=("$COL2")   

done <"$my_file"

len=$#instanceID[@]

for (( i=0; i < $len; i++)); do

   vm_instance_id="$instanceID[$i]"
   vm_type="$fmo[$i]"

   echo Stoping $vm_instance_id
   aws ec2 stop-instances --instance-ids $vm_instance_id

   echo " Waiting for $vm_instance_id state to be STOP "
   aws ec2 wait instance-stopped --instance-ids $vm_instance_id


   echo Resizing $vm_instance_id to $vm_type 
   aws ec2 modify-instance-attribute --instance-id $vm_instance_id --instance-type $vm_type
   


   echo Starting $vm_instance_id 
   aws ec2 start-instances --instance-ids $vm_instance_id
    

done

【问题讨论】:

【参考方案1】:

将您的代码重构为从文件中传递一行的函数。

work() 
   IFS=, read -r instanceID fmo <<<"$1"
   stuff "$instanceID" "$fmo"

为调用导出函数的每一行文件运行 GNU xargs 或 GNU 并行。使用-P选项并行运行函数,见文档。

export -f work
xargs -P0 -t bash -c 'work "$@"' -- <"$my_file"

【讨论】:

【参考方案2】:

正如@KamilCuk 在这里指出的那样,您可以轻松地使其并行运行。但是,如果您并行运行此脚本,您最终可能会受到 EC2 的限制,因此请确保包含一些退避 + 重试逻辑/遵守此处指定的限制 https://docs.aws.amazon.com/AWSEC2/latest/APIReference/throttling.html

【讨论】:

以上是关于用于并行运行 AWS Cli 命令以减少时间的 Bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

aws CLI使用

从 Golang 运行命令时出现 AWS CLI 错误

运行任何 aws CLI 命令时出现错误“您必须指定一个区域”

如何在 Python 中进行并行编程?

使用 aws cli 获取环境的运行状况很热门

模仿 AWS CLI / gcloud 命令行参数