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 执行环境与配置关系 事件源 API / S3 / SQS Lambda 执行环境 Init 阶段(冷启动时执行) 下载代码 → 启动运行时 → 执行初始化代码 (加载 SDK、建立连接、读取环境变量) Invoke 阶段(每次调用执行) 执行 Handler(event, context) 返回结果或抛出异常 函数配置 内存:128 MB ~ 10240 MB(影响 CPU/网络) 超时:1 s ~ 900 s(超时强制终止) 环境变量:键值对,配置与代码分离 层(Layers):共享依赖,挂载至 /opt 版本与别名 版本 v1(不可变) 版本 v2(不可变) 别名 prod → v2 别名可配权重实现灰度 冷启动 = Init 阶段完整执行;热启动 = 复用已有执行环境,仅执行 Invoke 阶段

通过控制台创建第一个 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 创建别名。

建议在第一次实验中同时使用控制台和 CLI 各创建一次函数,对比两者的配置项和输出结果,这样能更快建立对 Lambda 资源模型的直观认识。

关键配置速查

配置项 取值范围 影响
内存 128 MB ~ 10240 MB CPU、网络带宽、费用
超时 1 s ~ 900 s 请求最长执行时间
环境变量 键值对,总大小 ≤ 4 KB 配置分离、运行时读取
层 最多 5 个 共享依赖、减小部署包
版本 不可变快照 回滚、灰度发布基础
别名 指向版本的指针 流量切换、权重灰度

掌握以上内容后,你已经具备了开发一个基础 Lambda 函数的完整知识:理解执行模型有助于性能调优,熟悉配置项有助于控制成本和稳定性,版本与别名是发布管理的基石,层则让依赖管理更加工程化。下一步就是把这些基础能力组合起来,构建真正的无服务器应用。