【问题标题】:AWS EBS Volume - Python - Find all fields info as shown in AWS EC2 EBS Volume ConsoleAWS EBS 卷 - Python - 查找所有字段信息,如 AWS EC2 EBS 卷控制台中所示
【发布时间】:2017-07-24 14:36:21
【问题描述】:

我正在尝试创建一个 Python 脚本来针对所有可用的 AWS EBS 卷生成一个csv 格式文件,并显示我在 AWS EC2 EBS 卷控制台中看到的所有字段值。

[arun@Andrews-MBP-2 ~/aks/always-latest-ws-sunny/anisble] $ cat ~/aws-vol-info.py 
import boto3

#define the connection
ec2 = boto3.resource('ec2', region_name="us-west-2")

volumes = ec2.volumes.all()

for vol in volumes:
    print "Created(" + str(vol.create_time) + "),VolumeState(" + str(vol.state) + "),VolumeID(" + str(vol.id) + "),VolumeSize(" + str(vol.size) + ") " + vol.type
[arun@Andrews-MBP-2 ~/aks/always-latest-ws-sunny/anisble] $ 

这个脚本给了我以下错误信息。原因:如果我不使用vol.type 字段,则上述脚本有效。它不起作用,因为 volumes 变量在运行 ec2.volumes.all() 时从未将其转化为它的值。

[arun@Andrews-MBP-2 ~/aks/always-latest-ws-sunny/anisble] $ python ~/aws-vol-info.py 
Traceback (most recent call last):
  File "/Users/arun/aws-vol-info.py", line 9, in <module>
    print "Created(" + str(vol.create_time) + "),VolumeState(" + str(vol.state) + "),VolumeID(" + str(vol.id) + "),VolumeSize(" + str(vol.size) + ") " + vol.type
AttributeError: 'ec2.Volume' object has no attribute 'type'
[arun@Andrews-MBP-2 ~/aks/always-latest-ws-sunny/anisble] $ 

我应该在上面的脚本中使用/更改什么库/函数,使用它可以显示 EBS 卷的所有字段或更有意义的字段(我在 AWS EC2 EBS 卷控制台中看到的),请参见下图AWS 控制台中的可用字段。

