AWS SAM执行sam deploy --guided失败报ROLLBACK_COMPLETE如何解决
根因分析
- 最常见原因是当前AWS账号所属区域开启了S3全局公有访问拦截配置,低版本SAM CLI默认生成的部署 artifacts 存储桶会附带公开访问相关的策略片段,和全局配置冲突导致存储桶策略创建失败,触发CloudFormation栈整体回滚
- 第二常见原因是使用的AdministratorAccess角色附加了限制S3策略创建的权限边界(Permission Boundary),或所属AWS组织配置了禁止创建宽松S3策略的服务控制策略(SCP),两类策略优先级高于身份自身的权限配置,会拦截存储桶策略创建操作
- 少数情况是同区域之前部署过同名SAM项目,残留了冲突的存储桶资源,新部署的策略和已有存储桶的配置不兼容
修复步骤
- 清理残留失败栈
登录AWS CloudFormation控制台,找到状态为ROLLBACK_COMPLETE的对应部署栈,执行删除操作,避免后续部署出现资源冲突 - 调整SAM部署参数,强制使用私有部署桶
执行部署命令时追加--s3-private-buckets参数,完整命令为:
该参数会强制SAM生成私有存储桶配置,不会携带公开访问相关的策略片段,直接避开和全局S3公有访问拦截规则的冲突。如果需要长期生效,可以在项目根目录的sam deploy --guided --s3-private-bucketssamconfig.toml的[default.deploy.parameters]段落下新增配置项:s3_private_buckets = true - 升级SAM CLI到最新版本
旧版本SAM CLI存在默认存储桶策略不符合AWS最新S3安全规范的问题,执行以下命令升级即可:pip install aws-sam-cli --upgrade - 排查账号层面策略限制
- 检查当前使用的IAM角色是否附加了权限边界,确认边界规则中没有拒绝
s3:PutBucketPolicy操作的配置 - 如果是企业组织下的子账号,确认组织管理员没有配置禁止创建宽松S3存储桶策略的SCP规则
- 检查当前使用的IAM角色是否附加了权限边界,确认边界规则中没有拒绝
- 清理残留存储桶(可选)
如果是历史部署残留的存储桶导致的冲突,登录S3控制台找到对应同名存储桶,清空对象后删除存储桶,再重新执行部署即可
内容的提问来源于stack exchange,提问作者devcrazy
相关产品推荐
相关产品推荐

