如何在heroku上的python中使用boto3将文件上传到s3?

时间:2016-12-17 17:24:20

标签: python heroku amazon-s3 boto3

在线的所有示例似乎都使用boto。我可以使用什么代码将文件上传到s3使用boto3?

我正在尝试使用官方文档中的代码,但我收到的错误是版本4身份验证失败。

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

注意:如果您在部署之前在本地进行测试,请记住将凭据添加到本地计算机的环境中。上面介绍了如何使用配置文件创建它。