zappa部署卡在“creating api gateway”是因aws新账号默认禁用api gateway v1服务,需手动启用或改用v2版本;python 3.11+需降级zappa至0.54.0;mangum报错因未打包依赖;httpapi路径参数需显式声明requestparameters;冷启动延迟主要取决于包大小、provisioned concurrency及初始化逻辑。

Zappa 部署失败时,zappa deploy 卡在 “Creating API Gateway” 怎么办
这不是网络慢,而是 Zappa 默认用 REST API(v1),而 AWS 新账号默认禁用该服务。它不会报错提示,只卡住或超时。
- 手动在 AWS 控制台打开
API Gateway v1 (REST)服务,或改用zappa deploy --api-gateway-version v2(但会丢掉很多 Zappa 特性,比如自动 CORS、异步任务) - Zappa 的
settings.json里"apigateway_version"设为"v2"后,zappa update不会生效,必须zappa undeploy && zappa deploy - 如果你用的是 Python 3.11+,Zappa 0.55.x 有兼容问题:
ImportError: cannot import name 'Mapping' from 'collections',得降级到zappa==0.54.0或切到 Mangum
Mangum + FastAPI/Starlette 在 Lambda 上启动就报 Runtime.ImportModuleError
这通常不是代码写错了,而是 Mangum 本身不打包依赖——它只负责把 ASGI 调用转成 Lambda event,Python runtime 还是靠你传上去的 zip 包里有没有 fastapi、starlette、mangum 这些包。
- 别只
pip install -r requirements.txt -t ./package,漏了mangum就会报这个错;检查 zip 包里是否有mangum/目录 - 如果用了
pydantic v2,FastAPI 0.103+ 才支持,但旧版 Mangum(BaseModel.model_dump() 不存在而崩溃,必须升级mangum>=0.17.0 -
lambda_handler = Mangum(app, lifespan="off")是常见写法,但如果你的 FastAPI 里用了@app.on_event("startup"),lifespan=off 会让这部分逻辑直接跳过——不是 bug,是设计如此
Serverless Framework 配置 httpApi 时,GET /users/{id} 路径参数收不到
Serverless 默认把 httpApi 当作无代理模式处理,路径参数不会自动注入 event["pathParameters"],除非显式声明 requestParameters。
- 在
serverless.yml的函数事件里加:httpApi: method: GET path: /users/{id} requestParameters: "method.request.path.id": true - 不加这行,Lambda 收到的
event里pathParameters是None,而不是空 dict;判空时用if event.get("pathParameters")会误判 -
httpApi不支持authorizers的细粒度配置(比如 per-route),想做 JWT 校验得统一配在httpApi.authorizers,然后每个 route 显式引用,否则部署会静默忽略
冷启动延迟超过 3s?别只盯着框架选型
Zappa、Mangum、Serverless 三者对冷启动的影响微乎其微——真正起决定作用的是 Python layer 大小、是否启用 Provisioned Concurrency、以及初始化代码里有没有阻塞操作。
立即学习“Python免费学习笔记(深入)”;
- Zappa 默认把整个 virtualenv 打包,容易超 250MB 解压限制;Mangum 只需最小依赖,但如果你
import pandas在顶层,哪怕没调用也会拖慢启动 - Serverless Framework 的
package.individually: true能减小单个函数体积,但会显著拉长部署时间;Zappa 没这选项,所有函数共享一个包 - 所有方案都绕不开 Lambda 的
/tmp复用机制:如果你在 handler 外下载模型或缓存文件,第二次调用能快 10 倍以上——但要注意并发实例间不共享/tmp
框架只是胶水,真正影响上线后表现的,是你的 requirements.txt 里有没有 torch,是不是每次请求都重连数据库,以及有没有意识到 context.function_name 其实比 os.getenv("AWS_LAMBDA_FUNCTION_NAME") 快一点。








