【问题标题】:How to get list of all the ebs snapshots available in account with python boto using paginator如何使用分页器使用 python boto 获取帐户中可用的所有 ebs 快照列表
【发布时间】:2020-01-02 09:47:55
【问题描述】:

我正在尝试获取 AWS 账户中所有可用快照的列表。 我写了以下代码。

def lambda_handler(event, context):
  ec2 = boto3.client('ec2')
  resp_describe_snapshots = ec2.describe_snapshots(OwnerIds=['self'])
  snapshot =  resp_describe_snapshots['Snapshots']

  snapshots = {}
  os.chdir('/tmp')

  for snapshotIdList in resp_describe_snapshots['Snapshots']:
    snapid =  snapshotIdList.get('SnapshotId')
    Des = snapshotIdList.get('Description')
    sttime = snapshotIdList.get('StartTime').strftime("%b %d %Y")

    #print(snapshotIdList.get('SnapshotId')+ ","+ snapshotIdList.get('Description')+ ","+ snapshotIdList.get('StartTime').strftime("%b %d %Y"))    

  for response in ec2.get_paginator('describe_snapshots').paginate(OwnerIds=['self'],Filters=[{'Name': 'tag:Name','Values': ['Ubuntu']}]):
    snapshots.update([(snapshot['SnapshotId'], snapshot) for snapshot in response['Snapshots']])
    print(snapshots)

如何列出所有快照 ID 及其创建日期?

我也想创建一个 csv 文件。

【问题讨论】:

    标签: python amazon-web-services amazon-ec2 aws-lambda boto3


    【解决方案1】:

    这是我的分页示例。

    import boto3
    
    boto3 = boto3.session.Session(region_name='ap-northeast-2')
    ec2 = boto3.client('ec2')
    
    page_iterator = ec2.get_paginator('describe_snapshots').paginate()
    
    for page in page_iterator:
        for snapshot in page['Snapshots']:
            print(snapshot['SnapshotId'], snapshot['StartTime'])
    

    结果是

    snap-5... 2015-MM-dd 18:21:59+00:00
    snap-e... 2016-MM-dd 22:15:38+00:00
    snap-e... 2016-MM-dd 22:15:46+00:00
    snap-e... 2017-MM-dd 12:59:00+00:00
    snap-e... 2016-MM-dd 20:39:12+00:00
    snap-8... 2017-MM-dd 13:04:34+00:00
    snap-7... 2017-MM-dd 17:28:49+00:00
    snap-b... 2016-MM-dd 14:52:38+00:00
    snap-b... 2016-MM-dd 21:18:23+00:00
    snap-d... 2016-MM-dd 07:43:38+00:00
    snap-2... 2015-MM-dd 00:07:19+00:00
    snap-b... 2017-MM-dd 22:03:26+00:00
    snap-0... 2016-MM-dd 00:32:35+00:00
    snap-c... 2016-MM-dd 21:57:05+00:00
    snap-7... 2016-MM-dd 04:10:45+00:00
    ...
    

    结果数超过 10,000 个。


    制作csv,

    import boto3
    import csv
    
    boto3 = boto3.session.Session(region_name='ap-northeast-2')
    ec2 = boto3.client('ec2')
    
    with open('snapshots.csv', 'w') as csvfile: 
        fields = ['SnapshotId', 'StartDate'] 
        writer = csv.writer(csvfile)
        writer.writerow(fields) 
    
        page_iterator = ec2.get_paginator('describe_snapshots').paginate()
    
        for page in page_iterator:
            for snapshot in page['Snapshots']:
                temp = [snapshot['SnapshotId'], snapshot['StartTime']]
                writer.writerows([temp])
    
    csvfile.close()
    

    直接将 csv 更新为 S3,

    import boto3
    import csv
    import io
    
    boto3 = boto3.session.Session(region_name='ap-northeast-2')
    ec2 = boto3.client('ec2')
    s3 = boto3.client('s3')
    
    fields = ['SnapshotId', 'StartDate'] 
    csvio = io.StringIO()
    writer = csv.writer(csvio)
    writer.writerow(fields) 
    
    page_iterator = ec2.get_paginator('describe_snapshots').paginate()
    
    for page in page_iterator:
        for snapshot in page['Snapshots']:
            temp = [snapshot['SnapshotId'], snapshot['StartTime']]
            writer.writerows([temp])
    
    
    s3.put_object(Body=csvio.getvalue(), ContentType='application/vnd.ms-excel', Bucket='bucket', Key='snapshot.csv') 
    csvio.close()
    

    【讨论】:

    • 在ec2下面添加s3 = boto3.cliend('s3'),并在最后的s3.upload_file('snapshots.csv', 'bucket', 'object_name')添加一行
    • 查看this 了解其他解决方案。你甚至可以使用 s3fs 包直接从 s3 读写文件。
    • 使用StringIO() 添加了新代码。尝试这个。如果这仍然是空的,请检查您的快照过滤条件,这可能不会给出正确的结果。
    • 您检查过我的代码吗? writer.writerows([temp])
    • 是的......现在它对我来说工作正常............非常感谢您的帮助!
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多