【问题标题】:cloudformation sceptre: How to parameterize a list of json objectscloudformation sceptre:如何参数化 json 对象列表
【发布时间】:2018-08-16 20:17:43
【问题描述】:

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

在 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. 我目前正在通过“展平”对象来解决问题,因此我可以提供这些值。有点丑。

请帮忙!

【问题讨论】:

    标签: amazon-cloudformation troposphere sceptre


    【解决方案1】:

    Cloudformation 不支持List&lt;AWS::Batch::JobDefinition::Environment&gt;(参见https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html

    有几种方法可以解决您的问题

    请注意,我更熟悉使用 yaml 和 jinja,但波纹管也应该适用于对流层,我会在有机会时添加示例

    Sceptre_user_data

    config/&lt;stack_name&gt;.yaml添加

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

    cfn/&lt;template&gt;.yaml.j2添加

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

    原生

    原生做,可以用Type: CommaDelimitedList然后select,这个有点麻烦

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

    【讨论】:

      【解决方案2】:

      我不确定你可以用 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 是否可能对您有用。

      【讨论】:

      • 非常感谢!我没有被权杖困住。感谢您向我介绍堆垛机!顺便说一句,让它与 Python 3.6 同步的路线图是什么?我的商店开始重新标准化我们在 Python 上的使用标准,而更现代、更稳定的版本(如 3.6)是首选版本。
      • python 3.6 支持已经加入,但是是“实验性的”——唯一的原因是我们希望人们使用它来消除任何错误。发现的任何错误都将更像是“这不会更新”而不是“哦,不,它破坏了我的堆栈”,尽管在这一点上,我们已经尝试确保我们的测试在这一点上非常强大(我们不仅进行功能测试,还进行集成测试)。到目前为止,事情似乎进展顺利:)
      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多