4

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

我将 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 模板来管理所有三个数据库及其相关资源。

4

2 回答 2

2

尝试:

'{{resolve:ssm-secure:/acme/stage/DB_PASSWORD:1}}'

即带撇号。请参阅文档中的 YAML 示例

  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      AccessControl: '{{resolve:ssm:S3AccessControl:2}}' 
于 2019-11-30T19:31:51.947 回答
2

我发现将安全 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"
# 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}}}"
于 2019-12-02T23:01:27.330 回答