在aws organization中,使用分页列出所有账户

in aws orgazination, use paginate to list all accounts

这应该是关于在 boto3 中使用 paginate 的一般性问题。

在这种情况下,当我在AWS Orgazinations下得到很多账户(100+)时,直接使用list_account()而不用with NextToken,你无法列出所有账户。

response = client.list_accounts()

我知道正确的方法是添加 NextTokenMaxResults,但这需要更多编码。

response = client.list_accounts(
    NextToken='string',
    MaxResults=123
)

所以我改用另一种方法,称为 paginate,参考 class Organizations.Paginator.ListAccounts。它报告的帐户多于 list_accounts(),但仍无法列出所有帐户。

请求语法与 list_accounts()

中的 MaxItemsPageSize 相似
response_iterator = paginator.paginate(
    PaginationConfig={
        'MaxItems': 123,
        'PageSize': 123,
        'StartingToken': 'string'
    }
)

我有两个问题:

将不胜感激。

所以我错了,也许一开始就错了。

分页器会自动处理循环。我无法 运行 对组织 list_accounts() 进行测试,因为我没有那么多帐户可以 运行 进行测试,但我对 s3 存储桶对象进行了测试。

aws cli 获取 s3 对象

$ aws s3api list-objects --bucket bucket-demo |jq '.Contents|length'

8696

所以我可以确认这个桶中有 8000 多个对象。

通过 python 带有分页器的 sdk 获取 s3 对象

>>> import boto3
>>> client = boto3.client('s3')
>>> paginator = client.get_paginator('list_objects')
>>> response_iterator = paginator.paginate(Bucket="bucket-demo")
>>> for i in response_iterator:
...   print(len(i['Contents']))
...
1000
1000
1000
1000
1000
1000
1000
1000
696

证明分页器自动执行循环。

说明我们为什么需要分页器的问题

>>> import boto3
>>> client = boto3.client('s3')
>>> response = client.list_objects(Bucket="bucket-demo")
>>> len(response['Contents'])
1000

所以paginator可以大大简化你的代码,避免用正常的方式开发自己的循环。