簡體   English   中英

將安全 SSM 參數傳遞給嵌套的 CloudFormation 堆棧

[英]Pass secure SSM parameter to a nested CloudFormation stack

我有一個描述數據庫及其相關資源的嵌套 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 安全引用


根據docs ,也可以將密碼參數定義為特殊的AWS::SSM::Parameter::Value<String>類型,但聲明如下:

AWS CloudFormation 不支持將模板參數定義為 SecureString Systems Manager 參數類型。

我實際上嘗試過使用它,但它給了我一個錯誤:

模板引用的參數 [/acme/stage/DB_PASSWORD] 具有 CloudFormation 不支持的類型。


那么,在這種情況下,我如何實際將安全數據庫密碼傳遞給數據庫資源? 我想使用一個 CloudFormation 模板來管理所有三個數據庫及其相關資源。

嘗試:

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

即帶撇號。 請參閱文檔中的 YAML 示例

  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      AccessControl: '{{resolve:ssm:S3AccessControl: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}}}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM