在线的所有示例似乎都使用boto。我可以使用什么代码将文件上传到s3使用boto3?
我正在尝试使用官方文档中的代码,但我收到的错误是版本4身份验证失败。
答案 0 :(得分:2)
根据quickstart guide将密钥放入密钥文件中,然后使用以下代码:
import boto3
s3 = boto3.resource(service_name='s3', region_name='REGION_NAME')
data = open('PATH_TO_FILE_ON_DISK', 'rb')
s3.Bucket('BUCKET_NAME').put_object(Key='FILENAME_ON_S3', Body=data)
官方文档没有说明区域名称是必需的,否则您可能会收到错误,并且无法在heroku上存储该区域的配置文件。它必须包含在资源调用中。
答案 1 :(得分:1)
由于heroku无法访问您的AWS config file,因此您必须使用environment variables。然后,您可以使用各种s3 file upload methods中的任何一种。
from os import getenv
import boto3
boto_kwargs = {
"aws_access_key_id": getenv("AWS_ACCESS_KEY_ID"),
"aws_secret_access_key": getenv("AWS_SECRET_ACCESS_KEY"),
"region_name": getenv("AWS_REGION"),
}
s3_client = boto3.Session(**boto_kwargs).client("s3")
s3_client.upload_fileobj(<f>, <bucket_name>, <object_name>)
答案 2 :(得分:0)
此处仅供参考,您可以解决如何解决所有新区域使用的v4身份验证问题 - 在配置文件中设置signature_version
:
--- .aws/config ---
[default]
output = json
[profile myprofile]
region = REGION_NAME
s3=
signature_version = s3
# addressing_style = path
--- .aws/credentials ---
[myprofile]
aws_access_key_id = <access-key>
aws_secret_access_key = <secret-key>
--- python ---
import boto3
session = boto3.Session(profile_name='myprofile')
s3 = session.resource('s3')
with open('PATH_TO_FILE_ON_DISK', 'rb') as data:
s3.Object('BUCKET_NAME', 'FILENAME_ON_S3').put(Body=data)
可替换地:
s3.Object('BUCKET_NAME', 'FILENAME_ON_S3').upload_file('PATH_TO_FILE_ON_DISK')
答案 3 :(得分:0)
最近,Heroku发布了一篇关于在Heroku中将文件上传到S3的好文章。 Direct to S3 File Uploads in Python
根据说明,您需要在Heroku App配置变量中指定AWS Credentials和Bucket名称。
为了让您的应用程序访问AWS凭据以签署上传请求,需要将它们作为配置变量添加到Heroku中:
$ heroku config:set AWS_ACCESS_KEY_ID =xxx AWS_SECRET_ACCESS_KEY =yyy
Adding config vars and restarting app... done, v21
AWS_ACCESS_KEY_ID => xxx
AWS_SECRET_ACCESS_KEY => yyy
除AWS访问凭证外,还可以设置目标S3存储桶的名称:
heroku config:set S3_BUCKET = zzz
Adding config vars and restarting app... done, v21
S3_BUCKET => zzz
注意:如果您在部署之前在本地进行测试,请记住将凭据添加到本地计算机的环境中。上面介绍了如何使用配置文件创建它。