AdministratorAccess
,所以我预计更新不会遇到权限问题。但是,我收到了一个奇怪的错误消息:
API:
用户:iam:PutRolePolicy
无权对资源:角色arn:aws:sts::xxxxx:assumed-role/NotAdmin/yyyy
执行:iam:PutRolePolicy
,因为没有基于身份的策略允许执行zzzz
操作iam:PutRolePolicy
错误消息中角色的 ARN 与我用于推送更新的用户不同。这是一个权限有限的角色,脚本用于定期更新该堆栈。
我尝试使用明确的
--role-arn
参数:
aws cloudformation update-stack --region xxx --stack-name xxx --role-arn arn:aws:iam::xxx:role/RoleWithAdminAccess
但是后来我收到了这个错误消息:
调用 UpdateStack 操作时发生错误 (ValidationError):角色 arn:aws:iam::xxx:role/RoleWithAdminAccess 无效或无法假定
我怎样才能让这个堆栈更新发挥作用?
发生此问题是因为
--role-arn
是“粘性”
来自
https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack.html
如果您不指定值,CloudFormation 将使用之前与堆栈关联的角色。如果没有可用的角色,CloudFormation 将使用根据您的用户凭据生成的临时会话。
在指定
--role-arn
之前,CFN确实正在使用基于用户凭据的会话并拥有所有权限。但是,在指定 --role-arn NotAdmin
的第一次更新之后,CFN 现在会将该角色记住为“堆栈角色”。未指定 --role-arn
的后续更新默认使用该角色,因此会出现权限问题。
至于为什么
RoleWithAdminAccess
不能被假定——那是因为通过 --role-arn
使用角色而不是默认会话继承需要显式授予 Principal: {Service: "cloudformation.amazonaws.com"}
来允许假定角色