如何将AWS EC2上的Django+DRF REST API与API Gateway集成?
集成AWS API Gateway到EC2上的Django/DRF API 分步指南
我之前帮朋友搞定过一模一样的配置,踩了几个坑后终于跑通了,下面给你一套能落地的步骤:
1. 前期准备(必做)
首先确保你的EC2环境满足以下条件:
- 安全组配置:开放对应端口(比如你现在用的8000)给API Gateway访问。如果嫌麻烦可以先临时开放
0.0.0.0/0测试,后续再收紧到API Gateway的官方IP段(AWS有公开的IP范围列表,你可以导入到安全组)。 - 替换生产级WSGI服务器:别再用Django自带的
runserver了!高访问量下肯定扛不住,换成Gunicorn+Nginx组合:- 安装Gunicorn:
pip install gunicorn - 启动Gunicorn:
gunicorn --bind 0.0.0.0:8000 your_project.wsgi:application - 安装Nginx,配置反向代理到8000端口,让Nginx监听80端口(这样后续API Gateway可以访问更标准的80端口)。
- 安装Gunicorn:
2. 创建API Gateway REST API
- 登录AWS控制台,进入API Gateway服务。
- 点击「创建API」,选择「REST API」→「新建API」,输入API名称(比如
MyDRFAPIGateway),端点类型选「区域」(和你的EC2同区域,延迟更低),点击「创建」。
3. 配置资源与方法映射
假设你的DRF API前缀是/myapi,我们来配置对应的资源:
- 在根路径
/下,点击「创建资源」:- 资源名称填
myapi,路径填/myapi,勾选「启用API Gateway CORS」(解决Android端跨域问题,或者你也可以在Django里用django-cors-headers配置),点击「创建资源」。
- 资源名称填
- 为了一次性映射所有
/myapi下的子路径(比如/myapi/users、/myapi/posts),我们创建代理资源:- 在
/myapi资源下,点击「创建资源」。 - 勾选「配置为代理资源」,资源名称填
proxy,路径填/{proxy+},点击「创建资源」。 - 选择集成类型为「HTTP」,集成端点填
http://你的EC2公网IP:8000/myapi/{proxy}(如果用Nginx监听80端口,就改成http://你的EC2公网IP/myapi/{proxy})。 - 选择HTTP方法为「ANY」(这样所有GET/POST/PUT/DELETE请求都会被转发),点击「保存」。
- 在
4. 调整集成请求细节
这一步是很多人踩坑的核心点:
- 进入刚才创建的
/{proxy+}资源的「集成请求」设置:- 在「HTTP头」部分,添加需要转发到DRF的请求头,比如
Authorization、Content-Type,设置值为method.request.header.xxx(比如method.request.header.Authorization)。 - 在「映射模板」部分,点击「添加映射模板」,输入
application/json,勾选「当没有模板匹配时通过」,模板内容填$input.json('$')(这样API Gateway会把原始JSON请求体完整转发给DRF)。
- 在「HTTP头」部分,添加需要转发到DRF的请求头,比如
5. 部署API并测试
- 在API Gateway控制台顶部,点击「部署API」:
- 部署阶段选「新建阶段」,阶段名称填
prod(生产环境),点击「部署」。
- 部署阶段选「新建阶段」,阶段名称填
- 你会得到一个Invoke URL,格式是
https://xxxxxx.execute-api.你的区域.amazonaws.com/prod。 - 测试一下:访问
https://xxxxxx.execute-api.你的区域.amazonaws.com/prod/myapi,应该和你直接访问EC2公网IP的结果完全一致。
6. 生产环境优化
- 缓存配置:针对GET请求启用API Gateway缓存,减少EC2的负载。在阶段设置里找到「缓存」,开启后配置缓存键(比如按查询参数、请求头)。
- 限流配置:在阶段设置的「节流」里,设置每秒请求数限制,防止恶意流量冲垮你的EC2。
- 安全组收紧:把EC2的安全组从
0.0.0.0/0改成只允许API Gateway的IP段访问,提升安全性。 - 监控:启用CloudWatch监控API Gateway的请求量、错误率,同时监控EC2的CPU、内存使用情况。
常见问题排查
- 404错误:检查API Gateway的资源路径和DRF的API路径是否匹配,比如代理资源的
{proxy}是否正确映射到DRF的子路径。 - 502错误:通常是API Gateway无法连接到EC2,检查安全组是否开放端口,EC2的服务是否正常运行。
- 请求体丢失:确保映射模板里的
application/json模板正确设置为$input.json('$')。
内容的提问来源于stack exchange,提问作者TechSavy
相关产品推荐
相关产品推荐

