当前位置: 首页 > 知识库问答 >
问题:

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

裴俊智
2023-03-14

我有一个嵌套的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::cloud formation::Stack/Properties/Parameters/database password]中不支持SSM安全引用

根据文档,也可以将密码参数定义为特殊的AWS::SSM::参数::值

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

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

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

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


共有2个答案

冉子石
2023-03-14

尝试:

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

即带有撇号。参见文档中的YAML示例:

  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      AccessControl: '{{resolve:ssm:S3AccessControl:2}}' 
阎淮晨
2023-03-14

将安全SSM参数传递给嵌套堆栈的唯一方法是将其作为字符串传递,而不是尝试使用更合理的AWS::SSM::参数::值

下面是一个工作示例:

# 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}}}"

 类似资料:
  • 问题内容: 这是我的代码: 当我评估f(0)时,将出现错误“ x在分配之前被引用”。 但是,当我使用“ print x”代替“ x = x + 1”时,它将起作用。 似乎在g的范围内,我只能将x用作“使用事件”,而不能用作“绑定事件”。我想问题是f仅将x的值传递给g。 我是否正确理解?如果不是,有人可以解释为什么在引用之前未定义“ x = x + 1”的左侧吗? 谢谢 问题答案: 您正确理解了它。

  • 但是这不起作用,因为上下文是在所有解析器之间共享的,因此如果我在查询上有多个,上下文值就不好。 我还尝试在嵌套解析器上使用上可用的。我可以转到字段,但这里没有参数... 我还尝试在上添加一些数据,但这些数据不在嵌套解析器上共享。

  • 我对Java还很陌生,所以这肯定会是一个愚蠢的问题。 这是安全的还是有什么问题?

  • 问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对

  • 我在解一个有很多常数的非线性方程 我创建了一个用于解决以下问题的函数: 然后我想做: 但是正在解包并向函数传递太多参数,因此我得到: TypeError:terminalV()正好接受2个参数(给定6个) 那么,我的问题是,我是否可以通过某种方式将元组传递给调用的函数?

  • 假设我们有python中的函数: 虽然我可能会将传递给A,但我正在寻找一种优雅的方法来传递类似于的东西来执行。 我现在看到的唯一方法是发送一个函数列表并按顺序应用它们。有没有更好的办法?

  • 人们通常如何在React应用程序中拥有“全局”数据? 例如,假设一个用户登录到我的应用程序后,我有以下数据。 但这对我来说似乎很困难,因为这意味着我必须通过每个组合传递数据,只是为了将其传递给需要它的孩子。 是否有一种React方法来管理这种类型的数据? 注意:这个示例非常简化--我喜欢将意图包装成复合,这样整个UI特性的实现细节就可以在我认为合适的时候进行彻底的更改。 编辑:我知道默认情况下,在

  • 我有一个简单的 Servlet 应用程序的安全部分,我需要将参数传递给我的应用程序的安全部分。 流量: 第三方需要使用我的登录机制(简单的安全servlet) 用户尝试转到: mycompany.com/loginApp/login?pref=1 “/login”url是安全的,因此应用程序服务器告诉浏览器重定向到我的登录名.jsp,但此时URL更新为:mycompany.com/loginApp