Вопрос или проблема
// 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
, что действительно может привести к путанице и ошибкам. Давайте разберем его шаг за шагом.
-
Первое Условие (NonTestEnv): Это условие должно возвращать разные блоки на основе того, является ли окружение тестовым или нет.
-
Вложенные Условия (OnlyPrd): Если это не тестовое окружение, мы проверяем, является ли это окружением только для продакшена. В результате этого условия у вас есть два варианта: два варианта использования
!Join
для формирования имени домена. -
Возврат Null: Вероятная причина возникновения null значений заключается в том, что одно из ваших условий не определено или не выполняется, что может возникнуть в результате неправильной конфигурации логики условий.
Рекомендации по Исправлению
-
Проверка Условий: Убедитесь, что все ваши логические условия определены и правильно настроены в разделе
Conditions
. Например, условияNonTestEnv
иOnlyPrd
должны быть объявлены заранее. -
Использование
!Ref
и!GetAtt
: Проверьте, что все ссылки, которые вы используете с!Ref
и!GetAtt
, возвращают ожидаемые значения. Если они ссылаются на ресурсы, которые могут не существовать в определенных окружениях, это может привести к ошибкам. -
Избегайте Вложенности: Попробуйте упростить вашу логику условий. Вместо многократного использования вложенных
!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.