如何用Python编写跨AWS/Azure/GCP的单代码库Serverless程序
跨AWS/Azure/GCP三平台Serverless函数通用适配方案
现成可用的成熟方案
不需要从零写适配逻辑,目前有两类成熟路径可以直接用:
- 基于ASGI/WSGI标准做轻量适配
用FastAPI/Flask这类符合通用Web规范的框架写核心业务,各平台只需要加几行适配代码即可,业务逻辑完全复用:- AWS侧用
mangum库,直接把ASGI应用包装成Lambda兼容的handler,自动处理API Gateway的事件格式转换 - GCP Cloud Functions原生支持Flask/ASGI应用入口,直接传入Web框架实例即可,不需要额外依赖
- Azure侧用
azure-functions-asgi库,把ASGI应用包装成Azure Functions可识别的入口函数就行
这种方案对业务代码的侵入性极低,适配层代码每个平台不超过5行。
- AWS侧用
- 工具链自动适配
用Serverless Framework这类跨云Serverless部署工具,只需要写一份统一的函数配置和业务逻辑,工具会自动处理三个平台的入口格式转换、资源创建、触发器绑定、部署全流程,不需要手动对接各平台的事件规范。
如果偏好基础设施即代码的管理方式,也可以用容器镜像作为统一交付物:把业务逻辑打包成包含HTTP服务的容器镜像,统一监听固定端口(比如8080),三个平台的Serverless服务现在都支持自定义容器运行时,会自动把触发请求转发到容器的监听端口,这种方案完全不需要做代码层面的格式适配,跨平台运行一致性最高。
手动轻量改造方法(无重依赖)
如果不想引入太多第三方库,自己写一层薄适配即可,核心思路是把云厂商的特定逻辑和业务逻辑完全解耦:
- 先把核心业务逻辑抽成和平台无关的纯函数,统一输入输出格式,比如hello world的逻辑可以写成:
def core_handler(standard_request): # standard_request是自定义的统一格式,包含method、headers、query、body等通用请求字段 return { "status_code": 200, "headers": {"Content-Type": "text/plain"}, "body": "hello world" }
- 为每个平台单独写一个10行以内的入口包装器,只做格式转换:
- AWS入口:解析API Gateway传入的event对象,提取字段拼成自定义的standard_request传入core_handler,再把返回的标准响应转换成Lambda要求的代理集成返回格式
- GCP入口:基于Flask的请求上下文提取请求字段拼成standard_request,返回值直接按Flask支持的格式返回即可
- Azure入口:解析Azure传入的HttpRequest对象拼成standard_request,再把标准响应转换成Azure要求的HttpResponse对象
- 部署时各平台指定自己对应的入口文件即可,核心业务代码不需要做任何平台相关的修改。
注意:如果后续要扩展支持更多云平台或者自定义运行环境,优先选容器镜像部署的方案,只要支持自定义容器运行时的Serverless平台都可以无修改部署,适配成本最低。
内容的提问来源于stack exchange,提问作者Santhosh Alagirisamy
相关产品推荐
相关产品推荐

