当我这样做时:
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
异常。
还有一个注意事项是this的get_credentials()
部分,我只是想知道它是否与凭据缓存有关?
答案 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')