理解 Lambda 的执行模型

使用 AWS Lambda 构建无服务器应用

Claudio Canales

Senior DevOps Engineer

自动执行

事件驱动的 AWS

  • 发生事件时,Lambda 运行代码。
  • 示例:S3 上传 -> 调整图片大小。
  • 触发不同,模式相同。
使用 AWS Lambda 构建无服务器应用

触发前保持空闲

空闲 -> 事件 -> 运行 -> 停止

  • 空闲:无运行。
  • 事件:处理函数运行后停止。

将 Lambda 类比为感应灯

  • 像感应灯:触发前保持空闲。
  • 触发将"关"切换为"开"。
使用 AWS Lambda 构建无服务器应用

什么是 AWS Lambda?

AWS Lambda 概览

  • 事件驱动的计算服务。
  • 随需求自动扩展。
  • 仅为运行时间付费。
使用 AWS Lambda 构建无服务器应用

Lambda 如何执行代码

Lambda 执行流程

  • 事件源触发 Lambda。
  • Lambda 将事件负载传给处理函数。
  • 处理函数返回结果。
使用 AWS Lambda 构建无服务器应用

按需扩展

扩容会创建更多环境

  • 事件越多:并发调用越多。
  • Lambda 启动更多执行环境。
  • 每个新环境可能出现冷启动。
使用 AWS Lambda 构建无服务器应用

处理函数(handler)

def lambda_handler(event, context):
    # Your code here
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
  • event:输入负载(JSON)。
  • context:运行时元数据。
  • return:输出(或成功/失败)。

处理函数接收 event 和 context

使用 AWS Lambda 构建无服务器应用

event 对象

对象存储事件负载

S3 事件:bucket + object key。

# event["Records"][0]["s3"]
{
  "bucket": {"name": "my-bucket"},
  "object": {"key": "data.csv"}
}
  • 相同任务:提取所需字段。

HTTP 请求事件负载

API 事件:method、path、body。

# API request event
{
  "httpMethod": "POST",
  "path": "/users",
  "body": "{\"name\": \"John\"}"
}
  • 触发器不同,JSON 不同。
使用 AWS Lambda 构建无服务器应用

context 对象

def lambda_handler(event, context):
    time_left = (
        context.get_remaining_time_in_millis()
    )
    request_id = context.aws_request_id
  • get_remaining_time_in_millis:距超时的剩余时间。
  • aws_request_id:用于日志追踪的请求 ID。
使用 AWS Lambda 构建无服务器应用

无状态执行

热启动复用 vs 重置

  • 每次调用相互独立。
  • 可能复用,但不保证。
  • 将状态存到 Lambda 外部。
counter = 0

def lambda_handler(event, context):
    global counter
    counter += 1  # may reset
    return counter
使用 AWS Lambda 构建无服务器应用

冷启动

冷启动时间线

  • 新建执行环境。
  • 加载代码和依赖。
  • 先运行初始化,再运行处理函数。
使用 AWS Lambda 构建无服务器应用

热启动

热启动时间线

  • 复用现有环境。
  • 跳过大部分初始化。
  • 处理函数更快运行。
使用 AWS Lambda 构建无服务器应用

初始化、调用、冻结

执行环境生命周期

  • 初始化每个环境只运行一次。
  • 处理函数每次调用都会运行。
  • 运行间隙,环境可能冻结。
使用 AWS Lambda 构建无服务器应用

为冷启动优化

# init (once per env)
import boto3
s3 = boto3.client('s3')
# handler (every invocation)
def lambda_handler(event, context):
    return {"statusCode": 200}

初始化一次 vs 每次调用执行处理函数

  • 将 import 和 SDK 客户端放在处理函数外。
使用 AWS Lambda 构建无服务器应用

Passons à la pratique !

使用 AWS Lambda 构建无服务器应用

Preparing Video For Download...