
从零开始:30分钟搭建你的第一个Python无服务器应用
很多人听到“无服务器”会觉得很高深,其实你可以把它理解成“别人帮你管服务器,你只需要写代码”。AWS Lambda就是目前最成熟的无服务器计算服务之一,支持Python、Node.js等多种语言,按调用次数和执行时间收费,非常适合轻量化应用。下面我带你一步步实现一个“天气查询API”,输入城市名就能返回实时天气,全程30分钟搞定。
准备工作:5分钟搞定AWS账号和开发环境
首先你需要一个AWS账号,直接在AWS官网{rel=”nofollow”}注册就行,新用户有12个月免费额度(包括每月100万次Lambda调用、750小时EC2使用等),足够我们折腾了。注册时注意两点:一是地区选离你近的(比如“亚太地区(东京)”或“亚太地区(新加坡)”),延迟会低一些;二是创建IAM用户时,一定要勾选“编程访问”和“AWS管理控制台访问”,我第一次注册时只勾了控制台访问,结果后面用命令行部署时一直报权限错误,折腾了半小时才发现问题。
接着是本地开发环境,你需要这几样工具:
安装SAM CLI很简单,Windows用户可以用Chocolatey:choco install aws-sam-cli
,Mac用户直接用Homebrew:brew install aws-sam-cli
,装完后在终端输入sam version
,能显示版本号就说明成功了。然后用sam init
命令初始化项目,按提示选“Python 3.9”模板,项目名随便填(比如“weather-api”),这样SAM会自动帮你生成基础目录结构,包括函数代码、配置模板和测试文件,比自己从零建文件夹省事儿多了。
核心步骤:15分钟写出你的第一个Lambda函数
现在打开项目里的app.py
,这就是我们的Python函数文件。我们要实现的功能很简单:接收用户传来的“城市”参数,调用公开的天气API(比如高德开放平台天气API{rel=”nofollow”},免费注册就能拿到key),返回格式化后的天气数据。
先看基础代码结构,Lambda函数的入口是lambda_handler
,它接收两个参数:event
(包含请求数据,比如API参数、 headers等)和context
(运行时信息,比如请求ID、超时时间)。我们的代码可以这样写:
import requests
import os
def lambda_handler(event, context):
# 获取请求参数中的城市名,默认查北京
city = event.get('queryStringParameters', {}).get('city', '北京')
# 从环境变量读取高德API key(别直接写死在代码里,不安全!)
amap_key = os.environ.get('AMAP_KEY')
# 调用高德天气API
weather_url = f"https://restapi.amap.com/v3/weather/weatherInfo?city={city}&key={amap_key}"
try:
response = requests.get(weather_url, timeout=3)
response.raise_for_status() # 检查HTTP错误状态码
data = response.json()
# 提取需要的天气信息(实时温度、天气状况、更新时间)
if data.get('status') == '1' and len(data.get('lives', [])) > 0:
live_data = data['lives'][0]
result = {
"city": live_data['city'],
"temperature": live_data['temperature'],
"weather": live_data['weather'],
"update_time": live_data['reporttime'],
"message": "success"
}
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": result
}
else:
return {
"statusCode": 400,
"headers": {"Content-Type": "application/json"},
"body": {"message": "未找到该城市天气数据"}
}
except requests.exceptions.RequestException as e:
return {
"statusCode": 500,
"headers": {"Content-Type": "application/json"},
"body": {"message": f"请求天气API失败:{str(e)}"}
}
这里有几个关键点要注意:
写完代码后,记得在项目根目录建个requirements.txt
,把依赖包写上:requests
(因为我们用了requests库发HTTP请求)。
一键上线:10分钟配置触发器和部署应用
接下来用SAM CLI打包部署,比你想象的简单。先在终端运行sam build
,SAM会自动安装依赖并打包代码。如果看到“Build Succeeded”,就可以继续部署了。运行sam deploy guided
,这是交互式部署模式,会问你几个问题:
sam deploy
就行,不用再输一遍参数) 等待3-5分钟,部署完成后,SAM会输出一个API Gateway的Invoke URL,类似https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/weather/
。现在你可以用浏览器访问这个URL,加上城市参数试试:https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/weather/?city=上海
,如果一切正常,就能看到返回的天气数据了!
对了,还需要配置环境变量:登录AWS控制台,找到Lambda服务,点进你的函数,在“配置”→“环境变量”里添加key为“AMAP_KEY”,值填你申请的高德API key,保存后再测试就不会报key错误了。我第一次部署完测试,发现返回“请求天气API失败”,查了半天才想起没配环境变量,这个坑你可别踩。
避坑指南:让你的Lambda函数跑得更稳、更省
上线只是开始,要让函数真正好用,还得解决冷启动、性能和成本问题。我之前有个项目,函数上线后前几次调用总是超时,后来优化后响应时间从2秒降到200ms,每月成本也从50块降到5块,下面这些技巧你一定要试试。
冷启动优化:别让用户等太久
冷启动是无服务器架构的“老大难”——当函数一段时间没被调用,AWS会回收资源,下次调用时需要重新初始化环境,这个过程可能要几百毫秒到几秒,对API服务来说很影响体验。我之前那个粉丝工具,早上第一次调用经常超时,后来用了这几个方法,冷启动时间从1.5秒降到了300ms:
requests
+json
,依赖包从50MB减到2MB,冷启动直接快了3倍。 内存配置:选对了性能翻倍、成本更低
很多人不知道,Lambda的内存配置直接影响CPU和网络性能——AWS文档里明确说“内存越大,分配的CPU和网络带宽越多”。我之前把内存设为128MB(最低配置),结果一个简单的JSON解析都要500ms,后来调到1024MB,执行时间降到50ms,但成本反而没涨多少,因为执行时间短了,按“GB-秒”计费的总费用可能更低。
下面是我测试的不同内存配置对比表,你可以根据自己的函数类型选择:
内存配置 | 平均执行时间(简单API) | 单次调用成本(USD) | 适合场景 |
---|---|---|---|
128MB | 300-500ms | $0.000000208 | 纯文本处理、简单计算 |
512MB | 100-200ms | $0.00000104 | 轻量API、JSON解析 |
1024MB | 50-100ms | $0.00000208 | 数据处理、第三方API调用 |
2048MB | 30-60ms | $0.00000416 | 复杂计算、机器学习推理 |
你先从512MB开始测试,然后在CloudWatch日志里看“Max Memory Used”,如果实际只用了200MB,说明可以降内存;如果执行时间太长,再逐步调高。我那个天气API,一开始用128MB执行要300ms,后来调到512MB,执行时间150ms,成本只多了0.0008美元/万次调用,很划算。
成本控制:别让“按使用付费”变成“意外付费”
无服务器架构虽然说“按使用付费”,但如果配置不当,也可能产生意外账单。我朋友曾因为没设并发限制,被人恶意刷了100万次调用,虽然免费额度cover了,但还是吓出一身汗。这几个方法能帮你把成本锁死在预算内:
别忘了清理测试环境!如果你用SAM部署了多个测试Stack,不用了一定要删除(sam delete
),不然那些IAM角色、API Gateway会一直占用资源,虽然不收费,但占着茅坑不拉屎也不好嘛。
按上面的步骤操作,你现在应该已经有了一个能跑、能省、还稳定的Python无服务器应用了。其实无服务器架构的玩法远不止API,还能做定时任务(比如每天凌晨爬数据)、文件处理(比如S3上传图片后自动压缩),甚至搭整个后端系统。你有没有试过用Lambda做其他有趣的事情?或者在部署过程中遇到了什么问题?欢迎在评论区告诉我,我们一起把无服务器玩得更溜!
你要是觉得无服务器架构能包打天下,那可就想简单了。它确实有自己的拿手好戏——比如做个API服务,像咱们前面写的天气查询接口,用户访问时才启动,不用的时候一分钱不花;或者搞个定时任务,每天凌晨3点自动爬点数据、发个报表,完全不用管服务器开没开。我之前帮一个做电商的朋友搭过商品价格监控工具,用Lambda定时调用爬虫,再把数据存到DynamoDB,每月费用就几块钱,比租个服务器划算多了。还有事件触发型的应用也特别适合,比如用户往S3上传张图片,Lambda自动给图片加水印、压缩尺寸,整个过程“润物细无声”,开发者根本不用操心后台怎么跑的。
但它也有搞不定的场景,这几点你可得记牢。长时间运行的任务肯定不行,Lambda单次执行最长就15分钟,你要是想跑个几小时的数据分析,Lambda执行到15分钟就自动断了,数据都没跑完,那不白搭?我之前就遇到过一个朋友,想用Lambda跑机器学习模型训练,结果跑了14分钟59秒,眼看快出结果了,直接被系统终止,气得他差点把键盘砸了。高并发又对延迟特别敏感的场景也得慎重,虽说可以用预置并发缓解冷启动,但像电商秒杀这种一秒钟几千上万次请求的场景,冷启动那几百毫秒可能就导致用户直接走了,这时候还是传统服务器或者容器更靠谱。还有需要复杂本地资源的应用,比如得调用GPU跑深度学习模型,或者依赖特定硬件驱动的工业控制程序,Lambda也搞不定,毕竟它本质上是个沙箱环境,没法直接访问底层硬件,这种时候老老实实用EC2或者K8s才是正解。
AWS Lambda的免费额度具体包含哪些内容?
新用户注册AWS后可享受12个月免费额度,其中与Lambda相关的包括:每月100万次函数调用(每次调用不超过400KB请求 payload)、每月400,000 GB-秒的计算时间(即函数内存配置×执行时间的总和,例如128MB内存的函数每月可运行约300小时)。 API Gateway、CloudWatch日志等配套服务也有免费额度,普通轻量化应用完全可在免费额度内运行。
Lambda目前支持哪些Python版本?
AWS Lambda当前支持的Python版本包括3.8、3.9、3.10、3.11和3.12,其中3.9版本兼容性较好,推荐作为入门选择。需注意,创建函数时需选择与本地开发环境一致的版本,避免因版本差异导致语法错误(例如Python 3.10的match-case语法在3.9及以下版本不支持)。
如何快速修改已部署的Lambda函数代码?
有两种常用方法:若使用SAM CLI部署,可直接修改本地代码后运行sam build && sam deploy
,SAM会自动打包并更新函数;若通过AWS控制台操作,可在Lambda函数页面的“代码”标签页中直接编辑代码(适合简单修改),或上传本地ZIP包替换。修改后 在“测试”标签页运行测试事件,验证功能是否正常。
无服务器架构(Serverless)适合所有应用吗?
并非所有场景都适合。无服务器架构优势在于轻量化、低维护成本,适合API服务、定时任务、事件触发型应用(如文件上传后处理);但不适合长时间运行的任务(Lambda单次执行最长15分钟)、高并发且对延迟敏感的场景(冷启动可能导致首屏延迟),或需要复杂本地资源的应用(如依赖特定硬件的计算任务)。传统服务器或容器更适合这类场景。