如何在 AWS API 调用中使用“NextToken”

新手上路,请多包涵

我遇到了一个小问题,我真的很难理解它是如何工作的。我有一个我正在编写的工具,它基本上执行一个描述组织来收集我们 AWS 组织中的所有帐户。根据 此处 的文档,它说它会以帐户的 json 响应,在我的情况下,这将是成百上千个帐户。所以我写了一些非常简单的代码来将角色切换到我们的主帐户并进行调用:

 import boto3
import uuid
import pprint

iam_client = boto3.client('iam')
sts_client = boto3.client('sts')
org_client = boto3.client('organizations')

print("Starting in account: %s" % sts_client.get_caller_identity().get('Account'))

assumedRoleObject = sts_client.assume_role(
    RoleArn="arn:aws:iam::123456xxx:role/MsCrossAccountAccessRole",
    RoleSessionName="MasterPayer"
)

credentials = assumedRoleObject['Credentials']

org_client = boto3.client(
    'organizations',
    aws_access_key_id = credentials['AccessKeyId'],
    aws_secret_access_key = credentials['SecretAccessKey'],
    aws_session_token = credentials['SessionToken'],
)

getListAccounts = org_client.list_accounts(
    NextToken='string'
)

但是当我执行代码时,出现以下错误:

“botocore.errorfactory.InvalidInputException:调用 ListAccounts 操作时发生错误 (InvalidInputException):您为 nextToken 指定了无效值。您必须从对先前 API 调用的响应中获取该值。”

我真的不知道那是什么意思。我看到了 NextToken,我可以在 AWS 文档中找到很多对它的引用,但我不知道如何实际使用它。比如,我需要用它做什么?

原文由 Geoff Sweet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 854
2 个回答

不要从字面上理解 boto3 示例(它们不是实际示例)。这是它的工作原理:

1)你第一次打电话给 list_accounts 你会在没有 NextToken 的情况下做到这一点,所以很简单

getListAccounts = org_client.list_accounts()

  1. 这将返回一个大致如下所示的 JSON 响应(这是保存在您的 getListAccounts 变量中的内容):
 {
    "Accounts": [<lots of accounts information>],
    "NextToken": <some token>
}

请注意, NextToken 仅在您的帐户多于一个时返回 list_accounts 调用可以返回,通常这是 100 (文档没有说明bo03–默认很多)。如果一次调用返回所有帐户,则响应中没有 NextToken

  1. 因此,当且仅当不是所有帐户都在第一次调用中返回时,您现在想要返回更多帐户,您将必须使用 NextToken 才能执行此操作:
 getListAccountsMore = org_client.list_accounts(NextToken=getListAccounts['NextToken'])

  1. 重复直到响应中不再返回 NextToken (然后你检索了所有帐户)。

这就是 AWS 开发工具包在许多情况下处理分页的方式。您还将在其他服务客户端中看到 NextToken 的用法。

原文由 Torsten Engelbrecht 发布,翻译遵循 CC BY-SA 4.0 许可协议

与其他答案相同,但有一个带有简单 while 循环的简短片段。

 response = client.list_accounts()
results = response["Accounts"]
while "NextToken" in response:
    response = client.list_accounts(NextToken=response["NextToken"])
    results.extend(response["Accounts"])

原文由 Vincent J 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题