Выходы GetAtt и ImportValue - PullRequest
       0

Выходы GetAtt и ImportValue

0 голосов
/ 28 февраля 2020

Я уверен, что мне здесь не хватает чего-то совершенно очевидного, но в чем разница между получением выходного значения в родительском шаблоне стека с GetAtt и ImportValue? Есть ли время и место, где вы можете использовать только один или другой? Есть ли места, где они взаимозаменяемы, но одно предпочтительнее по какой-то причине?

Например, в родительском шаблоне:

myvpc:
  Type: AWS::CloudFormation::Stack
  <some stuff to pass to a child template>

anotherresource:
  Type: AWS::CloudFormation::Stack
  Properties:
    Parameters:

Тогда либо

      Subnet:
        !GetAtt [mypvc, Outputs.publicsubnet1]

или

      Subnet:
        !ImportValue 'MyVpcStackName:publicsubnet1'

Как я уже сказал, я, вероятно, упускаю что-то очевидное, но я продолжаю читать обе страницы документа, и ... я ничего не получаю.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

ОК, я думаю, что по крайней мере частично понял это.

Краткий ответ: не используйте 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 .

0 голосов
/ 28 февраля 2020

Я думаю, что часть того, что вас смущает, это то, что вы, вероятно, делаете что-то с подстеками, которые изучаются. Согласно рекомендациям CloudFormation

Использование вложенных стеков для повторного использования общих шаблонных шаблонов

Если вы это сделаете, вы не должны экспортировать вещи из подстека, и у вас нет путаницы.

Учитывая то, что вы делаете, причина, по которой вы все равно должны избегать ImportValue, заключается в том, что вы не сможете удалить стек из-за собственной ссылки , Я не уверен, что вы могли бы даже создать его, потому что я думаю, что он может оценить ImportValue рано, но я не уверен на 100% в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...