【问题标题】:How do I upload a file to s3 using boto3 in python on heroku?如何在heroku上的python中使用boto3将文件上传到s3?
【发布时间】:2020-03-28 06:16:40
【问题描述】:

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

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

【问题讨论】:

  • boto3.readthedocs.io/en/latest请尝试搜索网络。
  • 为了后代,官方文档遗漏了一个非常关键的点,就像文档经常做的那样。这就是这篇文章的目的。
  • 哪个关键点? Quickstart 似乎提供了您正在寻找的东西。
  • , region_name='REGION_NAME') 如果您不幸选择了一个默认值不起作用的区域,例如 us-east-2,则需要。
  • region 可以在配置文件中设置(如快速入门中所述),region_namesessionresource 的文档中有明确说明。顺便说一句,您可能想探索 .aws/config 中的配置文件并使用 session 对象。

标签: python heroku amazon-s3 boto3


【解决方案1】:

根据quickstart guide将你的密钥放入keyfile中,然后使用如下代码:

       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上。它必须包含在资源调用中。

【讨论】:

  • 这没有回答“什么是新语法?”这个问题。
  • 在什么方面不呢?如果您复制并粘贴该代码,它将完美运行。无论如何,没关系。我只需要填充一些空间,因为我已经搜索这个 sn-p 代码将近 4 天了。文档不清楚。
  • 好的,我不打算就此争论,我将删除我的反对票。
  • 我的投票被锁定,我无法删除它,所以请对您的答案进行一些编辑。
  • Body 需要是数据(例如 'this is my data')或文件类型对象,例如open('PATH_TO_FILE_ON_DISK')。您的示例只是一个包含字符串 PATH_TO_FILE_ON_DISK 的对象,而不是文件内容。
【解决方案2】:

由于 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>)

【讨论】:

    【解决方案3】:

    仅供参考,这里是您如何解决用于所有新区域的 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')
    

    【讨论】:

    • 除非您知道隐藏功能,否则配置文件在 heroku 上不起作用
    【解决方案4】:

    最近,Heroku 发布了一篇关于在 Heroku 中将文件上传到 S3 的好文章。 Direct to S3 File Uploads in Python.

    根据说明,您需要在 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
    

    除了 AWS 访问凭证,设置您的目标 S3 存储桶的名称:

    heroku config:set S3_BUCKET = zzz
    Adding config vars and restarting app... done, v21
    S3_BUCKET     => zzz
    

    注意:如果您在部署之前在本地进行测试,请记住将凭据也添加到本地计算机的环境中。上面已经描述了如何使用配置文件进行制作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2021-07-13
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多