如何优化Bash脚本并行执行AWS CLI命令批量修改EC2实例规格
EC2实例批量调整规格并行执行方案
完全可以通过并行执行AWS CLI命令大幅缩短操作耗时,以下是可直接使用的优化后脚本,兼顾并发效率和API限流风险:
优化后并行脚本(原生Bash实现,无需额外依赖)
#!/bin/bash my_file='test.txt' # 调整为你需要的最大并发数,建议先从20~50开始测试,避免触发AWS API限流 MAX_PARALLEL=30 # 单台实例规格变更逻辑封装为函数 resize_instance() { local vm_instance_id=$1 local vm_type=$2 local log_file="resize_log_${vm_instance_id}.log" { echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始处理实例: $vm_instance_id,目标规格: $vm_type" # 停止实例 if ! aws ec2 stop-instances --instance-ids "$vm_instance_id" >/dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 实例 $vm_instance_id 停止失败,跳过后续操作" return 1 fi # 等待实例停止 if ! aws ec2 wait instance-stopped --instance-ids "$vm_instance_id" >/dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 实例 $vm_instance_id 等待停止超时/失败,跳过后续操作" return 1 fi # 修改实例规格 if ! aws ec2 modify-instance-attribute --instance-id "$vm_instance_id" --instance-type "$vm_type" >/dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 实例 $vm_instance_id 规格修改失败,跳过后续操作" return 1 fi # 启动实例 if ! aws ec2 start-instances --instance-ids "$vm_instance_id" >/dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 实例 $vm_instance_id 启动失败" return 1 fi echo "[$(date '+%Y-%m-%d %H:%M:%S')] 实例 $vm_instance_id 规格变更完成" } >> "$log_file" 2>&1 } # 并发执行任务 while IFS=, read -r COL1 COL2; do # 跳过空行 [[ -z "$COL1" || -z "$COL2" ]] && continue # 控制并发数,超过阈值就等任意后台进程结束再继续 while (( $(jobs -p | wc -l) >= MAX_PARALLEL )); do sleep 1 done # 后台执行单台实例变更逻辑 resize_instance "$COL1" "$COL2" & done < "$my_file" # 等待所有后台任务执行完成 wait echo "所有实例规格变更任务已执行完成,请检查各实例日志确认执行结果"
注意事项
- 调整
MAX_PARALLEL参数前请先确认你的AWS账号EC2 API的调用速率配额,避免触发限流导致任务失败,首次使用建议先截取test.txt的前10~20条数据做测试 - 每台实例的执行日志会单独存放在
resize_log_实例ID.log文件中,方便快速定位失败任务 - 执行前请先校验test.txt中的实例ID、目标规格格式是否合法,避免不必要的错误
- 针对支持休眠、有EBS优化等特殊配置的实例,请提前确认目标规格是否兼容原有配置,避免变更后无法启动
内容的提问来源于stack exchange,提问作者fawzih91
相关产品推荐
相关产品推荐

