Обычные выходные значения не могут быть ссылками из других стеков . Они могут быть полезны, когда вы объединяете или встраиваете свои стеки и их область видимости / видимость является локальной. Экспортированные выходные данные видны глобально в пределах учетной записи и региона и могут использоваться любым будущим стеком, который вы собираетесь развернуть.
Цепочка
Когда вы связываете свои стеки разверните один стек, возьмите его на выходе и используйте в качестве входных параметров для второго стека, который вы собираетесь развернуть.
Например, у вас есть два шаблона с именами instance.yaml
и eip.yaml
. instance.yaml
выводит свой идентификатор экземпляра (без экспорта), а eip.yaml
принимает идентификатор экземпляра в качестве входного параметра.
Чтобы развернуть их обоих, вы должны объединить их в цепочку:
- Развернуть
instance.yaml
и дождаться его завершения. - Обратите внимание, что он выводит значения (т.е. id) - обычно выполняется программно, а не вручную.
- Развернуть
eip.yaml
и передать идентификатор экземпляра в качестве входного параметра.
Вложение
При вложении стопок у вас будет родительский шаблон и дочерний шаблон. Дочерний стек будет создан внутри родительского стека. В этом случае дочерний стек будет производить некоторые выходные данные (не экспорт) для использования родительским стеком.
Например, давайте снова будем использовать instance.yaml
и eip.yaml
. Но на этот раз eip.yaml
будет родительским, а instance.yaml
- дочерним. Также eip.yaml
не принимает никаких входных параметров, но instance.yaml
выводит свой идентификатор экземпляра (не экспорт)
В этом случае, чтобы развернуть их, вы делаете следующее:
- Загрузите дочерний шаблон (
eip.yaml
) в s3 - В
eip.yaml
создайте стек дочерних экземпляров, используя AWS :: CloudFormation :: Stack и URL-адрес s3 из шага 1.
Таким образом, eip.yaml
сможет получить доступ к идентификатору экземпляра из выходных данных вложенного стека, используя GetAtt
.
Перекрестные ссылки
Когда вы перекрестно ссылаетесь на стеки, у вас есть один стек, который экспортирует свои выходные данные, чтобы их можно было использовать любым другим стеком в том же регионе и учетной записи.
Например, давайте использовать снова instance.yaml
и eip.yaml
. instance.yaml
собирается экспортировать свой вывод (идентификатор-экземпляра). Чтобы использовать идентификатор экземпляра eip.yaml
, необходимо использовать ImportValue в своем шаблоне без каких-либо входных параметров или вложенных стеков.
В этом случае, чтобы развернуть их, вы выполните следующее:
- Разверните
instance.yaml
и дождитесь его завершения. - Разверните
eip.yaml
, который будет импортировать идентификатор экземпляра.
Хотя перекрестные ссылки кажутся очень полезными, у него есть одна серьезная проблема, заключающаяся в том, что очень сложно обновить или удалить перекрестные ссылки стеки :
После того, как другой стек импортирует выходное значение, вы не сможете удалить стек, который экспортирует выходное значение, или изменить экспортированное выходное значение . Перед удалением стека экспорта или изменением выходного значения необходимо удалить весь импорт.
Это очень проблематично c, если вы только начинаете свой дизайн и ваши шаблоны могут часто меняться.
Когда какой использовать?
Используйте перекрестные ссылки (экспортированные значения), когда у вас есть глобальные ресурсы , которые будут совместно использоваться много стеков в данном регионе и аккаунте. Также они не должны часто меняться, так как их сложно изменить. Типичные примеры: глобальная корзина для централизованного расположения журналов, VP C.
Используйте вложенный стек (не экспортируемые выходные данные), когда у вас есть некоторые общие компоненты , которые вы часто развертываете, но каждый раз они могут быть немного разными. Примеры: ALB, экземпляр хоста-бастиона, конечная точка интерфейса vp c.
Наконец, связанные стеки (не экспортируемые выходные данные) полезны для разработки слабосвязанных шаблонов, где вы можете смешивать и сопоставлять шаблоны на основе новых требований.