2. AWS Lambda函数开发基础
Lambda 是 AWS 无服务器架构的计算核心。要真正用好它,不能只停留在“上传代码就能跑”的印象上,而必须理解它的执行模型、运行时环境、函数配置以及版本管理机制。本节将围绕这些基础要素展开,并带你通过控制台和 CLI 完成第一个 Lambda 函数的创建与调用。
执行模型:调用、初始化与冷启动
Lambda 的执行模型可以概括为“事件驱动 + 按需执行”。当函数被调用时,Lambda 服务会分配一个执行环境(Execution Environment),在其中加载你的代码并运行处理程序(Handler)。执行环境并非每次调用都重新创建,而是会被复用,这就引出了三个关键阶段:
- Init 阶段:下载代码、启动运行时、执行初始化代码(如加载 SDK、建立数据库连接)。
- Invoke 阶段:执行 Handler 函数,处理具体事件。
- 冷启动:当没有可复用的执行环境时,需要完整走一遍 Init 阶段,这段时间称为冷启动。冷启动通常从几百毫秒到数秒不等,取决于运行时、代码包大小和初始化逻辑。
理解这一点非常重要:把耗时操作放在 Handler 外部(Init 阶段)可以利用执行环境复用,但也会拉长冷启动时间;放在 Handler 内部则每次调用都执行,增加延迟。合理取舍是 Lambda 性能优化的第一步。
运行时环境与函数配置
Lambda 支持多种运行时,包括 Node.js、Python、Java、Go、.NET、Ruby 以及自定义运行时。选择运行时主要考虑团队技术栈、冷启动表现和依赖生态。例如 Python 和 Node.js 冷启动较快,适合轻量 API;Java 冷启动较慢,但适合复杂业务逻辑。
函数配置中最关键的两个参数是内存和超时:
- 内存:范围 128 MB 到 10240 MB。内存不仅影响可用内存,还按比例影响 CPU 和网络带宽。内存越大,单位时间计算能力越强,但费用也越高。
- 超时:范围 1 秒到 900 秒(15 分钟)。超时后函数被强制终止,调用方会收到超时错误。设置过短会导致正常请求失败,设置过长则可能让故障请求长时间占用并发。
一个实用的经验是:先按业务预估设置一个中间值(如 256 MB、10 秒),再通过 CloudWatch 的 Duration 和 Max Memory Used 指标观察实际消耗,逐步调整到性价比最优点。
环境变量、版本与别名
环境变量用于把配置与代码分离,例如数据库地址、API 密钥、功能开关等。Lambda 环境变量以键值对形式存储,运行时可通过标准方式读取(如 Python 的 os.environ)。注意不要在其中存放敏感明文,应配合 KMS 加密或使用 Secrets Manager。
版本(Version)是函数代码与配置的不可变快照。每次发布版本会生成一个递增的版本号,适合用于灰度发布和回滚。别名(Alias)则是指向某个版本的指针,例如 prod 指向版本 3,dev 指向版本 5。别名可以配置权重,实现按比例流量切换,这是 Lambda 灰度发布的常用手段。
层(Layers)的使用
层用于把依赖库、公共代码或配置文件从函数代码包中抽离出来,多个函数可以共享同一个层。这样做的好处是:减小部署包体积、加快上传速度、统一依赖版本。一个函数最多可以挂载 5 个层,层的内容会被解压到 /opt 目录下。使用时需要注意运行时对应的目录结构,例如 Python 的依赖应放在 python/lib/python3.x/site-packages/ 下。
通过控制台创建第一个 Lambda 函数
在 AWS 控制台中,进入 Lambda 服务后点击“创建函数”,选择“从头开始创作”。填写函数名(例如 hello-lambda),运行时选择 Python 3.12,架构保持默认 x86_64。权限方面,如果只是测试,可以创建一个新角色并附加 AWSLambdaBasicExecutionRole 策略,它允许函数向 CloudWatch Logs 写入日志。
创建完成后,在代码编辑器中输入以下处理程序:
import json
def lambda_handler(event, context):
name = event.get("name", "World")
return {
"statusCode": 200,
"body": json.dumps({"message": f"Hello, {name}!"})
}
点击“Deploy”保存,然后点击“Test”创建一个测试事件,事件 JSON 填写 {"name": "Lambda"}。执行后可以看到返回结果和日志输出。如果返回 {"message": "Hello, Lambda!"},说明函数运行正常。
通过 CLI 创建与调用
使用 AWS CLI 可以更高效地完成同样的事情。首先准备代码文件 lambda_function.py,然后打包:
zip function.zip lambda_function.py
创建函数:
aws lambda create-function \
--function-name hello-lambda-cli \
--runtime python3.12 \
--role arn:aws:iam::123456789012:role/lambda-basic-role \
--handler lambda_function.lambda_handler \
--zip-file fileb://function.zip \
--memory-size 256 \
--timeout 10
调用函数并传入事件:
aws lambda invoke \
--function-name hello-lambda-cli \
--payload '{"name": "CLI"}' \
response.json
cat response.json
如果输出 {"statusCode": 200, "body": "{\"message\": \"Hello, CLI!\"}"},则说明 CLI 创建和调用链路全部打通。之后可以通过 aws lambda update-function-configuration 调整内存和超时,通过 aws lambda publish-version 发布版本,通过 aws lambda create-alias 创建别名。
关键配置速查
| 配置项 | 取值范围 | 影响 |
|---|---|---|
| 内存 | 128 MB ~ 10240 MB | CPU、网络带宽、费用 |
| 超时 | 1 s ~ 900 s | 请求最长执行时间 |
| 环境变量 | 键值对,总大小 ≤ 4 KB | 配置分离、运行时读取 |
| 层 | 最多 5 个 | 共享依赖、减小部署包 |
| 版本 | 不可变快照 | 回滚、灰度发布基础 |
| 别名 | 指向版本的指针 | 流量切换、权重灰度 |
掌握以上内容后,你已经具备了开发一个基础 Lambda 函数的完整知识:理解执行模型有助于性能调优,熟悉配置项有助于控制成本和稳定性,版本与别名是发布管理的基石,层则让依赖管理更加工程化。下一步就是把这些基础能力组合起来,构建真正的无服务器应用。