[英]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.