一步一步将您的 FastAPI 应用迁移到 serverless

发布: (2025年12月19日 GMT+8 12:58)
6 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的文章正文内容,我将按照要求保留源链接、格式和代码块,仅翻译文本部分。

概览

迁移你的 FastAPI 应用逐步到无服务器的封面图

无服务器(Serverless)很棒、很酷、很创新。但它的使用边界到底有多大?让我们一起探讨无服务器技术的各种起伏。

当有人第一次听到并“理解”无服务器概念时,脑中常常浮现的是:

  • 我可以把所有应用都迁移到无服务器,从而节省成本吗?
  • 我可以使用仍然非常便宜的托管服务吗?
  • 这意味着再也不需要为闲置的服务器付费了吗?
  • 这可以省去 DevOps 的需求吗?
  • 我可以在没有任何复杂设置的情况下自动扩展吗?

别太高兴了 (^_‑),你在不了解真实情况的前提下就做了假设。只有当你弄清 什么、为什么、何时、如何以及谁 与无服务器相关时,正确的问题才会出现。

uhmm question meme

什么是无服务器?

执行模型

您的代码运行于:

  • 按需
  • 响应事件(HTTP 请求、消息、计划任务、文件上传等)

适用于短时执行(通常为几秒到几分钟)。您无需保持服务器运行;平台仅在需要时启动执行环境。

成本模型

您支付的项目适合的场景并非总是更便宜的情况
执行时间流量波动大持续高吞吐量工作负载
请求/事件数量不频繁的工作负载长时间运行的进程
消耗的资源(内存、时长)事件驱动系统可预测、稳定的流量

扩展模型

扩展是什么扩展不是
自动 – 平台根据需要添加容量您仍需了解并发限制
水平 – 更多实例可以并行运行您仍需为背压和故障进行设计
事件驱动 – 由传入事件触发糟糕的架构仍可能导致昂贵的扩展问题

运维现实

无服务器并消除 DevOps;它改变了 DevOps 的方式。

仍然需要的内容差异所在
监控和日志记录基础设施运维更少
CI/CD 流水线更侧重平台的流水线
安全与身份访问管理需要更多可观测性
成本控制更多架构工作
事件响应更多兼容性研究

正确的问题在理解之后出现

当热情退去,真正的问题随之而来:

  • 哪些工作负载适合无服务器?
  • 为什么要使用它而不是容器或虚拟机?
  • 何时能节省成本,何时不能?
  • 如何在规模化时进行设计、测试、监控和调试?
  • 谁负责可靠性、安全性和成本控制?

无服务器是强大的工具,但不是万能的解决方案。

Coding meme

步骤迁移

第 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 步 – 理解无服务器映射(思维模型)

FastAPI 工作原理

第 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 函数

  1. 前往 AWS Lambda
  2. 创建函数,使用以下设置:
    • 运行时: Python 3.10+
    • 架构: x86_64
    • 上传方式: app.zip
    • 处理程序: app.handler
    • 内存: 512 MB(默认值)
    • 超时时间: 10–15 秒

第 6 步 – 创建 API Gateway(HTTP API)

  1. 前往 API Gateway创建 HTTP API
  2. 集成
    • 类型:Lambda
    • 选择你的 Lambda 函数。
  3. 路由
    • ANY /{proxy+}
  4. 部署 API。

这条单一路由让 FastAPI 在内部自行处理所有路由。

第 7 步 – 测试你的端点

大功告成!

结论

Back to Blog

相关文章

阅读更多 »