将安全 SSM 参数传递到嵌套的 CloudFormation 堆栈

Sla*_* II 5 amazon-web-services aws-cloudformation ssm

我有一个嵌套的 CloudFormation 堆栈模板,用于描述数据库及其相关资源。我需要为各种环境创建多个数据库(例如stageqa,,prod

\n\n

我将每个环境的数据库密码作为安全字符串存储在 SSM 参数存储中,例如:

\n\n
    \n
  • /acme/stage/DB_PASSWORD
  • \n
  • /acme/qa/DB_PASSWORD
  • \n
  • /acme/prod/DB_PASSWORD
  • \n
\n\n

我尝试解析父模板中的 SSM 参数并将其传递到嵌套堆栈,但看起来它不起作用。

\n\n
# parent.template\n\nStageDatabaseStack:\n  Type: AWS::CloudFormation::Stack\n  Properties:\n    TemplateURL: "\xe2\x80\xa6/database.template"\n    Parameters:\n      DatabasePassword: \'{{resolve:ssm-secure:/acme/stage/DB_PASSWORD:1}}\'\n\nQaDatabaseStack:\n  Type: AWS::CloudFormation::Stack\n  Properties:\n    TemplateURL: "\xe2\x80\xa6/database.template"\n    Parameters:\n      DatabasePassword: \'{{resolve:ssm-secure:/acme/qa/DB_PASSWORD:1}}\'\n\nProdDatabaseStack:\n  Type: AWS::CloudFormation::Stack\n  Properties:\n    TemplateURL: "\xe2\x80\xa6/database.template"\n    Parameters:\n      DatabasePassword: \'{{resolve:ssm-secure:/acme/prod/DB_PASSWORD:1}}\'\n\n\n# database.template\n\nAWSTemplateFormatVersion: "2010-09-09"\n\nParameters:\n  DatabasePassword:\n    Type: String\n\nResources:\n  Database:\n    Type: AWS::RDS::DBInstance\n    Properties:\n      MasterUserPassword: !Ref DatabasePassword\n
Run Code Online (Sandbox Code Playgroud)\n\n

这种方法给了我一个错误:

\n\n
\n

调用 CreateStack 操作时发生错误 (ValidationError):[AWS::CloudFormation::Stack/Properties/Parameters/DatabasePassword] 中不支持 SSM 安全引用

\n
\n\n
\n\n

根据文档,还可以将密码参数定义为特殊的AWS::SSM::Parameter::Value<String>类型,但指出:

\n\n
\n

AWS CloudFormation 不支持将模板参数定义为 SecureString Systems Manager 参数类型。

\n
\n\n

我实际上尝试过使用它,但它给了我一个错误:

\n\n
\n

模板引用的参数 [/acme/stage/DB_PASSWORD] 具有 CloudFormation 不支持的类型。

\n
\n\n
\n\n

那么,在这种情况下,如何实际将安全数据库密码传递给数据库资源?我想使用单个 CloudFormation 模板来管理所有三个数据库及其相关资源。

\n

Sla*_* II 4

我发现将安全 SSM 参数传递到嵌套堆栈的唯一方法是将其作为字符串传递,而不是尝试使用更明智的方法,AWS::SSM::Parameter::Value<String>然后通过使用函数构建动态引用来解析嵌套堆栈中的安全值!Sub

这是一个工作示例:

# parent.template

StageDatabaseStack:
  Type: AWS::CloudFormation::Stack
  Properties:
    Parameters:
      DatabasePasswordSsmKey: "/acme/stage/DB_PASSWORD:1"

ProdDatabaseStack:
  Type: AWS::CloudFormation::Stack
  Properties:
    Parameters:
      DatabasePasswordSsmKey: "/acme/prod/DB_PASSWORD:1"
Run Code Online (Sandbox Code Playgroud)
# database.template

Parameters:
  DatabasePasswordSsmKey:
    Description: SSM property key for database password
    Type: String

Database:
  Type: AWS::RDS::DBInstance
  Properties:
    MasterUserPassword: !Sub "{{resolve:ssm-secure:${DatabasePasswordSsmKey}}}"
Run Code Online (Sandbox Code Playgroud)