web-dev-qa-db-fra.com

Comment utilisez-vous "NextToken" dans les appels d'API AWS

J'ai rencontré un petit problème que j'ai vraiment du mal à comprendre comment cela fonctionne. J'ai un outil que j'écris qui fait essentiellement une description-organisation pour collecter tous les comptes dans notre organisation AWS. Selon la documentation ici il dit qu'il répond avec un json des comptes qui dans mon cas seront des centaines et des centaines de comptes. J'ai donc écrit du code très simple pour changer de rôle dans notre compte principal et passer l'appel:

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'
)

Mais lorsque j'exécute le code, j'obtiens l'erreur suivante:

"botocore.errorfactory.InvalidInputException: une erreur s'est produite (InvalidInputException) lors de l'appel de l'opération ListAccounts: vous avez spécifié une valeur non valide pour nextToken. Vous devez obtenir la valeur de la réponse à un appel précédent à l'API."

Je suis vraiment perplexe sur ce que cela signifie. Je vois le NextToken, et je peux trouver de nombreuses références à ce sujet dans la documentation AWS, mais je n'arrive pas à comprendre comment réellement l'utiliser. Qu'est-ce que je dois en faire?

7
Geoff Sweet

Voici mon exemple où j'ai utilisé NextToken pour vérifier si un secret existe à l'intérieur de SecretManager. Il y a aussi des impressions utiles pour visualiser la première fois

def check_if_secret_existv2(username):
    results_for_call=5
    response = client.list_secrets(MaxResults=results_for_call)
    i=0
    while True:
        i=i+1
        if 'NextToken' in response:
            response = client.list_secrets(MaxResults=results_for_call,NextToken=response['NextToken'])
        else:
            response = client.list_secrets(MaxResults=results_for_call)

        for secret in response['SecretList']:
            print(secret['Name'])
            if secret['Name'] == username:
                return True
        print('End cycle '+str(i))

        if 'NextToken' not in response:
            break
    return False

print(check_if_secret_existv2(myusername))
0
peppelinux