我有一个描述数据库及其相关资源的嵌套 CloudFormation 堆栈模板。我需要为各种环境(例如stage
、qa
、prod
)创建多个数据库。
我将 SSM 参数存储中每个环境的数据库密码存储为安全字符串,例如:
/acme/stage/DB_PASSWORD
/acme/qa/DB_PASSWORD
/acme/prod/DB_PASSWORD
我试图解析父模板中的 SSM 参数并将其传递给嵌套堆栈,但看起来它不起作用。
# parent.template
StageDatabaseStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: "…/database.template"
Parameters:
DatabasePassword: '{{resolve:ssm-secure:/acme/stage/DB_PASSWORD:1}}'
QaDatabaseStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: "…/database.template"
Parameters:
DatabasePassword: '{{resolve:ssm-secure:/acme/qa/DB_PASSWORD:1}}'
ProdDatabaseStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: "…/database.template"
Parameters:
DatabasePassword: '{{resolve:ssm-secure:/acme/prod/DB_PASSWORD:1}}'
# database.template
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
DatabasePassword:
Type: String
Resources:
Database:
Type: AWS::RDS::DBInstance
Properties:
MasterUserPassword: !Ref DatabasePassword
这种方法给了我一个错误:
调用 CreateStack 操作时发生错误 (ValidationError):[AWS::CloudFormation::Stack/Properties/Parameters/DatabasePassword] 中不支持 SSM 安全引用
根据文档,也可以将密码参数定义为特殊AWS::SSM::Parameter::Value<String>
类型,但声明是:
AWS CloudFormation 不支持将模板参数定义为 SecureString Systems Manager 参数类型。
我实际上已经尝试过使用它,但它给了我一个错误:
模板引用的参数 [/acme/stage/DB_PASSWORD] 具有 CloudFormation 不支持的类型。
那么,在这种情况下,我如何实际将安全数据库密码传递给数据库资源?我想使用单个 CloudFormation 模板来管理所有三个数据库及其相关资源。