如何在AWS Opsworks中等待超过10分钟的部署完成?
解决AWS Opsworks部署超时后重新等待的问题
你的问题出在递归调用后的退出逻辑上——当aws opsworks wait返回255超时码时,你递归调用了wait_deploy_output,但递归执行完成后,程序会回到最初的函数实例,执行exit $wait_status,而这个wait_status还是最初的255,所以脚本最终还是会以这个码退出,不会持续重试。
另外,递归在bash中如果遇到多次超时,还可能触发栈上限的问题,改用循环会更可靠。这里给你调整后的脚本:
#!/bin/bash wait_deploy_output() { local deployment_id="$1" echo "Waiting for deploy to finish..." while true; do # 执行AWS等待命令 aws opsworks \ --profile "$AWS_PROFILE" \ --region "$AWS_REGION" \ wait deployment-successful \ --deployment-ids "$deployment_id" local wait_status=$? case $wait_status in 0) echo "Deployed successfully!" return 0 ;; 255) echo "Deployment timed out after 10 minutes, retrying immediately..." ;; *) echo "Deployment failed with exit code $wait_status" return $wait_status ;; esac done } # 调用函数,传入部署ID wait_deploy_output "$deployment_id"
脚本说明:
- 用
while true实现无限循环,直到部署成功或出现非超时的失败 - 使用
local关键字定义变量,避免全局变量污染 - 对不同的退出码做分支处理:
- 退出码0:部署成功,输出提示并返回0,结束脚本
- 退出码255:超时,输出重试提示,继续循环执行等待命令
- 其他退出码:判定为部署失败,输出错误码并返回该码,终止脚本
- 给变量加上引号,避免部署ID或配置变量包含空格时出现问题
如果需要在重试前添加一段等待时间(比如避免频繁调用AWS API),可以在255的分支里加上sleep 30(等待30秒),比如:
255) echo "Deployment timed out after 10 minutes, retrying in 30 seconds..." sleep 30 ;;
内容的提问来源于stack exchange,提问作者William Pollet
相关产品推荐
相关产品推荐

