【问题标题】:Returning AWS EC2 availability_zone attribute using boto3 Python SDK使用 boto3 Python 开发工具包返回 AWS EC2 availability_zone 属性
【发布时间】:2020-01-30 06:29:02
【问题描述】:

我正在尝试使用boto3 API 调用Python 来返回有关AWS 帐户中所有EC2 实例的信息,但我无法显示availability_zone 资源。

例如,当我可以使用此代码成功迭代所有 EC2 实例时:

ec2 = boto3.resource('ec2')

output = defaultdict()

for instance in ec2.instances.all()
    for iface in instance.network_interfaces:
        output[instance.id] = {
            'Instance ID': instance.id,
            'Subnet ID': iface.subnet_id
        }

我省略了其余的代码,但是上面的代码可以工作并输出这些资源的值,然后我使用Pandas .to_csv 将这些资源放入csv 文件中。

当我尝试在Python dictionary 中添加以下值时:

'Availability Zone': instance.availability_zone

我收到以下错误:

AttributeError: 'ec2.Instance' object has no attribute 'availability_zone'

这是预期的行为。然后我尝试以下方法:

'Availability Zone': iface.availability_zone

运行时出错,但输出为空。 csv 文件中没有任何内容。

我查看了boto3documentationavailability_zoneNetworkInterface 资源下的可用资源属性,就像我正在使用并且正在使用的subnet_id

我在这里缺少什么?谁能指出我正确的方向或让我知道我做错了什么?

【问题讨论】:

  • @aws_apprentice,感谢您的回复。我想我正在使用 iface.availability_zone 调用 NetworkInterface。调用时成功返回了 subnet_id 属性。当我调用 iface.availability_zone 时,我没有收到任何错误,它只是返回 null。
  • 尝试使用 AWS CLI(或我最喜欢的工具,aws-shell)进行交互式探索。如果您使用的是 shell,请运行命令 ec2 describe-network-interfaces。您在该输出中看到AvailabilityZone 吗?当我运行该命令时,我看到了与每个接口关联的区域,正如预期的那样。如果它在这里工作,它应该也可以在你的代码中工作。
  • 当我提取 AZ 信息时,我从接口所在的子网中提取它。我看到的抽象是:EC2 实例具有驻留在子网中的网络接口,该子网位于一个AZ。

标签: python python-3.x amazon-web-services amazon-ec2 boto3


【解决方案1】:

可用区是子网的一个属性。

因此,您可以使用:

import boto3

ec2 = boto3.resource('ec2')

output = {}

for instance in ec2.instances.all():
    for iface in instance.network_interfaces:
        output[instance.id] = {
            'Instance ID': instance.id,
            'Subnet ID': iface.subnet_id,
            'AZ': iface.subnet.availability_zone
        }

print(output)

【讨论】:

  • 这完全有道理。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2019-09-11
  • 2020-07-02
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多