如何在AWS API Gateway下为FastAPI应用保留外部认证并支持SSE?
解决方案
1. 配置API Gateway适配SSE流式传输
- 启用流式响应模式
- 若使用HTTP API:在集成设置中开启流式响应,将响应的
Content-Type设置为text/event-stream,此时API Gateway不会自动添加Content-Length头部,会以分块方式转发响应 - 若使用REST API:将集成的内容处理设置为
PASSTHROUGH(不修改响应),在方法响应中指定Content-Type为text/event-stream,且不配置Content-Length头部
- 若使用HTTP API:在集成设置中开启流式响应,将响应的
- 关闭响应缓冲:在API Gateway的阶段配置中,禁用响应缓冲,确保后端生成的响应块能实时转发给客户端
2. 调整超时时间适配长时SSE响应
- API Gateway侧:将超时时间调整至最大支持值(HTTP API和REST API最大均为900秒/15分钟),在阶段设置中修改超时参数
- ALB侧:同步调整ALB的超时时间(默认60秒),避免ALB提前断开与后端服务的连接,导致API Gateway触发超时
3. 迁移认证层至ALB(绕过API Gateway的流式限制)
- 使用ALB的OIDC认证功能,对接你的身份提供商(如AWS Cognito、Auth0等),由ALB完成请求认证,无需通过API Gateway
- 配置ALB的转发规则,确保
text/event-stream类型的请求直接转发至FastAPI服务,同时确认ALB的分块传输功能处于开启状态(默认开启) - 此方式无需修改应用代码,认证逻辑在负载均衡层完成,完全支持SSE流式传输
4. 验证后端服务的流式配置正确性
- 确保FastAPI的SSE端点正确设置
media_type="text/event-stream",返回StreamingResponse对象,且未添加额外的缓冲逻辑 - 检查Gunicorn与Uvicorn配置:Uvicorn worker添加
--forwarded-allow-ips='*'参数以正确处理代理头部;Gunicorn设置--timeout为足够大的值(如300秒),避免后端提前终止连接
内容的提问来源于stack exchange,提问作者Zilberman Rafael
相关产品推荐
相关产品推荐

