私はそれがどのように機能するかを理解するのに本当に苦労している小さな問題に遭遇しました。 AWS組織のすべてのアカウントを収集するために、基本的に記述組織を作成するツールを書いています。ドキュメントごと here それはアカウントの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のドキュメントでNextTokenへの多くの参照を見つけることができますが、実際にそれを使用する方法がわかりません。どうすればいいですか?
ここでは、SecretManager内にシークレットが存在するかどうかを確認するためにNextTokenを使用した私の例を示します。初めて視覚化するのに役立ついくつかのプリントもあります
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))