CloudFormation为何使用陌生角色执行更新?栈更新权限问题求解
解决CloudFormation栈更新权限及角色假定问题
问题根源分析
- 第一个权限错误:CloudFormation栈默认沿用首次创建/最近一次更新时使用的执行角色(即错误中的
NotAdmin角色),即使你当前使用的是管理员权限角色,CFN仍会调用该旧角色执行资源变更操作,而NotAdmin缺少iam:PutRolePolicy权限导致失败。 - 第二个验证错误:指定的
RoleWithAdminAccess角色的信任策略未配置允许你当前使用的管理员角色去假定它,或ARN存在拼写错误。
解决方案
方案一:临时扩展旧执行角色权限(快速解决)
- 给
NotAdmin角色添加允许操作目标角色zzzz的iam:PutRolePolicy权限:- 创建自定义IAM策略(JSON格式):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PutRolePolicy", "Resource": "arn:aws:iam::xxxxx:role/zzzz" } ] } - 将该策略附加到
NotAdmin角色。
- 创建自定义IAM策略(JSON格式):
- 重新执行原CloudFormation更新命令即可完成操作。
方案二:切换栈的执行角色为管理员角色(彻底解决)
- 检查
RoleWithAdminAccess的信任策略,确保允许你当前使用的管理员角色假定它:- 修改信任策略为类似以下内容(替换为你的管理员角色ARN):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::xxxxx:role/YourCurrentAdminRole" }, "Action": "sts:AssumeRole" } ] }
- 修改信任策略为类似以下内容(替换为你的管理员角色ARN):
- 执行带
--role-arn参数的更新命令,必须同时指定模板内容(CloudFormation更新要求提供模板):
(若模板存储在S3,改用aws cloudformation update-stack \ --region xxx \ --stack-name xxx \ --template-body file://your-stack-template.yaml \ --role-arn arn:aws:iam::xxx:role/RoleWithAdminAccess--template-url https://s3.amazonaws.com/your-bucket/template.yaml) - 操作成功后,后续栈更新将默认使用
RoleWithAdminAccess角色,无需再指定参数。
额外提示
- 可通过以下命令查看栈当前的执行角色:
aws cloudformation describe-stacks --stack-name xxx --region xxx --query "Stacks[0].RoleARN" - 若使用AWS控制台操作,在更新栈的“高级选项”中找到“执行角色”,选择
RoleWithAdminAccess即可。
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

