Как вы используете «NextToken» в вызовах API AWS - PullRequest
0 голосов
/ 29 августа 2018

Я столкнулся с небольшой проблемой, из-за которой мне действительно трудно понять, как это работает. У меня есть инструмент, который я пишу, который в основном описывает организацию для сбора всех учетных записей в нашей организации 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, но я не могу понять, как на самом деле его использовать. Мол, что мне с этим делать?

1 Ответ

0 голосов
/ 29 августа 2018

Не воспринимайте примеры boto3 буквально (они не являются реальными примерами). Вот как это работает:

1) При первом звонке на list_accounts вы сделаете это без NextToken, просто

getListAccounts = org_client.list_accounts()

2) Это вернет ответ JSON, который выглядит примерно так (это то, что сохраняется в вашей переменной getListAccounts):

{
    "Accounts": [<lots of accounts information>], 
    "NextToken": <some token>
}

Обратите внимание, что NextToken возвращается только в том случае, если у вас больше учетных записей, чем один вызов list_accounts может вернуть, обычно это 100 (по умолчанию в документации boto3 не указано, сколько). Если все счета были возвращены за один звонок, в ответе нет NextToken

3) Поэтому, если и только если не все учетные записи были возвращены при первом вызове, теперь вы хотите вернуть больше учетных записей, и вам придется использовать NextToken для того, чтобы сделать это:

getListAccountsMore = org_client.list_accounts(NextToken=getListAccounts['NextToken'])

4) Повторяйте до тех пор, пока в ответе больше не будет возвращено NextToken (тогда вы восстановили все учетные записи).

Так AWS SDK во многих случаях обрабатывает нумерацию страниц. Вы увидите использование NextToken и в других клиентских сервисах.

...