Ошибка создания пользователя Boto3 IAM с InvalidClientTokenId - токен безопасности, включенный в запрос, недействителен.

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

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 для создания учетных данных доступа для других пользователей (учитывая, что профиль AWS my_profile содержит кредиты для пользователя 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: токен безопасности, включенный в запрос, недействителен.

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

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

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


person qre0ct    schedule 16.01.2019    source источник


Ответы (1)


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')
person Llama.new    schedule 17.01.2019
comment
Я как бы догадался об этом и уже попробовал, хотя и с sleep(5) в моем случае. Приносим извинения за то, что не обновили это как попытку, и спасибо, что указали на это. Однако это тоже не сработало, что дало то же исключение, по крайней мере, с 5 секундами сна. Позвольте мне попробовать и с 10, на всякий случай. - person qre0ct; 17.01.2019
comment
Я тоже пробовал это со сном (5), и у меня это не получилось, затраченное время может варьироваться и иногда может быть больше 10 (я знаю, что это неприятно) - person Llama.new; 17.01.2019
comment
Хммм, есть ли другой способ решения этой проблемы? Например, API AWS, который можно использовать для проверки, действительно ли ресурс был создан на сервере или нет. Если есть что-то в этом роде, мы можем повторять попытку, пока это не будет сделано. Что сказать ? - person qre0ct; 17.01.2019
comment
docs.aws.amazon.com/IAM/latest / UserGuide / не говорит много о том, как справляться с задержками. Это возлагает бремя ответственности на разработчика. - person qre0ct; 17.01.2019
comment
Грязным решением может быть поиск этого исключения и повторение фиксированного n количества раз. Если это хорошо и хорошо, в противном случае просто отбросьте этот запрос и двигайтесь дальше. - person qre0ct; 17.01.2019
comment
Я обновил ответ с помощью декоратора экспоненциальной задержки, не очень, но более простое решение - person Llama.new; 17.01.2019