如何在CloudFormation中引用Secrets Manager SecretString字段内的参数
问题根因
你将SecretString字段的值定义为了纯字符串字面量,CloudFormation 内置函数(如!Ref)只会在模板语法层级做解析,不会识别字符串内部的函数声明,因此你写在JSON字符串内的!Ref会被直接作为普通文本存入密钥,不会完成参数引用替换。
解决方案
共有两种常用实现方式,均可以实现参数自动注入到SecretString的JSON结构中:
方式1:使用!Sub函数插值(兼容性最好)
通过内置的!Sub函数完成参数值的替换,直接构造合法的JSON字符串,修正后的完整模板如下:
AWSTemplateFormatVersion: 2010-09-09 Parameters: Name: Type: String myuserparameter: Type: String mypasswordparameter: Type: String Resources: SecretsManager: Type: AWS::SecretsManager::Secret Properties: Name: !Ref Name # 单行简化写法,直接引用模板参数名即可完成替换 SecretString: !Sub '{"username":"${myuserparameter}","password":"${mypasswordparameter}"}'
如果需要做自定义变量映射,也可以使用!Sub的双参数写法:
SecretString: !Sub - '{"username":"${customUser}","password":"${customPass}"}' - customUser: !Ref myuserparameter customPass: !Ref mypasswordparameter
方式2:使用!ToJsonString函数(更易维护)
如果你的SecretString结构比较复杂,担心手动写JSON出现格式错误,可以使用CloudFormation新版本支持的!ToJsonString函数,直接将YAML对象转换为JSON字符串:
SecretString: !ToJsonString username: !Ref myuserparameter password: !Ref mypasswordparameter
这种写法不需要手动处理JSON引号、逗号等语法,结构更清晰,出错概率更低。
内容的提问来源于stack exchange,提问作者Daniel Fulgido
相关产品推荐
相关产品推荐

