【问题标题】:Modularize body of a CloudFormation Resource模块化 CloudFormation 资源的主体
【发布时间】:2018-11-21 05:19:18
【问题描述】:

我有一个可以创建 AWS Elastic Container Service 集群的有效 CloudFormation 模板。以下是其中一个 TaskDefinition 的净化版本:

Resources:
  MyTaskDefinition:
    Properties:
      ContainerDefinitions:
      - Environment:
        - Name: ENV_VAR_1
        Value: !Ref EnvVar1
        - Name: ENV_VAR_2
        Value: !Ref EnvVar2
      Image: !Ref Image1
      LogConfiguration: !Ref MyLogConfiguration
      Memory: 2048
      Name: my-container-1
      - Environment:
        - Name: ENV_VAR_1
        Value: !Ref EnvVar1
        - Name: ENV_VAR_2
        Value: !Ref EnvVar2
      Image: !Ref Image2
      LogConfiguration: !Ref MyLogConfiguration
      Memory: 2048
      Name: my-container-2
    Type: AWS::ECS::TaskDefinition

随着这个 TaskDefinition 增长到定义多个容器,每个容器都有多个环境变量,它变得难以阅读。相反,我想做以下事情:

Resources:
  ContainerDefinition1:
    Properties:
      Environment:
        - Name: ENV_VAR_1
        Value: !Ref EnvVar1
        - Name: ENV_VAR_2
        Value: !Ref EnvVar2
      Image: !Ref Image1
      LogConfiguration: !Ref MyLogConfiguration
      Memory: 2048
      Name: my-container-1
    Type: AWS::ECS::TaskDefinition::ContainerDefinition
  ContainerDefinition2:
    Properties:
      Environment:
        - Name: ENV_VAR_1
        Value: !Ref EnvVar1
        - Name: ENV_VAR_2
        Value: !Ref EnvVar2
      Image: !Ref Image2
      LogConfiguration: !Ref MyLogConfiguration
      Memory: 2048
      Name: my-container-2
    Type: AWS::ECS::TaskDefinition::ContainerDefinition
  MyTaskDefinition:
    Properties:
      ContainerDefinitions:
      - !Ref ContainerDefinition1
      - !Ref ContainerDefinition2
    Type: AWS::ECS::TaskDefinition

这不起作用,因为 Type: AWS::ECS::TaskDefinition::ContainerDefinition 在 CloudFormation 中不是有效的资源类型。

是否有另一种方法可以模块化 CloudFormation 中的资源主体?如果不是,您建议如何在 CF 模板增长时保持其可读性以指定大型系统?

我熟悉 AWS::Include 转换,但我希望将整个模板置于版本控制之下,而不是将 sn-ps 发布到 S3 以使其不被跟踪。

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-ecs


    【解决方案1】:

    不幸的是,它并不是那么简单。 CloudFormation 无法将复杂结构作为参数处理。你有两个选择:

    1. 使用 Lambda 支持的自定义资源(如果您有更多这样的情况,这可能是一个不错的选择,但对于像这里这样的单一用途来说,这似乎是一种过度杀伤) - 自定义资源是一种例外:所有参数只是传递给它们,返回的结构也可以是完整的,并且仍然由 CloudFormation 保存;

    2. 在触发 CloudFormation 之前,在某些 CI/CD 步骤中将部分模板上传到 S3(我建议在 URL 中对其进行版本化)。

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 2021-04-22
      • 2020-10-17
      • 2017-05-05
      • 2016-09-30
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多