Vercel部署Django Rest集成AWS S3遇InvalidToken错误求助
解决Vercel部署Django时AWS S3 InvalidToken错误及集成指南
1. 排查Vercel环境变量配置
- 确认Vercel项目的环境变量与本地
.env完全一致,包括AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY,若使用临时凭证还需添加AWS_SESSION_TOKEN。注意变量值不能有多余空格、大小写必须匹配,避免复制粘贴时引入隐形字符。 - 可在Django的
settings.py中临时添加日志输出(部署后及时删除),验证环境变量是否正确加载:
查看Vercel部署日志,确认变量已正常读取。import logging logger = logging.getLogger(__name__) logger.debug(f"AWS_ACCESS_KEY_ID loaded: {os.environ.get('AWS_ACCESS_KEY_ID') is not None}")
2. 修正Django S3核心配置
确保settings.py中的S3配置符合AWS规范,尤其是签名版本和区域设置:
import os from pathlib import Path # S3存储配置 AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') AWS_STORAGE_BUCKET_NAME = "your-bucket-name" AWS_S3_REGION_NAME = "your-region" # 例如 us-east-1、eu-west-1 AWS_S3_SIGNATURE_VERSION = "s3v4" # 部分区域强制要求v4签名,否则会触发Token错误 AWS_QUERYSTRING_AUTH = False # 若无需生成带签名的文件URL,可关闭此选项 DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" # 静态文件可选配置(若使用S3托管静态文件) STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" STATIC_URL = f"https://{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com/static/"
3. 验证AWS凭证与权限
- 使用AWS CLI测试凭证有效性,在本地运行:
若能正常列出Bucket内容,说明凭证本身有效;若报错,先修复本地凭证问题再同步到Vercel。aws s3 ls s3://your-bucket-name --profile your-aws-profile - 检查IAM用户/角色的权限策略,确保包含S3操作的必要权限:
若使用IAM角色而非永久密钥,需确保角色的信任策略允许Vercel的服务主体访问。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] } ] }
4. 调整Vercel部署配置
- 确认
vercel.json的Serverless函数配置正确,适配Django的WSGI入口:{ "builds": [ { "src": "your_project_name/wsgi.py", "use": "@vercel/python", "config": { "maxLambdaSize": "15mb", "runtime": "python3.11" } } ], "routes": [ { "src": "/(.*)", "dest": "your_project_name/wsgi.py" } ] } - 确保build命令包含静态文件收集步骤(若使用S3托管静态文件),在Vercel项目的Build & Development Settings中设置Build Command为:
python manage.py collectstatic --noinput && python manage.py migrate
5. 临时凭证特殊处理
若使用AWS STS临时凭证,需注意:
AWS_SESSION_TOKEN必须同步到Vercel环境变量,且凭证未过期。- 避免本地使用永久密钥、部署使用临时密钥的不一致场景,统一凭证类型后测试。
内容的提问来源于stack exchange,提问作者Saifullakh Mamaraimov
相关产品推荐
相关产品推荐

