清洁 Boto3 分页

Clean Boto3 Pagination

我正在尝试找到一个非常好的 python 习惯用法,以最“pythonic”的方式使用 aws boto3 分页器。以下是我能想到的最好的,但我仍然不满意。关于如何使分页更简单的任何想法,可能不使用 while True:?

import boto3

client = boto3.client('acm', region_name='ap-southeast-2')

paginator = client.get_paginator('list_certificates')
response_iterator = paginator.paginate()

while True:
    for certificates in response_iterator:
        for certificate in certificates['CertificateSummaryList']:
            print(certificate)

    if response_iterator.resume_token:
        response_iterator = paginator.paginate(
            PaginationConfig={
                'StartingToken': response_iterator.resume_token
            })
    else:
        break

下面的表格不行吗?:

client = boto3.client('acm', region_name='ap-southeast-2')

paginator = client.get_paginator('list_certificates')

for page in paginator.paginate():
    print(page)

它没有真正的文档记录,但你可以用分页器做这样的事情

client = boto3.client('acm')
results = (
    client.get_paginator('list_certificates')
    .paginate()
    .build_full_result()
)
print(results)

edit

ec2 的类似方法具有更烦人的响应结构之一:


import jmespath

client = boto3.client('ec2')
results = (
   client.get_paginator('describe_instances')
   .paginate()
   .build_full_result()
)

# jmespath could be replaced with some nested for loops if you prefer, but I find this "cleaner" and easier to read.

instances = jmespath.search('Reservations[].Instances[]')

for i in instances:
  print(i['InstanceId'])

您可以生成一个示例输出响应,它对于大多数(如果不是全部)服务来说非常方便,这可能让我在尝试计算时节省了

不幸的是,I think there's a bug in the aws-cli skeleton output for acm list-certificates

但相当于 ec2.describe_instances 只是为了好玩。

$ aws ec2 describe-instances --generate-cli-skeleton output
{
    "Reservations": [
        {
            "Groups": [
                {
                    "GroupName": "GroupName",
                    "GroupId": "GroupId"
                }
            ],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ImageId",
                    "InstanceId": "InstanceId",
                    "InstanceType": "InstanceType",
                    "KernelId": "KernelId",
                    "KeyName": "KeyName",
                    "LaunchTime": "1970-01-01T00:00:00",
                    "Monitoring": {
                        "State": "State"
                    },
  ...