CloudFormation角色链跨账号无法执行GetSecretValue权限问题
解决跨账号CloudFormation动态引用SecretsManager密钥的权限问题
问题根因
CloudFormation的{{resolve:secretsmanager:...}}动态引用机制不会自动触发你配置的角色链(blue_green_role → cross-account-read-secret-role)。它会直接以CloudFormation扮演的blue_green_role身份(即arn:aws:sts::YYYYYYYYYYYY:assumed-role/blue_green_role/AWSCloudFormation)发起SecretsManager请求,而这个身份未被授权访问central_secrets_account中的密钥,因此触发权限报错。
解决方法
方法1:给目标密钥添加资源策略(最直接)
直接在central_secrets_account的目标密钥上配置资源策略,允许blue_green_account的CloudFormation扮演角色读取密钥:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:sts::YYYYYYYYYYYY:assumed-role/blue_green_role/AWSCloudFormation" }, "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:eu-west-2:XXXXXXXXXXXX:secret:secret_name_zzzzzz" } ] }
建议将
Resource限制为具体密钥ARN,最小化权限范围。
方法2:改用Lambda自定义资源实现角色链访问
如果必须保留角色链逻辑,放弃动态引用,改用Lambda-backed自定义资源拉取密钥:
- 在blue_green_account创建Lambda函数,权限策略允许它调用
sts:AssumeRole获取cross-account-read-secret-role的临时凭证 - Lambda核心逻辑:
- 调用
sts:AssumeRole,传入角色ARNarn:aws:iam::XXXXXXXXXXXX:role/cross-account-read-secret-role - 使用返回的临时凭证调用
secretsmanager:GetSecretValue获取密钥内容 - 将密钥结果返回给CloudFormation
- 调用
- 在CloudFormation模板中通过自定义资源节点引用该Lambda,获取密钥值
方法3:修正角色链权限配置(适用于非动态引用场景)
若后续有其他操作需要走角色链,检查以下配置是否正确:
- blue_green_role的权限策略:确保包含扮演跨账号角色的权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::XXXXXXXXXXXX:role/cross-account-read-secret-role" } ] }
- cross-account-read-secret-role的信任策略:确保信任blue_green_role本身(无需包含assumed-role身份):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::YYYYYYYYYYYY:role/blue_green_role" }, "Action": "sts:AssumeRole" } ] }
总结
优先采用方法1,因为动态引用不支持角色链,直接给密钥添加资源策略是最简便的解决方案。
内容的提问来源于stack exchange,提问作者rnoodle
相关产品推荐
相关产品推荐

