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!')
    }

嗯,这里有个小细节。你注意看 eventcontext 这两个参数。我在项目中遇到过不少新手直接忽略 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,没有部署脚本。你想想看,传统方式搞这个至少得半小时吧?

注意: 开放 API 端点任何人都能访问。我曾经有个项目上线前忘了加认证,结果被爬虫刷了几万次请求,账单直接飙了。所以演示完记得删掉触发器,或者加上 API Key。

3.3 日志与监控

函数跑起来了,但你得知道它跑得怎么样。日志和监控就是你的眼睛。

每次函数执行,Lambda 会自动把日志推到 CloudWatch Logs。你可以在 Lambda 控制台的“监控”标签页里点“查看 CloudWatch 日志”。

你会看到每个执行对应一个日志流。点进去,就能看到咱们代码里打印的 Received eventRemaining 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 接口就上线了。这就是无服务器的魅力——你只管写代码,基础设施的事交给云。

下一章咱们会深入函数的配置,比如内存、超时、环境变量这些。这些东西看着简单,但配错了要么多花钱,要么函数跑不起来。到时候我跟你分享几个真实案例。