ОК, я думаю, что по крайней мере частично понял это.
Краткий ответ: не используйте ImportValue
во вложенном стеке, потому что вы не можете, потому что вы не знаете имя вложенного стека.
Длинный ответ: очевидно, это сводится к обмену информацией. Я не знаю, почему я не смог найти это вчера, но this do c говорит: «если вы хотите изолировать обмен информацией с группой вложенных стеков, мы предлагаем вам использовать вложенные стеки [ и GetAtt
]. Для обмена информацией с другими стеками (не только внутри группы вложенных стеков) экспортируйте значения [и ImportValue
]. " Но дело не только в том, хотите ли вы делиться информацией, но и в том, какая информация у вас есть. Хотя это не указано в Указание имени стека и параметров , в документации CLI объясняется, что «имя должно быть уникальным в регионе, в котором вы создаете стек». Чтобы использовать ImportValue
, вам нужно знать имя стека, из которого вы импортируете, но когда вы создаете вложенный стек, подстеки получают случайно сгенерированные суффиксы, чтобы удовлетворить это ограничение, поэтому вы не на самом деле знаю имя.
Итак, если у вас есть
infrastructure-parent:
-> vpc
-> security-groups
-> bastion
-> NAT
-> ALB
database-parent:
-> RDS
-> phpMyAdmin
Для бастиона использовать что-то из групп безопасности, вы используете GetAtt
. Но для того, чтобы RDS использовал что-то из vp c, вы используете Export
/ ImportValue
, и потому, что вы не можете использовать GetAtt
, и потому, что вы не знаете имя сгенерированный стек vp c (er go, вы создаете параметр vpcStackName в RDS (и database-parent), чтобы разрешить передачу имени).
Я предполагаю, что сложная часть приходит (и это где мой возникла первоначальная путаница) при попытке вложить несколько уровней. Итак, если вы возьмете вышесказанное и попробуете сделать
environment-parent:
-> infrastructure-parent
-> database-parent
, окружение-родитель должно знать имя стека, сгенерированное для vp c, чтобы оно могло передать его в качестве параметра в базу данных родитель (который затем передает его в RDS). Таким образом, шаблоны RDS и родительской базы данных не нужно менять, но шаблон vp c должен Output
псевдопараметр AWS::StackName
. После этого Infrastructure-parent может получить это значение, используя GetAtt
, а затем Output
it снова , так что он доступен для GetAtt
в environment-parent, который затем может передать его в качестве параметра в database-parent .