gpt4 book ai didi

aws-cloudformation - GetAtt 输出与 ImportValue

转载 作者:行者123 更新时间:2023-12-03 07:14:25 25 4
gpt4 key购买 nike

我确信我在这里遗漏了一些非常明显的东西,但是使用 GetAttImportValue 在堆栈的父模板中获取输出值有什么区别>?是否有时间和地点只能使用其中之一?是否有一些地方它们可以互换,但由于某种原因其中一个更可取?

例如,在父模板中:

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'

就像我说的,我可能遗漏了一些明显的东西,但我一直在阅读两个文档页面,并且......我没有得到任何东西。

最佳答案

好吧,我想我至少部分地弄清楚了这一点。

简短回答:不要在嵌套堆栈中使用 ImportValue,因为您不能,因为您不知道子堆栈的名称。

长答案:显然这归结为信息共享。我不知道为什么我昨天找不到这个,但是this doc说“如果您想将信息共享隔离到嵌套堆栈组内,我们建议您使用嵌套堆栈[和 GetAtt]。与其他堆栈共享信息(不仅仅是在嵌套堆栈组内) )、导出值[和 ImportValue]。”但实际上,这不仅仅是您是否想要共享信息的问题,而是您拥有哪些可用信息的问题。虽然 Specifying Stack Name and Parameters 中没有指定,CLI documentation解释说“该名称在您创建堆栈的区域中必须是唯一的。”。要使用 ImportValue,您需要知道从中导入的堆栈的名称,但是当您创建嵌套堆栈时,子堆栈会被赋予随机生成的后缀,以满足此约束,所以你实际上并不知道这个名字。

所以,如果你有

infrastructure-parent:
-> vpc
-> security-groups
-> bastion
-> NAT
-> ALB
database-parent:
-> RDS
-> phpMyAdmin

要让堡垒使用安全组中的某些内容,您可以使用 GetAtt。但是,要使 RDS 使用 vpc 中的某些内容,您需要使用 Export/ImportValue,这都是因为您无法使用 GetAtt,并且因为您不知道生成的 vpc 堆栈的名称(因此,您在 RDS(和数据库父级)中创建一个 vpcStackName 参数以允许传递名称)。

我猜当你尝试嵌套多个级别时,棘手的部分就来了(这就是我最初的困惑产生的地方)。所以,如果你采取上述措施,并尝试这样做

environment-parent:
-> infrastructure-parent
-> database-parent

环境父级需要知道为 vpc 生成的堆栈名称,因此它可以将其作为参数传递给数据库父级(然后将其传递给 RDS)。因此,RDS 和数据库父模板不需要更改,但 vpc 模板需要输出 AWS::StackName pseudo parameter 。然后,基础结构父级可以使用 GetAtt 获取此信息,然后再次输出它,以便它可用于 GetAtt环境父级,然后可以将其作为参数传递给数据库父级。

关于aws-cloudformation - GetAtt 输出与 ImportValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com