如何在CFN模板中将资源引用传递给Python字典?
CloudFormation 中向PyPlate代码块传入!Ref引用值的解决方案
核心原理
!Ref是CloudFormation部署阶段才会执行的内置函数,而SecretStringTemplate下的PyPlate代码本质是字符串文本,CloudFormation不会默认解析字符串内部的!Ref语法,需要先通过CloudFormation的字符串插值函数把引用值注入到PyPlate代码文本中,再交给PyPlate执行。
正确实现代码
GenerateSecretString: SecretStringTemplate: !Sub | #!PyPlate import ast,json creds_dict = {} creds_dict["username"] = ast.literal_eval(params['pDbUserName'])[%d-1]['pUsername'] creds_dict["masterarn"] = "${mastersecret}" output = json.dumps(creds_dict) GenerateStringKey: "password"
执行逻辑说明
- CloudFormation首先会处理外层的
!Sub函数,将代码里的${mastersecret}替换为!Ref mastersecret返回的实际密钥ARN值(AWS::SecretsManager::Secret类型资源的Ref返回值默认就是资源ARN) - 替换完成后的完整Python代码字符串才会被传入PyPlate运行环境执行,此时
masterarn对应的就是你期望的动态资源引用值
注意事项
- 如果你的PyPlate代码中本身存在
$字符(比如正则表达式、其他变量标识),需要把单个$写成$$转义,避免被!Sub误判为插值占位符 - 如果需要传入的资源属性不是Ref返回的默认值,可以用
${资源逻辑ID.属性名}格式的占位符配合!GetAtt的能力,比如要取VPC的Cidr块可以写${MyVpc.CidrBlock}
内容的提问来源于stack exchange,提问作者Zack_Coder
相关产品推荐
相关产品推荐

