繁体   English   中英

Boto3 IAM用户创建失败,并显示InvalidClientTokenId-请求中包含的安全令牌无效

[英]Boto3 IAM User creation failing with InvalidClientTokenId - The security token included in the request is invalid

当我这样做时:

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

上述每一项均失败,并出现以下错误

调用CreateUser操作时发生错误(InvalidClientTokenId):请求中包含的安全令牌无效。

我在这里缺少什么吗? 我要做的就是用新生成的访问凭据(如上所示)创建一个新用户(访问密钥和访问密码)。 如果我收到AccessDenied异常也可以。 我期望对于没有正确权限的用户。 但是我不知道InvalidClientTokenId异常是为什么我什至得到它。

另外,如果有帮助,我将尝试在100个以上的用户的迭代循环中进行此操作(创建访问密钥和机密,然后使用它来创建新用户)。 (当然,该循环处理的情况是当前正在处理的用户的访问密钥已经用尽,等等。)例如,如果我尝试从ipython控制台中进行上述用户创建操作,则分别针对该用户说existing-test-user ,然后我得到正确的AccessDenied异常。 但是,当循环达到该用户名时(例如,在对最初的几个用户进行迭代之后),我得到了InvalidClientTokenId异常。

在附加的注释通过去这个get_credentials()部分,我只是想知道,如果它有什么关系凭据缓存?

AWS IAM API采用最终一致的模型,因此在更新IAM资源(例如创建访问密钥)期间会发生延迟。 这意味着即使用于创建AWS Access Key的函数调用成功,也不一定意味着AWS Access Key立即在AWS Servers上完成了其创建。 https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency

新答案

使用backoff ,我们可以设置重试策略以使用新创建的AWS访问密钥创建IAM用户,同时发生超时:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM