场景:我已经创建了一个用户,并试图使用用户凭据访问bucket,但我收到了InvalidAccessKey错误。但如果我尝试在几秒钟后访问,我会得到正确的响应。
下面是我的代码
import boto3
import json
aws_access_key_id="xxx"
aws_secret_access_key="xxxx"
bucket_name="itsatestfornottoday"
iam_client = boto3.client('iam',region_name="us-east-1",aws_access_key_id=aws_access_key_id,aws_secret_access_key=aws_secret_access_key)
user_name = "test-user"
policy_name = "policy1"
iam_client.create_user(UserName=user_name)
policy_document = {
"Version": "2012-10-17",
"Statement": {"Effect": "Deny", "Action": "s3:ListBucket", "Resource": "*"} }
policy_arn = iam_client.create_policy(PolicyName=policy_name, PolicyDocument=json.dumps(policy_document))["Policy"][
"Arn"]
iam_client.attach_user_policy(UserName=user_name, PolicyArn=policy_arn)
access_key = iam_client.create_access_key(UserName=user_name)
print(access_key)
client = boto3.client(
"s3",
region_name="us-east-1",
aws_access_key_id=access_key["AccessKey"]["AccessKeyId"],
aws_secret_access_key=access_key["AccessKey"]["SecretAccessKey"],
)
print(client.list_objects(Bucket=bucket_name))
错误响应:
botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the ListObjects operation: The AWS Access Key Id you provided does not exist in our records.
感谢任何帮助感谢
但如果我在几秒钟后尝试访问,我会得到正确的响应。
这是因为IAM和其他服务需要很短的时间,更改需要在全球所有AWS系统中传播,AWS内部缓存需要刷新时间。有关详细信息,请参阅:
- 我所做的更改并不总是立即可见
您在IAM(或其他AWS服务(中所做的任何更改都需要时间才能从所有可能的端点可见。部分延迟是由于在世界各地从服务器到服务器、从复制区域到复制区域以及从区域到区域发送数据所需的时间造成的。IAM还使用缓存来提高性能,但在某些情况下,这可能会增加时间:在以前缓存的数据超时之前,更改可能不可见。
我怀疑用户在使用它之前需要一些时间来创建。您可能想查看Waiters上的Boto3文档。
有IAM。服务员UserExists可能正是您所需要的。