所有在线示例似乎都使用boto。我应该使用什么代码来使用boto3上传文件到S3?
我正在尝试使用官方文档中的代码,但是我遇到了版本4身份验证失败的错误。
按照快速入门指南将您的密钥放入密钥文件,然后使用以下代码:
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)
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>)
最近,Heroku发布了一篇有关在Heroku中将文件上传到S3的好文章。使用Python直接上传到S3。
根据说明,您需要在Heroku应用程序配置变量中指定AWS凭据和存储桶名称。
为了使您的应用程序能够访问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
heroku config:set S3_BUCKET = zzz
Adding config vars and restarting app... done, v21
S3_BUCKET => zzz
注意:如果您在部署之前进行本地测试,请记得将凭据添加到本地计算机的环境中。如何通过配置文件实现已经在上面进行了说明。
仅供参考,以下是您可以解决所有新地区使用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')
region
可以在配置文件中设置(如快速入门中所述),而region_name
在session
和resource
的文档中有清晰的解释。顺便提一下,您可能想要在.aws/config
中探索配置文件,并使用session
对象。 - AChampion