Условный вложенный стек Cloudformation Неразрешенные зависимости ресурсов

#amazon-cloudformation

Вопрос:

У меня есть стек Cloudformation, который условно вызывает вложенный стек для создания экземпляра RDS, только если существующий URL-адрес базы данных не передается в качестве параметра.

Если я передам значение DBExistingEndpoint параметру в стеке, условию CreateDB будет присвоено значение false, и оно вообще не будет вызывать вложенный стек RDS.

Проблема в том, что в ресурсе конфигурации запуска автоматического масштабирования существует условная зависимость. Мне нужно сослаться либо на URL-адрес, выводимый из вложенного стека, либо на URL-адрес, переданный в качестве параметра для размещения в файле во вновь запущенном экземпляре.

     Parameters:
      DBExistingEndpoint:
        Type: String
        Description: Set to a URL of a RDS instance to use an existing DB, otherwise create one
        Default: ''
    ...
    
    Conditions:
      CreateDB:
        !Equals [!Ref DBExistingEndpoint, '']
    ...

    Resources:
      # Database created only if existing URL not passed in
      DB:
        Type: AWS::CloudFormation::Stack
        Condition: CreateDB
        Properties:
          TemplateURL: ...
      ...

      ClusterInstanceLaunchConfig:
        Type: AWS::AutoScaling::LaunchConfiguration
        Metadata:
          AWS::CloudFormation::Init:
            config:

              files:
                /etc/dbenv:
                  mode: "000640"
                  owner: root
                  group: root
                  content:
                    !Join
                      - "n"
                      -
                        - !Sub ["DB_HOST=${DBEndpointAddress}", DBEndpointAddress: !If [CreateDB, !GetAtt DB.Outputs.RDSEndPointAddress, !Ref DBExistingEndpoint]]
                      ...
 

Проблема в том, что если я передам существующий URL-адрес конечной точки, ресурс БД будет пропущен (правильно), но создание стека завершится неудачей с Template format error: Unresolved resource dependencies [DB] in the Resources block of the template

В идеале DB.output.RDSEndpointAddress ссылка в ClusterInstanceLauchConfig ресурсе должна игнорироваться, поскольку CreateDB условие в поле !If ложно

Кто-нибудь знает, как обойти это ограничение?

Комментарии:

1. Оказывается, что то ! Если оператор действительно работает правильно, был еще один зависимый параметр: ссылка на ресурс БД ниже по сценарию.

2. Если вы решили проблему, вы можете ответить на свой собственный вопрос и принять его.

Ответ №1:

Вы должны попытаться установить условный оператор на другом уровне, чем сейчас.

Что наверняка сработает, так это наличие условного оператора на уровне самого LaunchConfiguration себя, что также будет означать довольно большое дублирование кода. Но, может быть, вы могли бы попытаться увидеть условие на уровне content или files и т. Д., Чтобы увидеть, есть ли где-то середина, чтобы снизить дублирование, но избежать ошибки, которую вы получаете прямо сейчас.

Комментарии:

1. Спасибо за ответ, я потратил несколько часов на придумывание сложного обходного пути с использованием хранилища параметров SSM, но затем обнаружил ошибку в шаблоне с несвязанной зависимостью: DB в шаблоне (в нем более 2000 строк!). Если бы только ошибки AWS были более конкретными в отношении того, в какой строке кода возникла проблема.