Условная проверка шаблона AWS CloudFormation

У меня есть шаблон для создания CloudFormation с DynamoDB и DAX для нескольких регионов, например, us-east-1 и ap-southeast-1. Работая для us-east-1, этот шаблон не будет работать для ap-southeast-1, так как DAX еще не доступен для этого региона.

Я ожидал, что это можно сделать с помощью Conditions, так что для одного региона (us-east-1) у меня будут оба DynamoDB и DAX, а для другого (ap-southeast-1) - только DynamoDB:

Conditions: 
  isDAXAvailable: !Not [!Equals [ !Ref "AWS::Region", ap-southeast-1 ]]

Resources:
  DynamoDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
    .....

  DaxCluster:
    Type: AWS::DAX::Cluster
    Condition: isDAXAvailable
    Properties:
    .....

Но, к сожалению, я получаю сообщение об ошибке:

Произошла ошибка (ValidationError) при вызове операции ValidateTemplate: Ошибка формата шаблона: Нераспознанные типы ресурсов: [AWS::DAX::Cluster]

Можно ли так или иначе настроить такой шаблон или нужно создать отдельный?

2 ответа

Проверка шаблона выполняется в отношении ресурсов, доступных в регионе. Поскольку DAX в настоящее время недоступен в ap-southeast-1, ресурс AWS::DAX::Cluster не пройдет проверку там. У меня есть несколько предложений о том, как сделать эту работу:

  • Предварительно обработайте шаблон, чтобы удалить ресурсы DAX в неподдерживаемых регионах
  • Разделите ваш шаблон на три отдельных шаблона, которые я назову DAX, NoDAX и другие:
    • В регионах, которые поддерживают DAX, создайте стек с шаблоном DAX, который включает ваш кластер, и экспортируйте имя кластера в качестве значения ClusterName.
    • В регионах, которые не поддерживают DAX, создайте стек с шаблоном NoDAX и не экспортируйте ни один из них в качестве значения ClusterName. Поскольку каждому шаблону нужен ресурс, включите AWS::CloudFormation::WaitConditionHandle в качестве единственного ресурса этого шаблона.
    • Во всех регионах создайте стек с другим шаблоном, который импортирует DaxClusterName и создает условное выражение на основе Fn:Equals: [“DaxClusterName”, “none”], Затем используйте условное выражение, чтобы определить, могут ли ресурсы в этом шаблоне зависеть от кластера.

В настоящее время существует обходной путь добавления преобразования, например к вашему шаблону

Хотя для этого может потребоваться добавить CAPABILITY_AUTO_EXPANDвозможность, Transform: AWS::Serverless-2016-10-31"при использовании этого преобразования плата не взимается", и это не должно влиять на ваш шаблон, если у вас нет ресурсов, и вы уже должны использовать это преобразование, если у вас естьAWS::Serverless Ресурсы

Другие вопросы по тегам