CloudFormation跨区域引用同账号Secrets Manager密钥失败求助
问题
在us-east-1区域创建了一个Secrets Manager密钥,在该区域部署CloudFormation栈时,使用以下动态引用语句可正常解析:
{{resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:<accountId>:secret:<secretName>:SecretString:<secretKey>::}}
但在eu-west-2区域部署另一个栈时,使用完全相同的引用语句,出现如下错误:
Secrets Manager can't find the specified secret. (Service: AWSSecretsManager; Status Code: 400; Error Code: ResourceNotFoundException; Request ID:
; Proxy: null)
根据AWS CloudFormation文档,指定完整ARN作为secret-id时支持跨账号解析密钥,但未找到跨区域相关说明,现咨询:是否遗漏配置导致无法跨区域引用同账号密钥?或者该功能本身不被支持?
解答
- 核心结论:CloudFormation的Secrets Manager动态引用默认不支持跨区域解析。即使指定了完整ARN,部署栈时CloudFormation会调用当前区域(eu-west-2)的Secrets Manager服务端点,而该端点无法直接访问其他区域(us-east-1)的密钥资源,这就是你遇到
ResourceNotFoundException的原因。 - 可行替代方案:
- 跨区域复制密钥:利用Secrets Manager的跨区域复制功能,在eu-west-2区域创建us-east-1密钥的副本并开启自动同步,之后在栈中引用该副本的ARN或名称。
- 自定义资源拉取密钥:编写Lambda自定义资源,在栈部署时跨区域调用us-east-1的Secrets Manager API获取密钥值,再传递给CloudFormation资源。需确保Lambda具备访问目标区域密钥的IAM权限。
- 参数传递(不推荐):手动获取us-east-1密钥的值,将其作为栈参数传入。但此方式会导致密钥值以明文形式出现在栈参数和执行记录中,存在安全风险。
参考文档(翻译)
AWS CloudFormation动态引用Secrets Manager的关键规则:
- 动态引用格式为
{{resolve:secretsmanager:secret-id:SecretString:json-key::version-stage}} - 当指定完整ARN作为
secret-id时,支持跨AWS账号解析密钥,但需确保目标账号的CloudFormation拥有访问源账号密钥的权限。 - 若未指定ARN,CloudFormation会在当前栈部署的区域查找对应名称的密钥。
内容的提问来源于stack exchange,提问作者Milan Gatyás
相关产品推荐
相关产品推荐

