Heroku配置S3凭证报错:无法定位凭证问题求助
解决Heroku上无法定位S3凭证的问题
核心问题分析
- 环境变量名不匹配:你在Heroku设置的环境变量是
S3_KEY和S3_SECRET,但代码里尝试获取的是AWS_ACCESS_KEY和AWS_SECRET_ACCESS_KEY,两者名称不一致,导致代码无法读取到凭证值。 - Boto3资源初始化未传凭证:路由中初始化
s3_resource时没有显式传入凭证,而Heroku环境下Boto3无法自动识别自定义命名的环境变量,也没有默认的凭证文件可以读取。
解决方案
方案一:使用Boto3默认识别的环境变量名(推荐)
Boto3会自动读取AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY这两个标准环境变量,无需在代码中显式传入凭证:
- 更新Heroku的环境变量:
heroku config:set AWS_ACCESS_KEY_ID=(你的access key) heroku config:set AWS_SECRET_ACCESS_KEY=(你的secret access key) heroku config:set BUCKET_NAME=(你的bucket名)
- 简化代码:
import boto3 import os S3_BUCKET = os.environ.get('BUCKET_NAME') # 初始化client和resource时无需传入凭证,Boto3会自动读取标准环境变量 client_s3 = boto3.client('s3') @app.route('/pasta-instrumento-usuario', methods=['GET', 'POST']) def pasta_instrumento_usuario(): s3_resource = boto3.resource('s3') my_bucket = s3_resource.Bucket(S3_BUCKET) return render_template('pasta-instrumento-usuario.html', my_bucket=my_bucket)
方案二:保持现有环境变量名,修正代码匹配
如果不想修改Heroku的环境变量名,调整代码中读取环境变量的名称,并显式传入凭证:
- 修正代码中的变量获取:
import boto3 import os # 改为和Heroku设置的环境变量名一致 S3_BUCKET = os.environ.get('BUCKET_NAME') S3_KEY = os.environ.get('S3_KEY') S3_SECRET = os.environ.get('S3_SECRET')
- 初始化client和resource时显式传入凭证:
# init.py中 client_s3 = boto3.client( 's3', aws_access_key_id=S3_KEY, aws_secret_access_key=S3_SECRET, ) # 路由代码中 @app.route('/pasta-instrumento-usuario', methods=['GET', 'POST']) def pasta_instrumento_usuario(): s3_resource = boto3.resource( 's3', aws_access_key_id=S3_KEY, aws_secret_access_key=S3_SECRET ) my_bucket = s3_resource.Bucket(S3_BUCKET) return render_template('pasta-instrumento-usuario.html', my_bucket=my_bucket)
验证步骤
执行以下命令确认Heroku环境变量已正确设置:
heroku config
检查输出中是否存在对应的凭证变量,且值正确。
内容的提问来源于stack exchange,提问作者Junior Silva
相关产品推荐
相关产品推荐

