我的烧瓶应用程序可在本地与AWS S3存储桶一起使用,但是当我尝试使其在Heroku中运行时,我一直收到此错误
2020-06-07T00:58:29.174989+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/botocore/signers.py", line 160, in sign
2020-06-07T00:58:29.174989+00:00 app[web.1]: auth.add_auth(request)
2020-06-07T00:58:29.174989+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/botocore/auth.py", line 357, in add_auth
2020-06-07T00:58:29.174989+00:00 app[web.1]: raise NoCredentialsError
2020-06-07T00:58:29.174994+00:00 app[web.1]: botocore.exceptions.NoCredentialsError: Unable to locate credentials
我已经讨论了这个问题一天多了。这是我的app.py文件中的代码段。
from flask import render_template, request, redirect, url_for
import boto3, os, zipfile, io
AWS_STORAGE_BUCKET_NAME ="some bucket"
AWS_ACCESS_KEY_ID="some key"
AWS_SECRET_ACCESS_KEY="some secret key"
s3 = boto3.client(
"s3",
aws_access_key_id = AWS_ACCESS_KEY_ID,
aws_secret_access_key = AWS_SECRET_ACCESS_KEY)
s3_resource = boto3.resource("s3")
my_bucket = s3_resource.Bucket(AWS_STORAGE_BUCKET_NAME)
而且,在我的存储桶中,我通过从文档中粘贴此配置来配置CORS配置。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我的requirements.txt文件
Flask==1.1.1
Flask_SQLAlchemy==2.4.1
Werkzeug==1.0.0
Flask_WTF==0.14.3
SQLAlchemy==1.3.13
arrow==0.15.6
alembic==1.4.2
boto3==1.13.16
boto==2.49.0
botocore==1.16.16
Flask_Migrate==2.5.3
Pillow==7.1.2
psycopg2==2.8.4
gunicorn==19.9.0
requests==2.22.0
certifi==2019.6.16
chardet==3.0.4
Click==7.0
distributed==2.1.0
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
pytz==2019.1
[我目前在我的简单应用程序中所做的就是从存储桶中读取文件名,并将其显示在主页上。在我的本地应用程序上工作正常,但在heroku上却无法正常工作。任何帮助将不胜感激。
我不确定向客户端方法提供身份验证参数是否会扩展到调用资源。 boto3.resource是否未在heroku上进行身份验证,但可以通过环境变量或.aws
目录在本地计算机上获得身份验证。您是否尝试过在Heroku中将机密设置为环境变量(请参阅:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html),还是使用经过身份验证的会话来创建资源:
session = boto3.Session( aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
s3 = session.resource('s3')