0

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

在 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的列表。

但是在 sceptre 的上下文中,我似乎不能这样声明:

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

在权杖中:

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

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

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

请帮忙!

4

2 回答 2

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 函数

于 2018-08-16T12:17:43.120 回答
0

我不确定你可以用 sceptre 做什么,但是使用 stacker ( 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(在容器定义中使用)

抱歉,虽然我不太了解权杖。不确定您是否一直在使用它,或者 stacker 是否对您有用。

于 2018-08-16T00:04:49.280 回答