#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 были более конкретными в отношении того, в какой строке кода возникла проблема.