Boto3 IAM Создание пользователя завершается неудачно с InvalidClientTokenId - маркер безопасности, включенный в запрос, недействителен - PullRequest
0 голосов
/ 16 января 2019

Когда я делаю это:

session1 = boto3.session.Session(profile_name='my_profile')
iam_client = session1.client('iam')

Учитывая, что user='an_existin_iam_user', нижеприведенное выполнено успешно, поскольку я могу успешно распечатать accessKeyId и accessKeySecret.

responseCreateAccessKey = iam_client.create_access_key(UserName=user)
accessKeyId = responseCreateAccessKey.get('AccessKey').get('AccessKeyId')
accessKeySecret = responseCreateAccessKey.get('AccessKey').get('SecretAccessKey')

Следовательно, я могу использовать iam_client для создания учетных данных для доступа других пользователей (учитывая, что профиль my_profile AWS содержит кредиты для пользователя IAM администратора)

Теперь, с новыми учетными данными, указанными выше, я хочу создать нового пользователя IAM. Ниже приведены вещи, которые я пытался достичь:

Попытка 1

temp_session = boto3.Session(aws_access_key_id=accessKeyId,aws_secret_access_key=accessKeySecret,region_name='ap-southeast-1')
temp_iam_client = temp_session.client('iam')
responseCreateUser = temp_iam_client.create_user(UserName='my-new-user')

Попытка 2

temp_iam_client = boto3.client('iam',aws_access_key_id=accessKeyId,aws_secret_access_key=accessKeySecret,region_name='ap-southeast-1')
responseCreateUser = temp_iam_client.create_user(UserName='my-new-user')

Попытка 3

temp_session = boto3.session.Session(aws_access_key_id=accessKeyId,aws_secret_access_key=accessKeySecret,region_name='ap-southeast-1')
temp_iam_client = temp_session.client('iam')
responseCreateUser = temp_iam_client.create_user(UserName='my-new-user')

Попытка 4 (как также предлагается в одном из ответов ниже)

temp_session = boto3.session.Session(aws_access_key_id=accessKeyId,aws_secret_access_key=accessKeySecret,region_name='ap-southeast-1')
temp_iam_client = temp_session.client('iam')
time.sleep(5)
responseCreateUser = temp_iam_client.create_user(UserName='my-new-user')

Каждое из вышеперечисленных сбоев со следующей ошибкой

Произошла ошибка (InvalidClientTokenId) при вызове операции CreateUser: маркер безопасности, включенный в запрос, недействителен.

Есть что-то, чего мне здесь не хватает? Все, что я хочу сделать, это создать создать нового пользователя с (как показано выше) вновь сгенерированными учетными данными доступа (ключ доступа и секрет доступа). Это нормально, если я получу исключение AccessDenied. Я ожидаю, что для пользователей, которые не имеют необходимых привилегий. Но исключение InvalidClientTokenId - это то, чего я не понимаю.

Кроме того, если это помогает, я пытаюсь сделать это (создание ключа доступа и секрета, а затем использовать его для создания нового пользователя) в итеративном цикле для более чем 100 пользователей. (Цикл, конечно, обрабатывает случаи, когда ключи доступа для обрабатываемого в данный момент пользователя уже исчерпаны и т. Д.) Например, если я попытаюсь выполнить указанное выше действие по созданию пользователя из консоли ipython, отдельно для пользователя, скажем, existing-test-user, то я получу правильное исключение AccessDenied. Однако, когда цикл достигает этого имени пользователя (например, после итерации нескольких начальных пользователей), я получаю исключение InvalidClientTokenId.

На дополнительном примечании проходил этот раздел get_credentials(), и мне просто интересно, имеет ли это какое-либо отношение к кэшированию учетных данных?

1 Ответ

0 голосов
/ 17 января 2019

API-интерфейсы AWS IAM используют в конечном итоге согласованную модель, поэтому задержки возникают во время обновления ресурсов IAM (например, при создании ключей доступа). Это означает, что даже если вызов функции для создания ключа доступа AWS завершается успешно, это не обязательно означает, что ключ доступа AWS завершил свое создание на серверах AWS немедленно. https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency

Новый ответ

Используя backoff , мы можем установить политику повторных попыток для создания пользователей IAM с использованием вновь созданных ключей доступа AWS, имеющих время ожидания:

import boto3
import botocore
import backoff


@backoff.on_exception(backoff.expo, botocore.exceptions.ClientError, max_time=30)
def create_user(access_key_id, access_key_secret, username):
    temp_session = boto3.Session(aws_access_key_id=access_key_id,aws_secret_access_key=access_key_secret,region_name='ap-southeast-1')
    temp_iam_client = temp_session.client('iam')
    temp_iam_client.create_user(UserName=username)


session = boto3.session.Session(profile_name='default')
iam_client = session.client('iam')

response_access_key = iam_client.create_access_key(UserName='user')
access_key_id = response_access_key.get('AccessKey').get('AccessKeyId')
access_key_secret = response_access_key.get('AccessKey').get('SecretAccessKey')
create_user(access_key_id, access_key_secret, 'my-new-user')

Старый ответ

Обход режима ожидания сразу после создания ключа доступа AWS - это обходной путь.

import boto3
import time
session1 = boto3.session.Session(profile_name='my_profile')
iam_client = session1.client('iam')

responseCreateAccessKey = iam_client.create_access_key(UserName=user)
accessKeyId = responseCreateAccessKey.get('AccessKey').get('AccessKeyId')
accessKeySecret = responseCreateAccessKey.get('AccessKey').get('SecretAccessKey')

time.sleep(10)
temp_session = boto3.Session(aws_access_key_id=accessKeyId,aws_secret_access_key=accessKeySecret,region_name='ap-southeast-1')
temp_iam_client = temp_session.client('iam')
responseCreateUser = temp_iam_client.create_user(UserName='my-new-user')
...