编写与测试 Lambda 代码

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

Claudio Canales

Senior DevOps Engineer

测试与日志的重要性

  • 实际事件杂乱且多样。
  • 测试可在用户之前发现错误。
  • 日志是调试的"黑盒"。

测试如同消防演练

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

一条需要记住的流程

核心流程工具包

  • 事件入 -> 处理器运行 -> 响应出。
  • 用日志和测试事件调试。

Lambda 调用流程

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

日志位置:CloudWatch Logs

  • Lambda 默认将 print() 输出和错误写到此处。
  • CloudWatch Logs 是 AWS 的日志存储服务。
  • 日志组形如 /aws/lambda/<function-name>

处理器日志到 CloudWatch Logs

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

处理器约定

  • event 是输入负载。
  • context 提供运行时元数据。
  • 返回值即函数响应。

处理器约定:event + context -> response

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

演示:event 与 context

def lambda_handler(event, context):
    request_id = context.aws_request_id
    time_left = context.get_remaining_time_in_millis()
    return {"statusCode": 200}

event 与 context 标注

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

安全解析输入

  • 可选字段优先用 event.get()
  • 及早校验必需输入。
  • 缺失字段返回清晰错误。

安全解析并尽早校验

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

演示:校验必需输入

def lambda_handler(event, context):
    if not event.get("name"):
        return {"statusCode": 400, "body": "Missing: name"}
    return {"statusCode": 200, "body": f"Hello, {event.get('name')}!"}

校验分支:400 与 200

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

需测试的边界情况

  • 缺失字段(空 JSON)。
  • 类型错误(name 为数字)。
  • 多余字段或超大负载。

边界情况负载示例

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

返回可预测的响应

  • 保持一致的响应结构。
  • statusCode 表示成功或错误。
  • 将响应 body 编码为 JSON。

响应封装:statusCode + JSON body

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

演示:返回 JSON

import json

def lambda_handler(event, context):
    body = {"message": "ok"}
    return {"statusCode": 200, "body": json.dumps(body)}

json.dumps:dict 到 JSON 文本

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

日志与追踪

  • 记录关键字段(必要时用 JSON)。
  • 包含 context.aws_request_id 以便追踪。
  • 避免记录机密或个人数据。
  • 默认写入 CloudWatch Logs。

日志最佳实践

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

演示:结构化日志

import json

def lambda_handler(event, context):
    print(json.dumps({"request_id": context.aws_request_id, "event": event}))
    return {"statusCode": 200}

结构化日志 JSON 行

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

使用控制台事件测试

  • 创建命名测试事件。
  • 测试正常路径与边界情况。
  • 每次运行后查看响应与日志。

控制台测试事件

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

简单的调试循环

  • 做一次小改动。
  • 部署后运行测试事件。
  • 查看响应与 CloudWatch Logs。

调试循环

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

Vamos praticar!

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

Preparing Video For Download...