如何在CloudFormation的SecretStringTemplate中递归传入文件内用户名参数
解决方案
问题根因
AWS::SecretsManager::Secret 资源的 SecretStringTemplate 字段仅接受JSON格式的纯字符串输入,不支持直接传入结构化JSON对象,操作失败是因为没有将构造好的凭证结构转为符合要求的字符串格式。
修正后的模板配置
只需要修改 rRDSInstanceRotationSecret 资源下的 GenerateSecretString.SecretStringTemplate 字段,通过PyPlate将构造的用户凭证字典序列化为JSON字符串即可,示例如下:
Resources: rRDSInstanceRotationSecret: Count: !Ref pDbUserNameCount Condition: cDbUserNameCheck%d Type: AWS::SecretsManager::Secret Properties: Name: | #!PyPlate import ast output = {} output['Fn::Sub'] = f"{ast.literal_eval(params['pDbUserName'])[%d-1]['pName']}" KmsKeyId: "alias/SecretsManager_KMSKey" GenerateSecretString: SecretStringTemplate: | #!PyPlate import ast, json # 解析传入的用户数组 db_user_list = ast.literal_eval(params['pDbUserName']) # 取当前循环对应的用户配置 current_user = db_user_list[%d-1] # 构造凭证结构后序列化为JSON字符串,自动处理特殊字符转义 output = json.dumps({ "username": current_user['pusername'], "masterarn": "<替换为你的实际主密钥ARN>" }) GenerateStringKey: "password" PasswordLength: 16 ExcludeCharacters: "\"@/\\" Tags: <替换为你的实际标签配置>
注意事项
- 部署时需要将参数文件中的
aur_dbuser_params.Dbusername数组序列化为JSON字符串后,传入模板的pDbUserName参数 - Python的
json.dumps方法会自动处理双引号等特殊字符的转义,完全符合SecretsManager的字段校验规则,不需要手动做转义处理
内容的提问来源于stack exchange,提问作者Zack_Coder
相关产品推荐
相关产品推荐

