Модульное тело ресурса CloudFormation - PullRequest
0 голосов
/ 12 июня 2018

У меня есть рабочий шаблон CloudFormation, который создает кластер AWS Elastic Container Service.Вот очищенная версия одного из TaskDefinitions:

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 Transform, но я бы хотел держать весь шаблон под контролем версий, а неотправка фрагментов на S3, где они не будут отслежены.

1 Ответ

0 голосов
/ 12 июня 2018

К сожалению, это не так просто.CloudFormation не может обрабатывать сложные структуры как параметры.У вас есть два варианта:

  1. использовать пользовательские ресурсы с лямбда-поддержкой (если у вас больше подобных случаев, это может быть хорошим выбором, но для одноразового использования, как здесь, это кажется излишним)- пользовательские ресурсы являются своего рода исключением: все параметры просто переданы им, а также возвращенные структуры могут быть скомпилированы и сохранены CloudFormation;

  2. загружать частичные шаблоны в S3 в некоторых CI/ CD шаг (я рекомендую сделать его там в URL) перед запуском CloudFormation.

...