3、第一个函数实战:创建Hello World函数、事件源触发、日志与监控
好,咱们直接动手。这一章我带你走一遍完整的流程——从零创建一个 Lambda 函数,配个事件源触发它,再看看日志和监控长什么样。说白了,就是让你亲手摸到“无服务器”到底是怎么跑的。
3.1 创建你的第一个 Hello World 函数
我个人习惯先在控制台里跑通,再考虑用 IaC 工具。为什么呢?因为第一次上手,你总得亲眼看到“它活了”才踏实。
打开 AWS Lambda 控制台,点“创建函数”。选“从头开始创作”,函数名就叫 hello-world-demo。运行时我选 Python 3.12,架构保持 x86_64 就行。执行角色选“创建基本 Lambda 权限”——这个角色会自动帮你配好 CloudWatch Logs 的写权限。
点完创建,几秒钟后你就看到代码编辑器了。默认的代码长这样:
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
嗯,这里有个小细节。你注意看 event 和 context 这两个参数。我在项目中遇到过不少新手直接忽略 context,结果后面想拿请求 ID 或者剩余执行时间时,又得回头改代码。所以我建议你一开始就养成习惯:至少看一眼 context 里有什么。
咱们改一下返回值,让它更友好:
import json
def lambda_handler(event, context):
print(f"Received event: {json.dumps(event)}")
print(f"Remaining time: {context.get_remaining_time_in_millis()} ms")
return {
'statusCode': 200,
'body': json.dumps({
'message': 'Hello, World!',
'request_id': context.aws_request_id
})
}
改完点“Deploy”,然后点“Test”。创建一个测试事件,随便填个 JSON 比如 {"key": "value"}。点测试——你会看到执行结果区域返回了 200,还有你打印的日志。
3.2 配置事件源触发
函数能手动调了,但这不算“无服务器”。真正的威力在于——让 AWS 服务自动触发它。
咱们用 API Gateway 来触发。说白了,就是让这个函数变成一个 HTTP 接口。
在 Lambda 控制台里,点“添加触发器”。源选“API Gateway”,创建一个新的 HTTP API。安全配置选“开放”——注意,这只是为了演示。生产环境你一定要加认证。
创建完成后,你会得到一个 API 端点,类似这样:
https://xxxxxxxxxx.execute-api.region.amazonaws.com/default/hello-world-demo
用浏览器或者 curl 访问一下:
curl https://xxxxxxxxxx.execute-api.region.amazonaws.com/default/hello-world-demo
你会看到返回的 JSON:
{"message": "Hello, World!", "request_id": "xxxx-xxxx-xxxx"}
你看,一个完整的 HTTP API 就这么出来了。没有服务器,没有 Nginx,没有部署脚本。你想想看,传统方式搞这个至少得半小时吧?
3.3 日志与监控
函数跑起来了,但你得知道它跑得怎么样。日志和监控就是你的眼睛。
每次函数执行,Lambda 会自动把日志推到 CloudWatch Logs。你可以在 Lambda 控制台的“监控”标签页里点“查看 CloudWatch 日志”。
你会看到每个执行对应一个日志流。点进去,就能看到咱们代码里打印的 Received event 和 Remaining time。嗯,这里要注意:日志是按量收费的,如果你的函数调用量很大,日志费用可能比计算费用还高。我有个客户一天调用几百万次,日志费用占了总成本的 40%。后来我们调整了日志级别,只打印错误和关键信息,才压下来。
监控方面,Lambda 默认提供了几个关键指标:
| 指标 | 说明 | 我关注的阈值 |
|---|---|---|
| Invocations | 调用次数 | 突增可能表示异常流量 |
| Duration | 执行时长(毫秒) | 超过 80% 超时时间就要优化 |
| Errors | 错误次数 | 不为 0 就要查原因 |
| Throttles | 被限流的次数 | 不为 0 说明并发不够 |
我建议你给这些指标都配上 CloudWatch 告警。比如 Duration 超过 5 秒就发邮件通知。为什么呢?因为函数执行时间越长,你付的钱越多,而且用户体验也差。我曾经接手过一个项目,有个函数平均执行 8 秒,一问才知道里面有个循环查数据库的 bug。加了告警之后,这种问题几分钟就能发现。
3.4 避坑指南
这一套流程走下来,有几个坑我帮你提前踩了:
- 日志别乱打:尤其是循环里打日志,量大了 CloudWatch 费用很可观。我建议生产环境只打
INFO级别以上的日志。 - 测试事件别用真实数据:我见过有人把生产环境的 JSON 直接贴进去测试,结果日志里泄露了敏感信息。用假数据,或者用
{"test": true}这种占位符。 - API Gateway 超时:默认是 30 秒。如果你的函数执行超过 30 秒,API 会返回 504。解决办法要么优化函数,要么在 API Gateway 里调高超时时间(最大 29 秒?不对,是 30 秒,Lambda 本身最大 15 分钟)。嗯,这里容易混淆,你记住:API Gateway 和 Lambda 的超时是两套配置。
3.5 小结
这一章咱们干了三件事:写了一个 Hello World 函数,用 API Gateway 触发它,然后看了日志和监控。你想想看,整个过程不到 10 分钟,一个可调用的 HTTP 接口就上线了。这就是无服务器的魅力——你只管写代码,基础设施的事交给云。
下一章咱们会深入函数的配置,比如内存、超时、环境变量这些。这些东西看着简单,但配错了要么多花钱,要么函数跑不起来。到时候我跟你分享几个真实案例。