Boto3错误:您提供的AWS Access Key ID在我们的记录中不存在

时间:2017-05-11 06:06:06

标签: amazon-web-services amazon-s3 boto boto3

我目前正在尝试访问虚拟机内的Amazon S3并下载如下文件:

s3 = boto3.resource('s3',
         aws_access_key_id="xxxxxxxxxxx",
         aws_secret_access_key="xxxxxxxxxxxxxxxxx")
s3client = boto3.client('s3')

bucket = s3.Bucket('bucketone')

for obj in bucket.objects.all():
    s3client.download_file(bucket_name, obj.key, filename)

但是我收到了错误:

  

botocore.exceptions.ClientError:调用ListObjects操作时发生错误(InvalidAccessKeyId):您提供的AWS Access Key ID在我们的记录中不存在。

我可能做错了什么?我多次检查了aws_access_key_idaws_secret_access_key,但仍然遇到了同样的错误。本地相同的代码,但不在虚拟机上,实际上也可以在不同的计算机上工作。我必须这样做,因为我必须在键盘上进行硬编码。

5 个答案:

答案 0 :(得分:4)

您需要设置boto3会话的访问权限。您真的不想将密钥放在代码中。我建议先做的是运行'aws configure'并在.credentials文件中设置aws_access_key_id和aws_secret_access_key。然后在您的代码中执行以下操作:

session = boto3.Session(profile_name='name_of_your_profile')

如果你只有默认的个人资料,你可能不需要这样做或者做得很好,只需要:

session = boto3.Session(profile_name='default')

在您的代码中拥有该代码后,您可以通过以下方式建立与s3的连接:

s3 = session.resource('s3')
bucket = s3.Bucket('bucketone')
for obj in bucket.objects.all():
   print(obj.key)

您的代码也存在一些问题。您正在创建一个s3客户端。 S3客户端没有Bucket方法或属性。要使用s3客户端执行相同的操作:

s3client = session.client('s3')
response = s3client.get_object(Bucket='bucketone', key='your key')

然后,您可以遍历返回的响应,以查看存储桶中的对象列表。

那应该照顾你的错误。

答案 1 :(得分:1)

初步回答:如果您正在使用EC2 / Lambda / etc。您将获得temporary security credentials,这意味着您需要使用AWS_SESSION_TOKEN环境变量并将其传递给boto3。

省略它会抛出InvalidAccessKeyId错误。

更新:我无法记得确切,但我认为我当时问题的原因并非归因于AWS_SESSION_TOKEN,而是因为我捆绑了自己的boto3 lib到Lambda应用程序(使用Zappa)。在我"删除" boto3(因此使用Lambda的内置boto3)问题消失了。

答案 2 :(得分:1)

您需要设置AWS Command-line界面并配置其设置。 1.下载并安装AWS CLI。 2.运行aws configure`命令并提供访问密钥和秘密密钥。 如果仍然出现错误,请检查IAM用户的编程访问权限是否处于活动状态。删除现有的访问密钥,然后创建一个新的供使用。

答案 3 :(得分:0)

不要在EC2实例中使用凭据,根据AWS的说法,这不是安全的好习惯,而是使用AWS凭据(access_key_id和secret_access_key)来创建IAM角色。

IAM->创建角色-> AWS服务(单击EC2)->下一个权限->选择“ AmazonS3FullAccess”或“ AmazonS3ReadOnlyAccess”,或选择您喜欢的任何内容。创建完成后,请返回您的实例,并将您创建的角色名称附加到实例中。

这将正常工作。

答案 4 :(得分:0)

Boto3 用户注意

TL;DR

如果您使用临时凭证通过 Boto3 连接到 AWS 服务,您必须将当前的 aws_session_token 作为参数包含在您的 boto3.session.Session 实例中。

from boto3.session import Session

# Ideally this is picked up your ENV.
id_ = "<id>"
secret = "<secret>"
token = "token"

session = Session(
                aws_access_key_id=id_,
                aws_secret_access_key=secret,
                aws_session_token=token,
                region_name='<region>'
            )

# Test it on a service (yours may be different)
s3 = session.resource('s3')

# Print out bucket names
for bucket in s3.buckets.all():
    print(bucket.name)

说明

当您在 Boto3 中测试凭证时,这是一条至关重要的信息: 您收到的错误可能是这样的,

<块引用>

ClientError:调用 ListBuckets 操作时发生错误 (InvalidAccessKeyId):我们的记录中不存在您提供的 AWS 访问密钥 ID。

但如果您使用的是临时凭证(在我的情况下,是基于角色的凭证),则可能意味着您缺少 aws_session_token

根据 AWS 文档,这些是 boto3.session.Session 对象可用的参数,但是,对于 Boto3 中的这种行为,没有任何指示或说明:

Parameters
aws_access_key_id (string) -- AWS access key ID
aws_secret_access_key (string) -- AWS secret access key
aws_session_token (string) -- AWS temporary session token
region_name (string) -- Default region when creating new connections
botocore_session (botocore.session.Session) -- Use this Botocore session instead of creating a new default one.
profile_name (string) -- The name of a profile to use. If not given, then the default profile is used.

关于aws_session_token

<块引用>

指定用作凭证一部分的 AWS 会话令牌以对用户进行身份验证。仅当您手动指定临时安全凭证时才需要会话令牌。

资源