
最近折腾了 AWS Lambda,配合 Python 写无服务器应用,踩了几个坑,这篇把问题说清楚。
做后端开发久了,总觉得运维是个甩不掉的包袱——服务器要维护、弹性伸缩要配置、流量高峰还得提前扩容。2018 年接触 Lambda 之后,这事儿就简单多了。代码写完往云上一扔,有人访问才计费,没人访问就是零成本。对于个人项目或者初创产品的 MVP 阶段,这个思路很实用。
Python 又是 Lambda 上最流行的语言,轮子多、语法简洁,拿来写业务逻辑特别快。今天就把从环境搭建到部署上线的完整流程过一遍,代码都是实打实能跑的。
正式开搞之前,先把工具链配好。
pip install awsclipip install aws-sam-cli这一步是绕不开的,没有账号什么都干不了:
环境配好了,接下来实战——写一个简单的 RESTful API,实现用户的增删改查。
from flask import Flask, request, jsonify
from pytz import timezone app = Flask(__name__) # Define the API endpoints
@app.route('/users', methods=['GET', 'POST'])
def users(): if request.method == 'GET': # Return a list of all users return jsonify({'users': [{'name': 'John', 'email': 'john@example.com'}, {'name': 'Jane', 'email': 'jane@example.com'}]}) elif request.method == 'POST': # Create a new user data = request.get_json() user = {'name': data['name'], 'email': data['email']} return jsonify({'user': user}), 201 @app.route('/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def user(user_id): if request.method == 'GET': # Return the user with the specified ID return jsonify({'user': {'name': 'John', 'email': 'john@example.com'}}) elif request.method == 'PUT': # Update the user with the specified ID data = request.get_json() user = {'name': data['name'], 'email': data['email']} return jsonify({'user': user}) elif request.method == 'DELETE': # Delete the user with the specified ID return jsonify({'message': 'User deleted'})
这段代码用 Flask 框架写了两个路由:/users 处理列表查询和创建,/users/<id> 处理单个用户的读取、更新和删除。返回值是标准的 JSON,很适合前后端分离的项目。
代码写完了,接下来把它弄到云上去。步骤如下:
requirements.txt,写入 Flask 和 pytzhandler.py,把上面的代码粘进去serverless.yml,配置 SAM 模板aws sam build --target hello_world && aws sam deploySAM(Serverless Application Model)会自动处理依赖打包、权限配置、API Gateway 绑定这些琐事,你只需要关心业务代码。
部署完成之后,用 curl 测一下:
curl -X POST \ http://localhost:3000/users \ -H 'Content-Type: application/json' \ -d '{"name": "John", "email": "john@example.com"}'
返回 201 状态码和用户信息,说明跑通了。
Lambda 按执行时长计费,优化代码能直接省银子。
Lambda 本身只负责执行函数,但生产环境对外提供服务需要一个入口层。WSGI(Web Server Gateway Interface)是 Python web 应用的标准接口,Gunicorn 或者 uWSGI 都能做这事儿,配合 Lambda 的 API Gateway 使用体验更好。
高频访问的数据别每次都查库,放到 Redis 或者 Memcached 里面。Lambda 函数的冷启动本来就需要几百毫秒,缓存命中能把这个时间省掉。
流量大了单实例扛不住,ELB(Elastic Load Balancer)可以把请求打散到多个函数实例上。Lambda 本身支持并发,但配合负载均衡器做灰度发布和故障转移更稳。
Lambda + Python 这套组合,用来做 API、爬虫、定时任务都很顺手。免费额度够个人项目玩很久——每月 400,000 秒计算时间、100 万次请求,对小产品来说绰绰有余。
有疑问欢迎评论区聊。