バックグラウンド:
IAMユーザーを一覧表示するAWSオペレーションは、デフォルトで最大50を返します。
以下のドキュメント(リンク)を読んで、次のコードを実行し、「MaxItems」を1000に設定して完全なセットデータを返しました。
paginator = client.get_paginator('list_users')
response_iterator = paginator.paginate(
PaginationConfig={
'MaxItems': 1000,
'PageSize': 123})
for page in response_iterator:
u = page['Users']
for user in u:
print(user['UserName'])
http://boto3.readthedocs.io/en/latest/guide/paginators.htmlhttps://boto3.readthedocs.io/en/latest/reference/services/iam。 html#IAM.Paginator.ListUsers
質問:
たとえば、「MaxItems」が10に設定されている場合、結果をループするのに最適な方法は何でしょうか。の
私は次のようにテストしましたが、 'IsTruncated' == Falseの前にループするのは2回だけで、「KeyError: 'Marker'」になります。 200以上の結果があることを知っているので、なぜこれが起こっているのかわかりません。
marker = None
while True:
paginator = client.get_paginator('list_users')
response_iterator = paginator.paginate(
PaginationConfig={
'MaxItems': 10,
'StartingToken': marker})
#print(response_iterator)
for page in response_iterator:
u = page['Users']
for user in u:
print(user['UserName'])
print(page['IsTruncated'])
marker = page['Marker']
print(marker)
else:
break
ありがとう。
(回答の書き直し)**注**、ページ編集者には、ドキュメントと一致しない(またはその逆)バグが含まれています。 MaxItems
は、アイテムの総数がMaxItemsの数を超えた場合、マーカーまたはNextTokenを返しません。確かにPageSize
は、Marker/NextTokenインジケーターの戻りを制御するものです。
import sys
import boto3
iam = boto3.client("iam")
marker = None
while True:
paginator = iam.get_paginator('list_users')
response_iterator = paginator.paginate(
PaginationConfig={
'PageSize': 10,
'StartingToken': marker})
for page in response_iterator:
print("Next Page : {} ".format(page['IsTruncated']))
u = page['Users']
for user in u:
print(user['UserName'])
try:
marker = page['Marker']
print(marker)
except KeyError:
sys.exit()
コードが機能しないのは間違いではありません。ページネーターのMaxItems
は、「しきい値」インジケーターになるようです。皮肉なことに、元のboto3.iam.list_users内のMaxItems
は、前述のように引き続き機能します。
Boto3.iam.list_usersを確認すると、Marker
が省略されていることに気づくでしょう。そうでない場合は、値を入力する必要があります。どうやら、paginatorはすべてのboto3クラスlist_ *メソッドのラッパーではありません。
import sys
import boto3
iam = boto3.client("iam")
marker = None
while True:
if marker:
response_iterator = iam.list_users(
MaxItems=10,
Marker=marker
)
else:
response_iterator = iam.list_users(
MaxItems=10
)
print("Next Page : {} ".format(response_iterator['IsTruncated']))
for user in response_iterator['Users']:
print(user['UserName'])
try:
marker = response_iterator['Marker']
print(marker)
except KeyError:
sys.exit()
フォローアップできます 私がboto3 githubに提出した問題 。メンバーによると、build_full_result
paginate()の後、欲求の振る舞いを示します。