Amazon web services 通过cloudformation脚本获取子网的AZ

Amazon web services 通过cloudformation脚本获取子网的AZ,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,我需要做一些像。。。 “回声区”, { “Ref”:“子网的az_” }, “>>aws\u details.txt\n” 在通过cloudformation脚本创建的EC2实例的用户数据中。现有子网的子网ID已知。有没有办法获取子网的可用区域?目前,我将此作为用户的输入(子网的az),这似乎是多余的/不正确的,因为我已经知道子网id。您需要编写一个自定义Lambda函数来获取VPC子网id的az 关于可用性区域有许多奇怪之处。我的us-west-2a可能与您的us-west-2a相同,也可能

我需要做一些像。。。

“回声区”,
{
“Ref”:“子网的az_”
},
“>>aws\u details.txt\n”


在通过cloudformation脚本创建的EC2实例的用户数据中。现有子网的子网ID已知。有没有办法获取子网的可用区域?目前,我将此作为用户的输入(子网的az),这似乎是多余的/不正确的,因为我已经知道子网id。

您需要编写一个自定义Lambda函数来获取VPC子网id的az

关于可用性区域有许多奇怪之处。我的us-west-2a可能与您的us-west-2a相同,也可能与您的us-west-2a不同。Amazon将实际数据中心随机化以实现负载平衡等

下面是一个关于如何创建CloudFormation可以调用的自定义函数的链接

一篇关于云形成和可用性区域的有趣文章


兰姆达似乎有点过分;您可以针对实例元数据发出curl命令:

curl http://169.254.169.254/latest/meta-data/placement/availability-zone
将其放入用户数据以获得AZ编辑:

看起来AP想要使用现有的子网,而该子网不是在云结构中创建的。因此,CloudFormation目前不支持这一点,因此可能有2个选项(可能更多) 1.在用户数据脚本中调用API以获取
2.使用支持此功能的terrform

我一直在讨论这个问题,不知道为什么不能使用SSM存储的参数?是的,设置起来需要几分钟的时间,但一旦设置好,就不会有太大的变化

进入SSM,创建一个存储的参数。。。SubnetId表示名称,AZ表示参数。因为子网已经创建,所以信息就在那里。如果您在CFN创建完成时使用它来自动填充SSM,您甚至可以将此信息从CFN输出到SSM

然后,您可以很容易地将其拉入CloudFormation模板

最好的去处是:

我觉得当您想要使您的CFN模板更加动态时,SSM存储的参数常常被忽略。我有一些模板,可以在任何环境中运行,无需使用SSM进行修改

正如我所说的,设置它需要一点工作,但是这里和那里的一点点工作会有很大的帮助

你可以在这里看到一个例子。我有YAML和JSON示例


只是一个想法。

us-west-2是一个地区,us-west-2a和us-west2b更适合你的例子。谢谢Chris,我更新了我的答案,以更正AZ名称的拼写错误。@JohnHanley,谢谢你的回复。我想知道是否有更简单、更紧凑的方法来实现这一点,比如在一行左右?我目前正在使用boto客户端来获取信息,虽然效果很好,但看起来很凌乱和冗长。与您的解决方案类似。AWS CF是否没有提供查询现有资源属性的功能?似乎是必须具备的功能,但在网上找不到任何内容:(CloudFormation中没有内置的函数可以将子网ID映射到AZ或获取包含AZ信息的子网列表。哦,好的。谢谢!您无法从CloudFormation获取实例的元数据(例外:您在EC2实例中运行CloudFormation)。问题是如何将子网ID映射到CloudFormation模板中的AZ。如果您在用户数据中需要此ID,则您已经在框中,因此可以访问元数据。用户数据本身可以获取此值,无需让CF执行此操作。启动实例时,用户数据是有效的。子网在某一时间可能会非常不同ter date.Metadata没有子网ID到AZs的映射。问题是如何创建一个将子网与AZ匹配的CloudFormation模板。您可以在一个EC2实例上启动CloudFormation来创建其他实例或服务。@ChrisPollard,谢谢您的回复,但该API将为我提供启动的EC2实例所在的AZ.I需要获取具有给定ID的子网的AZ。访问该信息的实例将不在同一子网中。如果我错了,请更正我的错误…此处,“mySubnet”需要是在同一CloudFormation脚本中创建的资源的名称。我需要获取已存在子网的AZ(其ID在CF脚本中已知)是的,它是您要引用的子网。如果您在同一模板中创建了该子网,但看起来您正在传递现有子网,则该子网将起作用。因此,我认为使用cloudformation时,您不可能需要使用python boto或任何合适的语言在userdata脚本中使用API调用,也不可能使用terrfaform。