一步一步将您的 FastAPI 应用迁移到 serverless
Source: Dev.to
请提供您希望翻译的文章正文内容,我将按照要求保留源链接、格式和代码块,仅翻译文本部分。
概览

无服务器(Serverless)很棒、很酷、很创新。但它的使用边界到底有多大?让我们一起探讨无服务器技术的各种起伏。
当有人第一次听到并“理解”无服务器概念时,脑中常常浮现的是:
- 我可以把所有应用都迁移到无服务器,从而节省成本吗?
- 我可以使用仍然非常便宜的托管服务吗?
- 这意味着再也不需要为闲置的服务器付费了吗?
- 这可以省去 DevOps 的需求吗?
- 我可以在没有任何复杂设置的情况下自动扩展吗?
别太高兴了 (^_‑),你在不了解真实情况的前提下就做了假设。只有当你弄清 什么、为什么、何时、如何以及谁 与无服务器相关时,正确的问题才会出现。

什么是无服务器?
执行模型
您的代码运行于:
- 按需
- 响应事件(HTTP 请求、消息、计划任务、文件上传等)
适用于短时执行(通常为几秒到几分钟)。您无需保持服务器运行;平台仅在需要时启动执行环境。
成本模型
| 您支付的项目 | 适合的场景 | 并非总是更便宜的情况 |
|---|---|---|
| 执行时间 | 流量波动大 | 持续高吞吐量工作负载 |
| 请求/事件数量 | 不频繁的工作负载 | 长时间运行的进程 |
| 消耗的资源(内存、时长) | 事件驱动系统 | 可预测、稳定的流量 |
扩展模型
| 扩展是什么 | 扩展不是 |
|---|---|
| 自动 – 平台根据需要添加容量 | 您仍需了解并发限制 |
| 水平 – 更多实例可以并行运行 | 您仍需为背压和故障进行设计 |
| 事件驱动 – 由传入事件触发 | 糟糕的架构仍可能导致昂贵的扩展问题 |
运维现实
无服务器并不消除 DevOps;它改变了 DevOps 的方式。
| 仍然需要的内容 | 差异所在 |
|---|---|
| 监控和日志记录 | 基础设施运维更少 |
| CI/CD 流水线 | 更侧重平台的流水线 |
| 安全与身份访问管理 | 需要更多可观测性 |
| 成本控制 | 更多架构工作 |
| 事件响应 | 更多兼容性研究 |
正确的问题在理解之后出现
当热情退去,真正的问题随之而来:
- 哪些工作负载适合无服务器?
- 为什么要使用它而不是容器或虚拟机?
- 何时能节省成本,何时不能?
- 如何在规模化时进行设计、测试、监控和调试?
- 谁负责可靠性、安全性和成本控制?
无服务器是强大的工具,但不是万能的解决方案。

步骤迁移
第 0 步 – 起始点(FastAPI 应用)
# app.py
from fastapi import FastAPI, status
app = FastAPI()
@app.get("/health", status_code=status.HTTP_200_OK)
def health():
return {"status": "ok"}
@app.post("/items", status_code=status.HTTP_201_CREATED)
def create_item():
return {"message": "item created"}
@app.put("/items/{item_id}", status_code=status.HTTP_200_OK)
def update_item(item_id: int):
return {"message": f"item {item_id} updated"}
本地运行:
uvicorn app:app --reload
第 1 步 – 理解无服务器映射(思维模型)

第 2 步 – 添加 Mangum(ASGI → Lambda 适配器)
安装依赖:
pip install fastapi mangum
更新 app.py:
from fastapi import FastAPI, status
from mangum import Mangum
app = FastAPI()
@app.get("/health", status_code=status.HTTP_200_OK)
def health():
return {"status": "ok"}
@app.post("/items", status_code=status.HTTP_201_CREATED)
def create_item():
return {"message": "item created"}
@app.put("/items/{item_id}", status_code=status.HTTP_200_OK)
def update_item(item_id: int):
return {"message": f"item {item_id} updated"}
# Lambda 入口点
handler = Mangum(app)
handler 即 AWS Lambda 将调用的函数。
第 3 步 – 创建 requirements.txt
fastapi
mangum
第 4 步 – 为 Lambda 打包应用
创建构建目录并将依赖安装到该目录:
mkdir package
pip install -r requirements.txt -t package
cp app.py package/
创建 zip 压缩包:
cd package
zip -r app.zip .
现在可以将 app.zip 上传到 AWS Lambda(或使用你喜欢的 IaC 工具),并配置 API Gateway 触发器以公开 FastAPI 端点。
第 5 步 – 创建 Lambda 函数
- 前往 AWS Lambda。
- 创建函数,使用以下设置:
- 运行时: Python 3.10+
- 架构: x86_64
- 上传方式:
app.zip - 处理程序:
app.handler - 内存: 512 MB(默认值)
- 超时时间: 10–15 秒
第 6 步 – 创建 API Gateway(HTTP API)
- 前往 API Gateway → 创建 HTTP API。
- 集成
- 类型:Lambda
- 选择你的 Lambda 函数。
- 路由
ANY /{proxy+}
- 部署 API。
这条单一路由让 FastAPI 在内部自行处理所有路由。
第 7 步 – 测试你的端点
大功告成!
