簡體   English   中英

為什么我無法通過我的 python boto3 代碼列出所有 EC2 屬性?

[英]Why am I not able to list all EC2 attributes through my python boto3 code?

import boto3
import csv
import pprint

ec2_cli=boto3.client(service_name='ec2')   #creating a ec2_cli object with client session
aws_regions = ec2_cli.describe_regions()['Regions']  
all_aws_regions = []
for each_region in aws_regions:
    #print(each_region['RegionName'])
    all_aws_regions.append(each_region['RegionName'])

#print (all_aws_regions)

file_open = open('ec2_inventory.csv', 'w', newline='')
data_obj=csv.writer(file_open)
data_obj.writerow(["S.no", "InstanceID", "ImageID", "Instance Lifecycle", "Instance Type", "Private DNS Name", "Private IP Address", "Root Device Name", "Root Device Type", "VPC ID"])

count = 1
for each_region in all_aws_regions:
    ec2_resource = boto3.resource(service_name='ec2', region_name = each_region)
    for each_inst_in_reg in ec2_resource.instances.all():
        #print (count,each_inst_in_reg.instance_id, each_inst_in_reg.`block_device_mapping.device_name`, each_inst_in_reg.block_device_mapping.status, each_inst_in_reg.block_device_mapping.volume_id, each_inst_in_reg.dns_name, each_inst_in_reg.image_id, each_inst_in_reg.instance_lifecycle, each_inst_in_reg.instance_state_name, each_inst_in_reg.instance_type, each_inst_in_reg.ip_address, each_inst_in_reg.owner_id, each_inst_in_reg.private_dns_name, each_inst_in_reg.private_ip_address, each_inst_in_reg.root_device_name, each_inst_in_reg.root_device_type, each_inst_in_reg.vpc_id, each_inst_in_reg.tag_key)
        data_obj.writerow([count,each_inst_in_reg.instance_id, each_inst_in_reg.image_id, each_inst_in_reg.instance_lifecycle, each_inst_in_reg.instance_type, each_inst_in_reg.private_dns_name, each_inst_in_reg.private_ip_address, each_inst_in_reg.root_device_name, each_inst_in_reg.root_device_type, each_inst_in_reg.vpc_id])
        count+=1

file_open.close()

我無法在 excel 文件中返回 block_device_mapping.device_name、block_device_mapping.device_status 的值。 有人可以建議我缺少什么嗎? 我可以在 instances.all() 中看到以下可以調用的屬性: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html

ec2_resource.instances.all()命令返回ec2.Instance列表

在查看 EC2 的 boto3 文檔時:

  • ec2.Instance object 包含一個名為block_device_mappings的屬性(注意它是復數)
  • 該屬性是一個列表,其中包含DeviceName條目和Ebs字典
  • Ebs字典包含一個名為Status的條目

因此,可能有多個塊設備附加到一個 Amazon EC2 實例。 map 這對於一個 CSV 文件來說不太好,該文件期望每行的列數相同——例如,考慮如果有多個 Amazon EBS 卷附加到 EC2 實例,它應該包含什么信息。

要訪問 Name 和 Status 字段,您可以遍歷block_device_mappings中的每個條目,或者您可以假設您只需要有關所連接的第一個卷的信息。

要獲取有關第一卷的信息,您可以簡單地使用:

each_inst_in_reg.block_device_mappings[0].DeviceName
each_inst_in_reg.block_device_mappings[0].Ebs['Status']

要遍歷每個卷,您可以使用:

for volume in each_inst_in_reg.block_device_mappings:
  name = volume.DeviceName
  status = volume.Ebs['Status']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM