如何使用 boto3 打印 ec2 实例图像标签?

How to print ec2 Instance Image tags using boto3?

我正在尝试使用 boto3 打印 AWS EC2 实例的详细信息。以下是我到目前为止所尝试的。我能够打印除图像相关信息之外的所有必填字段。

import boto3

session=boto3.session.Session()
ec2_re=session.resource(service_name='ec2',region_name='us-east-1')

for i in ec2_re.instances.all():
    pvt_ip=i.private_ip_address
    i_type=i.instance_type
    os=i.platform
    i_arch=i.architecture
    tags=i.tags
    hypv=i.hypervisor
    iid=i.id
    i_id=i.instance_id
    i_state=i.state['Name']
    i_img=i.image

    print(i.image)
    print(type(i.image))

    for tag in i_img.tags:
        if tag['Key'] == 'Description':
            print(img.description,img.image_type,img.name,img.platform,tag['Value'])    

当我执行此操作时,出现以下错误:

ec2.Image(id='ami-1234c567a')
<class 'boto3.resources.factory.ec2.Image'>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-18-5e1745dafc4> in <module>
     33     print(type(i.image))
     34 
---> 35     for tag in i_img.tags:
     36         if tag['Key'] == 'Description':
     37             print(img.description,img.image_type,img.name,img.platform,tag['Value'])

C:\ProgramData\Anaconda3\lib\site-packages\boto3\resources\factory.py in property_loader(self)
    343                             self.__class__.__name__))
    344 
--> 345             return self.meta.data.get(name)
    346 
    347         property_loader.__name__ = str(snake_cased)

AttributeError: 'NoneType' object has no attribute 'get'

当我单独初始化图像时,这工作正常 class。但是,这样我就无法获取其他信息,就像我在上面的代码中截断了我出错的地方一样。

img = ec2_re.Image(id='ami-197cf68fl53990')
for tag in img.tags:
    if tag['Key'] == 'Description':
        print(img.description,img.image_type,img.name,img.platform,tag['Value'])

有人可以建议我如何解决这个问题吗?

使用客户端而不是资源:

client = boto3.client('ec2')
response = client.describe_instances()

您可以在此处找到响应的结构: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_instances

我猜returns你需要的所有数据。

问题是由不推荐使用的图片引起的。

例如,Windows 图像在更新版本可用时被弃用。虽然可以检索图像对象,但它实际上并不包含任何信息(名称、标签等)。因此,无法显示有关它的任何信息。

您将需要添加 try 语句来捕获此类情况并跳过已弃用的图像。

import boto3

ec2_resource = boto3.resource('ec2')

# Display AMI information for all instances
for instance in ec2_resource.instances.all():
    image = instance.image

    # Handle situation where image has been deprecated
    try:
        tags = image.description
    except:
        continue

    if image.tags is None:
        description_tag = ''
    else:
        description_tag = [tag['Value'] for tag in image.tags if tag['Name'] == 'Description'][0]

    print(image.description, image.image_type, image.name, image.platform, description_tag)