将多个参数传递给YAML CloudFormation中的DBParameterGroup

时间:2018-09-06 20:43:35

标签: yaml amazon-cloudformation

我有以下cloudformation模板。目标是仅在用户需要时创建参数组,然后使用cloudformation模板参数的内容填充参数组中的RDS参数。

Parameters:
  UseCustomParameterGroup:
    Description: Toggle to 'Yes' to create a new parameter group.
    Type: String
    AllowedValues: ['Yes', 'No']
    Default: 'No'
  CustomParameters:
    Description: Add custom parameters to your custom parameter group. Creating a custom parameter group without parameters creates a mirror of the default group.
    Type: String
Conditions:
  UseCustomParameterGroup: !Equals [!Ref 'UseCustomParameterGroup', 'Yes']
Resources:
  CustomParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Condition: 'UseCustomParameterGroup'
    Properties:
      Family: "postgres10"
      Parameters: !Ref "CustomParameters"

如果我这样从另一个模板调用此模板,它将失败并显示错误Value of property Parameters must be an object

Parameters:
  USECUSTOMPARAMETERGROUP: 'Yes'
  CUSTOMPARAMETERS: '{
    "shared_preload_libraries": "pg_stat_statements",
    "pg_stat_statements.track": "all"
  }'
Resources:
  Postgres:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://..../rds-postgres-instance.yaml
      TimeoutInMinutes: '60'
      Parameters:
        UseCustomParameterGroup: !Ref USECUSTOMPARAMETERGROUP
        CustomParameters: !Ref CUSTOMPARAMETERS

AWS::RDS::DBParameterGroup的文档对Parameters参数规定如下:

  

类型:一个由字符串键值对组成的JSON对象,如以下示例所示

     

“参数”:{“ Key1”:“ Value1”,“ Key2”:“ Value2”,“ Key3”:“ Value3”}

我认为对于Cloudformation的YAML版本来说,这可能已经过时了,但是没有关于如何传递此值多个参数的文档。

我希望用户能够根据需要定义尽可能少的RDS参数,而不必考虑RDS可用的数千个可能参数中的任何一个。

1 个答案:

答案 0 :(得分:0)

Cloudformation不允许您将字符串参数转换为JSON对象(或YAML),您的参数应用作定义键的值。

诸如无服务器之类的其他一些框架通过使用另一种模板语言克服了这一限制,该模板语言在经过一些处理后会生成与Cloudformation兼容的工件,如果此功能对您的流程至关重要,我建议您迁移到其中一个框架。