如何增大AWS CloudFront缓存失效请求的最大重试次数
问题说明
在GitHub Actions ubuntu-latest(版本22.04)预装AWS CLI的运行环境中,CI流水线执行CloudFront缓存失效创建命令时,偶发服务端内部错误,手动重跑流水线通常可执行成功。
执行的命令如下:
aws cloudfront create-invalidation --distribution-id "${cloudfront_id}" --paths "/*"
报错信息如下:
An error occurred (ServiceUnavailable) when calling the CreateInvalidation operation (reached max retries: 2): CloudFront encountered an internal error. Please try again.
查阅create-invalidation接口官方文档未找到重试配置项及该错误的对应说明,需要通过调整自动重试规则或其他方案解决该偶发问题。
可行解决方案
调整AWS CLI内置重试配置(推荐)
该重试限制是AWS CLI的全局默认配置,不属于CloudFront单接口的参数,默认最大重试次数为2,可以直接通过环境变量或CLI配置调大阈值,适配偶发的服务端临时故障,无需额外引入依赖。
- CI场景下最简便的方式是执行命令时临时注入环境变量,不影响其他步骤的配置:
# 配置最大重试次数为5,使用自适应退避模式动态调整重试间隔,避免触发限流 AWS_MAX_ATTEMPTS=5 AWS_RETRY_MODE=adaptive aws cloudfront create-invalidation --distribution-id "${cloudfront_id}" --paths "/*"
- 如果流水线中存在多个AWS CLI操作需要统一调整重试规则,可以在AWS鉴权步骤后添加配置命令,全局生效:
aws configure set default.max_attempts 5 aws configure set default.retry_mode adaptive
CI层面双层兜底重试
如果需要覆盖CLI内置重试未处理的极端异常场景,可以在流水线步骤层面增加重试逻辑,和CLI内置重试形成双层防护:
- 可以直接在执行命令的shell逻辑中增加循环重试:
#!/bin/bash MAX_RETRY=3 RETRY_INTERVAL=10 for ((i=1; i<=MAX_RETRY; i++)); do aws cloudfront create-invalidation --distribution-id "${cloudfront_id}" --paths "/*" if [ $? -eq 0 ]; then echo "CloudFront缓存失效创建成功" exit 0 fi echo "创建失败,第${i}次重试,等待${RETRY_INTERVAL}秒后再次尝试" sleep $RETRY_INTERVAL done echo "连续${MAX_RETRY}次尝试均失败,退出流水线" exit 1
- 也可以直接使用GitHub Actions步骤级的重试能力,给对应步骤配置失败重试规则。
注意:不建议将重试次数设置为10次以上,如果连续多次重试均失败,优先排查分发ID配置、IAM权限、分发状态是否异常,过高的重试阈值会无意义拉长流水线运行时间。
内容的提问来源于stack exchange,提问作者Amitb
相关产品推荐
相关产品推荐

