cloudformation权杖:如何参数化json对象列表

时间:2018-08-15 23:42:01

标签: amazon-cloudformation troposphere sceptre

我正在使用权杖和对流层来生成我的体系结构。

在AWS Batch作业定义中,我想参数化作业定义的容器属性的环境:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html

环境是https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-environment.html的列表。

但是在权杖的背景下,似乎我无法声明这样的内容:

self.JobDefinitionEnvironment = t.add_parameter(Parameter(
    'JobDefinitionEnvironment',
    Type='List<AWS::Batch::JobDefinition::Environment>'
))

在权杖中:

  1. 是否必须编写自己的解析器来解决此问题?即使我编写自己的解析程序来解析JobDefintion :: Environment,解析程序也只会返回一个字符串,而不返回对象列表。

  2. 我不应该参数化容器属性并在job-definition.py中对值进行硬编码吗?

  3. 我目前正在通过“展平”对象来解决问题,因此我可以提供值。有点丑。

请帮助!

2 个答案:

答案 0 :(得分:1)

Cloudformation不支持List<AWS::Batch::JobDefinition::Environment>(请参阅https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html

有几种解决问题的方法

请注意,我对yaml和jinja的使用更为熟悉,但是波纹管也应与对流层一起使用,如果有机会,我会添加示例

Sceptre_user_data

config/<stack_name>.yaml中添加

sceptre_user_data:
  JobDefinitionEnvironment:
    - <list-goes-here-as-yaml/json>

cfn/<template>.yaml.j2中添加

  myBatchJob
    Type: AWS::Batch::JobDefinition
    Properties:
      Environment:
        {{ sceptre_user_data.JobDefinitionEnvironment }}

母语

要原生执行此操作,可以使用Type: CommaDelimitedList并选择,这有点麻烦

Parameters:
  BatchEnvironmentSetting1:
    Type: CommaDelimitedList
    Default: MySetting,MyValue

Resources:
  myBatchJob:
    Type: AWS::Batch::JobDefinition
    Properties:
      Environment:
       - Name: !Select [0, BatchEnvironmentSetting]
         Value: !Select [1, BatchEnvironmentSetting]

带有条件和循环

如果本机方法对您有用,那么您可以将值设置为可选(使用循环可以减轻痛苦

Parameters:
  {% for i in range(20) %}
  BatchEnvironmentSetting{{ i }}:
    Type: CommaDelimitedList
    Default: ''
  {% endfor %}

Conditions:
  {% for i in range(20) %}
  UseBatchEnvironmentSetting{{ i }}: !Not [!Equals [BatchEnvironmentSetting{{ i }}, '']] 
  {% endfor %}


Resources:
  myBatchJob:
    Type: AWS::Batch::JobDefinition
    Properties:
      Environment:
       {% for i in range(20) %}
       - !If 
         - UseBatchEnvironmentSetting{{ i }}
         - Name: !Select [0, BatchEnvironmentSetting{{ i }}]
           Value: !Select [1, BatchEnvironmentSetting{{ i }}]
         - !Ref AWS::NoValue
      {% endfor %}

这种循环是对流层可以使代码更整洁的地方之一,因为您可以具有实现所有3个循环的AddEnviornmentSetting函数

答案 1 :(得分:0)

我不确定您可以使用sceptre做什么,但是使用堆栈器(http://stacker.readthedocs.io/en/latest),您只需将定义列表作为变量,然后在蓝图中使用该变量(用对流层编写)

开源ECS蓝图是一个可能有意义的示例:

https://github.com/cloudtools/stacker_blueprints/blob/master/stacker_blueprints/ecs.py#L69-L74(定义变量的地方)

https://github.com/cloudtools/stacker_blueprints/blob/master/stacker_blueprints/ecs.py#L69-L74(在这里我们将变量字典变成ECS期望的对象列表)

https://github.com/cloudtools/stacker_blueprints/blob/master/stacker_blueprints/ecs.py#L296(在容器定义中使用的位置)

抱歉,我对节制器不太了解。不知道您是否坚持使用它,或者堆栈器是否对您有用。