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

时间:2019-01-16 10:14:21

标签: amazon-web-services aws-sdk boto3 aws-iam

当我这样做时:

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异常。

还有一个注意事项是thisget_credentials()部分,我只是想知道它是否与凭据缓存有关?

1 个答案:

答案 0 :(得分:1)

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用户:

users

旧答案

在创建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')