Django REST API部署AWS EB时遭遇rds:DescribeDBEngineVersions权限错误
我来帮你一步步排查这两个棘手的问题,先从部署后遇到的认证错误说起,再解决后续的RDS权限问题:
{"detail": "Authentication credentials were not provided."} 本地运行正常但生产环境报错,大概率是DRF的认证配置、请求凭证传递或者EB的代理设置出了问题,你可以按下面的步骤排查:
检查DRF全局/视图级别的认证配置
打开你的settings.py,查看REST_FRAMEWORK里的DEFAULT_AUTHENTICATION_CLASSES和DEFAULT_PERMISSION_CLASSES。比如如果本地依赖会话认证(SessionAuthentication),但生产环境用API请求时没带Cookie或Token,就会触发这个错误。- 如果是需要开放部分匿名访问的视图,记得在对应视图里显式设置:
from rest_framework.permissions import AllowAny class YourView(APIView): permission_classes = [AllowAny] # ... 其他代码 - 如果用Token/JWT认证,要确保请求头里正确携带
Authorization: Token <your-token>或者Authorization: Bearer <your-jwt-token>。
- 如果是需要开放部分匿名访问的视图,记得在对应视图里显式设置:
确认EB环境变量配置
本地的SECRET_KEY、数据库配置、JWT密钥等环境变量,要在EB控制台的“配置 > 软件”里同步设置。如果DRF的认证依赖这些密钥(比如JWT签名验证),密钥不一致会直接导致凭证验证失败。调整EB代理与请求头设置
如果你的EB环境用了应用负载均衡(ALB),需要确保代理正确转发请求头。在settings.py里添加以下配置:USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')这能让DRF识别到真实的请求协议和主机,避免因为代理层导致的认证逻辑异常。
直接测试API端点
用curl或Postman直接请求EB的API,验证凭证是否有效:curl -H "Authorization: Token your-valid-token" https://your-eb-app-domain.com/api/your-endpoint/
这个是Elastic Beanstalk的服务角色权限不足导致的——EB在部署过程中需要调用RDS的API来检查数据库引擎版本,所以得给对应的IAM角色添加上权限:
找到EB的服务角色
登录AWS控制台,进入IAM服务,在“角色”列表里找到你的EB环境对应的服务角色(通常名字是aws-elasticbeanstalk-service-role,如果是自定义角色,你可以在EB控制台的“配置 > 权限”里查看)。创建并附加RDS权限策略
给这个角色创建一个自定义IAM策略,内容如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rds:DescribeDBEngineVersions", "Resource": "*" } ] }如果你想更安全,可以把
Resource指定为你EB环境关联的RDS实例ARN,而不是通配符*。验证角色关联并重新部署
确认EB环境确实使用了这个更新后的角色,然后重新推送代码到EB,流水线应该就能正常执行了。
另外,别忘了检查EB环境的Python版本是否设置为3.6,版本不匹配也可能引发各种隐性问题。
内容的提问来源于stack exchange,提问作者Chirag Maliwal

