Jo *_* Ko 7 amazon-s3 boto amazon-web-services 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)
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:
botocore.exceptions.ClientError:调用ListObjects操作时发生错误(InvalidAccessKeyId):您提供的AWS Access Key ID在我们的记录中不存在。
我可能做错了什么?我检查了我aws_access_key_id和aws_secret_access_key多次,但仍然得到同样的错误。本地相同的代码,但不在虚拟机上,实际上也可以在另一台计算机上工作。我必须对键进行硬编码是有原因的。
Jes*_* H. 23
Boto3 用户请注意
如果您使用临时凭证通过 Boto3 连接到 AWS 服务,则必须包含当前凭证aws_session_token作为boto3.session.Session实例的参数。
import os
import boto3
session = boto3.Session(
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
aws_session_token=os.environ["AWS_SESSION_TOKEN"],
)
# 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)
Run Code Online (Sandbox Code Playgroud)
当您在 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.
Run Code Online (Sandbox Code Playgroud)
关于aws_session_token
指定用作凭证一部分的 AWS 会话令牌以对用户进行身份验证。仅当您手动指定临时安全凭证时才需要会话令牌。
Ale*_*one 11
您需要设置 boto3 会话的访问权限。你真的不想把你的钥匙放在你的代码中。我建议首先做的是运行 'aws configure' 并在 .credentials 文件中设置 aws_access_key_id 和 aws_secret_access_key。然后在您的代码中执行以下操作:
session = boto3.Session(profile_name='name_of_your_profile')
Run Code Online (Sandbox Code Playgroud)
如果您只有默认配置文件,则可能不需要这样做或为了更好的措施,只需输入:
session = boto3.Session(profile_name='default')
Run Code Online (Sandbox Code Playgroud)
一旦你在你的代码中拥有它,你就可以建立到 s3 的连接:
s3 = session.resource('s3')
bucket = s3.Bucket('bucketone')
for obj in bucket.objects.all():
print(obj.key)
Run Code Online (Sandbox Code Playgroud)
您的代码也存在一些问题。您正在创建一个 s3 客户端。S3 客户端没有 Bucket 方法或属性。要对 s3 客户端执行相同的操作,您可以执行以下操作:
s3client = session.client('s3')
response = s3client.get_object(Bucket='bucketone', key='your key')
Run Code Online (Sandbox Code Playgroud)
然后,您可以遍历返回的响应以查看存储桶中的对象列表。
那应该解决你的错误。
| 归档时间: |
|
| 查看次数: |
7981 次 |
| 最近记录: |