我正在使用权杖和对流层来生成我的体系结构。
在AWS Batch作业定义中,我想参数化作业定义的容器属性的环境:
但是在权杖的背景下,似乎我无法声明这样的内容:
self.JobDefinitionEnvironment = t.add_parameter(Parameter(
'JobDefinitionEnvironment',
Type='List<AWS::Batch::JobDefinition::Environment>'
))
在权杖中:
是否必须编写自己的解析器来解决此问题?即使我编写自己的解析程序来解析JobDefintion :: Environment,解析程序也只会返回一个字符串,而不返回对象列表。
我不应该参数化容器属性并在job-definition.py中对值进行硬编码吗?
我目前正在通过“展平”对象来解决问题,因此我可以提供值。有点丑。
请帮助!
答案 0 :(得分:1)
Cloudformation不支持List<AWS::Batch::JobDefinition::Environment>
(请参阅https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)
有几种解决问题的方法
请注意,我对yaml和jinja的使用更为熟悉,但是波纹管也应与对流层一起使用,如果有机会,我会添加示例
在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(在容器定义中使用的位置)
抱歉,我对节制器不太了解。不知道您是否坚持使用它,或者堆栈器是否对您有用。