Множественные условия if в CloudFormation

Вопрос или проблема

  //  frontendSubdomain:
Тип: Строка
По умолчанию: test-ui

CloudFrontDistribution:
Тип: "AWS::CloudFront::Distribution"
Свойства:
  DistributionConfig:
    WebACLId: !GetAtt WebACL.Arn
    Aliases:
      !Если
      - NonTestEnv
      - - !Если
          - OnlyPrd
          - - !Join
              - ""
              - - Ref: frontendSubdomain
                - ".ui.com"
            - !Join
              - ""
              - - Ref: frontendSubdomain
                - "{{resolve:ssm:/"
                - Ref: Env
                - "Name:{LATEST}}}"
          -
          - - !Join
              - ""
              - - Ref: frontendSubdomain
                - !Sub -${EnvironmentParameter}.vermontmutual.com
              - !Join
                - ""
                - - Ref: frontendSubdomain
                  - .
                  - "{{resolve:ssm:/"
                  - Ref: Env
                  - "Name:{LATEST}}}"
      -
      - - !Join
          - ""
          - - Ref: frontendSubdomain
            - .
            - "{{resolve:ssm:/"
            - Ref: Env
            - "Name:{LATEST}}}"
    Комментарий: !Sub Cloudfront Distribution для ${Env} окружения

Я получаю ошибку “/DistributionConfig/Aliases/Fn::If/1/0/Fn::If/2] ‘null’ значения не допускаются в шаблонах”. Было бы очень полезно, если бы кто-то нашел проблему в этом коде.

Ответ или решение

Для решения проблемы с использованием нескольких условий в шаблонах AWS CloudFormation, необходимо внимательно рассмотреть структуру ваших логических условий и их взаимосвязи. Ошибка, с которой вы столкнулись — "/DistributionConfig/Aliases/Fn::If/1/0/Fn::If/2] ‘null’ values are not allowed in templates" — указывает на то, что одно из условий возвращает значение null, что недопустимо в данном контексте.

Анализ Вашего Шаблона

Ваш код содержит несколько вложенных конструкций !If, что действительно может привести к путанице и ошибкам. Давайте разберем его шаг за шагом.

  1. Первое Условие (NonTestEnv): Это условие должно возвращать разные блоки на основе того, является ли окружение тестовым или нет.

  2. Вложенные Условия (OnlyPrd): Если это не тестовое окружение, мы проверяем, является ли это окружением только для продакшена. В результате этого условия у вас есть два варианта: два варианта использования !Join для формирования имени домена.

  3. Возврат Null: Вероятная причина возникновения null значений заключается в том, что одно из ваших условий не определено или не выполняется, что может возникнуть в результате неправильной конфигурации логики условий.

Рекомендации по Исправлению

  1. Проверка Условий: Убедитесь, что все ваши логические условия определены и правильно настроены в разделе Conditions. Например, условия NonTestEnv и OnlyPrd должны быть объявлены заранее.

  2. Использование !Ref и !GetAtt: Проверьте, что все ссылки, которые вы используете с !Ref и !GetAtt, возвращают ожидаемые значения. Если они ссылаются на ресурсы, которые могут не существовать в определенных окружениях, это может привести к ошибкам.

  3. Избегайте Вложенности: Попробуйте упростить вашу логику условий. Вместо многократного использования вложенных !If, можно рассмотреть возможность создания переменных, которые будут содержать уже сформированные строки, и затем использовать только одно условие для выбора цвета.

Примеры Исправлений

Вот упрощенная версия вашей логики с пояснениями:

Conditions:
  NonTestEnv: !Equals [!Ref Env, "prod"]
  OnlyPrd: !Equals [!Ref AnotherEnvParam, "onlyPrd"]

CloudFrontDistribution:
  Type: "AWS::CloudFront::Distribution"
  Properties:
    DistributionConfig:
      WebACLId: !GetAtt WebACL.Arn
      Aliases:
        !If
        - NonTestEnv
        - !If
          - OnlyPrd
          - 
            - !Join
              - ""
              - - Ref: frontendSubdomain
                - ".ui.com"
          - 
            - !Join
              - ""
              - - Ref: frontendSubdomain
                - "{{resolve:ssm:/"
                - Ref: Env
                - "Name:{LATEST}}}"
        - 
          - !Join
            - ""
            - - Ref: frontendSubdomain
              - ".example.com"
              - "{{resolve:ssm:/"
              - Ref: Env
              - "Name:{LATEST}}}"
    Comment: !Sub CloudFront Distribution for ${Env} Environment

Заключение

Для достижения стабильной и безошибочной работы вашего CloudFormation шаблона необходимо внимательно следить за каждым элементом в структуре условий и их взаимодействием. Каждое условие должно быть корректно определено и проверено, чтобы избежать возвращения null значений. Реорганизация вашей логики и применения простых условий может помочь устранить возникшие проблемы и улучшить читаемость вашего шаблона.

Убедитесь, что вы тестируете все возможные комбинации условий, чтобы гарантировать, что все ветви кода возвращают допустимые значения, соблюдая указания Amazon по работе с CloudFormation.

Оцените материал
Добавить комментарий

Капча загружается...