如何在heroku上使用python中的boto3将文件上载到s3?
所有在线示例似乎都使用boto。我可以使用什么代码使用boto3将文件上载到s3如何在heroku上使用python中的boto3将文件上载到s3?,python,heroku,amazon-s3,boto3,Python,Heroku,Amazon S3,Boto3,所有在线示例似乎都使用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.B
我试图使用官方文档中的代码,但我收到一个错误,版本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)
官方文档没有明确说明区域名称是必需的,否则可能会出现错误,并且无法在heroku上存储该区域的配置文件。它必须包含在资源调用中。仅供参考以下是如何解决所有新区域使用v4身份验证的问题-在配置文件中设置签名版本:
--- .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)
最近,Heroku发布了一篇关于将文件上传到Heroku中S3的好文章 根据说明,您需要在Heroku应用程序配置变量中指定AWS凭据和Bucket名称 为了让您的应用程序访问AWS凭据以签署上载请求,需要在Heroku中将其作为配置变量添加: 除AWS访问凭据外,设置目标S3存储桶的名称:
注意:如果在部署之前在本地进行测试,请记住也要将凭据添加到本地计算机的环境中。上面描述了如何使用配置文件进行配置。由于heroku无法访问您的,您必须使用。然后,您可以使用任何一种
从操作系统导入getenv
进口boto3
boto_kwargs={
“aws访问密钥id”:getenv(“aws访问密钥id”),
“aws_secret_access_key”:getenv(“aws_secret_access_key”),
“地区名称”:getenv(“AWS地区”),
}
s3_client=boto3.Session(**boto_kwargs.client(“s3”)
s3_client.upload_fileobj(,)
请尝试搜索网络。对于子孙后代来说,官方文档遗漏了一个非常关键的点,就像文档经常做的那样。这就是本文的目的。哪一点至关重要?似乎正好提供了您要查找的内容。如果您不幸选择了一个区域(如us-east-2,其中默认值不起作用),则需要region_name='region_name')。可以在配置文件中设置region
(如快速启动中所述)而区域名称
在会话
和资源
的文档中有明确的解释。顺便说一句,您可能希望在.aws/config
中浏览配置文件,并使用会话
对象。这并没有回答“新语法是什么?”的问题。它以什么方式没有回答?如果您复制并粘贴该代码,它将非常有效。不管怎样,没关系。我只需要填充一些空间,因为我已经搜索这段代码将近4天了。文档不清楚。好的,我不打算就此争论,我将删除我的否决票。我的投票被锁定,我无法删除,因此请对您的答案进行一些编辑。正文
需要是数据(例如“这是我的数据”
)或文件类型对象,例如打开(“磁盘上文件的路径”)
。您的示例只是一个对象,其中包含字符串PATH\u TO\u FILE\u(在磁盘上)
,而不是文件内容。除非您知道隐藏的功能,否则配置文件在heroku上不起作用
s3.Object('BUCKET_NAME', 'FILENAME_ON_S3').upload_file('PATH_TO_FILE_ON_DISK')
$ 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
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>)