我目前正在尝试访问虚拟机内的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_id
和aws_secret_access_key
,但仍然遇到了同样的错误。本地相同的代码,但不在虚拟机上,实际上也可以在不同的计算机上工作。我必须这样做,因为我必须在键盘上进行硬编码。
答案 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 用户注意
如果您使用临时凭证通过 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 会话令牌以对用户进行身份验证。仅当您手动指定临时安全凭证时才需要会话令牌。