我在Github 上在线找到了这个其他脚本(#2),它似乎可以打印更多字段,但它给出了下面列出的另一个错误。我成功运行了python -m pip install --user awspython -m pip install awspip install aws,或运行了脚本(仅包含#Import classes from aws package line 之后的行,在他的存储库的aws 文件夹内(克隆后)但仍然得到错误。

import boto.ec2
class Volumes:
    def __init__(self):
        ''' Volumes Constructor '''

    def list_volumes(conn):
        ''' List Volumes '''
        # get all volumes
        vols = conn.get_all_volumes()

        # if volumes found
        if vols:
            #loop through volumes
            for v in vols:
                print 'Volume Id:', v.id
                print 'Volume Status:', v.status
                print 'Volume Size:', v.size
                print 'Zone:', v.zone
                print 'Volume Type:', v.type
                print 'Encrypted:', v.encrypted

                #print attachment set object
                attachmentData = v.attach_data
                print 'Instance Id:', attachmentData.instance_id
                print 'Attached Time:', attachmentData.attach_time
                print 'Device:', attachmentData.device
                print '**********************************'

#Import classes from aws package
from aws import Connection
from aws import EC2Instance
from aws import Volumes
#import aws

connInst = Connection()
conn = connInst.ec2Connection()

#instantiate Volumes and list volumes
volumeInst = Volumes()
volumeInst.list_volumes(conn)

脚本#2 错误是:

Traceback (most recent call last):
  File "/Users/arun/aws-vol-info2.py", line 30, in <module>
    from aws import Connection
ImportError: cannot import name Connection

如果我在脚本# 2 中注释 from aws ... .. 的行并使用/取消注释 import aws,那么我会得到:

Traceback (most recent call last):
  File "/Users/arun/aws-vol-info2.py", line 35, in <module>
    connInst = Connection()
NameError: name 'Connection' is not defined

【问题讨论】:

    标签: python amazon-web-services amazon-ec2 boto boto3


    【解决方案1】:

    我认为您正在寻找vol.volume_type。您可以在此处查看 ec2.Volume 中的完整属性列表: http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#volume

    【讨论】:

    • 似乎很接近,我试过这个import boto3 ec2 = boto3.resource('ec2', region_name="us-west-2") volumes = ec2.volumes.all() for vol in volumes: for inst_vol in ec2.Volume(vol.id): print "-- " + str(inst_vol.volume_type),但它仍然出错。戳进去。
    • 这行得通:volume = ec2.Volume('vol-b4e1fabc') print volume.volume_type 但是,我想知道,为什么当我在上面使用 2 个 for 循环时它不起作用。第一个 for 循环会将有效的卷 ID vol-xxxxx 传递给 ec2.Volume(&lt;here&gt;),但它因以下错误而哭泣:for inst_vol in ec2.Volume(vol.id): TypeError: 'ec2.Volume' object is not iterable。 `
    • 因为ec2.Volume 不是list 而是一个类。你不能遍历它。您上面的原始打印语句现在可以使用:print "Created(" + str(vol.create_time) + "),VolumeState(" + str(vol.state) + "),VolumeID(" + str(vol.id) + "),VolumeSize(" + str(vol.size) + ") " + vol.volume_type
    • 没关系,谢谢它现在起作用了。我不必使用第二个for 循环。仍在检查是否会根据 AWS 控制台为我提供所有字段。
    【解决方案2】:

    可以增强此脚本以显示更有意义的信息,但使用 jpavs 的提示,我想出了这个脚本 ~/aws-vol-info.py:

    import boto3
    
    # Define the connection
    ec2 = boto3.resource('ec2', region_name="us-west-2")
    
    # Find all volumes
    volumes = ec2.volumes.all()
    
    # Loop through all volumes and pass it to ec2.Volume('xxx')
    for vol in volumes:
        iv = ec2.Volume(str(vol.id))
        print "Created(" + str(iv.create_time) + "),AZ(" + str(iv.availability_zone) + "),VolumeID(" + str(iv.volume_id) + "),VolumeType(" + str(iv.volume_type) + "),State(" + str(iv.state) + "),Size(" + str(iv.size) + "),IOPS(" + str(iv.iops) + "),IsEncrypted(" + str(iv.encrypted) + "),SnapshotID(" + str(iv.snapshot_id) + "),KMS_KEYID(" + str(iv.kms_key_id) + ")",
    
        # The following next 2 print statements variables apply only in my case.
        print ",InstanceID(" + str(iv.attachments[0]['InstanceId']) + "),InstanceVolumeState(" + str(iv.attachments[0]['State']) + "),DeleteOnTerminationProtection(" + str(iv.attachments[0]['DeleteOnTermination']) + "),Device(" + str(iv.attachments[0]['Device']) + ")",
        if iv.tags:
            print ",Name(" + str(iv.tags[0]['Name']) + "),Mirror(" + str(iv.tags[0]['mirror']) + "),Role(" + str(iv.tags[0]['role']) + "),Cluster(" + str(iv.tags[0]['cluster']) + "),Hostname(" + str(iv.tags[0]['hostname']) + "),Generation(" + str(iv.tags[0]['generation']) + "),Index(" + str(iv.tags[0]['index']) + ")"
        print ""
    

    Ran: python ~/aws-vol-info.py 它为我提供了 Python 脚本中提到的所有字段的 CSV 格式值。由于库不提供这些,因此缺少几个 (2-3) AWS 控制台字段,但无论我能从上面得到什么,或者如果我深入研究iv.attachments[0]['&lt;somekey&gt;']iv.tags[0]['&lt;somekey&gt;'],此时对我来说就足够了。

    PSiv.attachmentsiv.tags 都是 iv 对象中的列表/字典类型变量,因此您可以通过显示您想要从中获取的确切内容来增强脚本。因此,如果您想要InstanceID,那么您可以使用:str(iv.attachments[0]['InstanceId']) 来打印它。

    要获得更好的版本:在此处查看 .python 脚本:telegraf - exec plugin - aws ec2 ebs volumen info - metric parsing error, reason: [missing fields] or Errors encountered: [ invalid number]

    在这里也找到了这个有用的脚本:http://www.n2ws.com/blog/ebs-report.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2015-10-07
      • 2013-07-26
      • 2021-01-23
      • 2021-04-12
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多