将 Lambda 与 AWS 服务集成

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

Claudio Canales

Senior DevOps Engineer

集成循环

  • 事件进入。
  • 处理器逻辑。
  • SDK 调用。

事件 -> 处理器 -> SDK 循环

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

触发器 vs SDK 调用

触发器

  • 决定何时运行 Lambda。

SDK 调用(在处理器内)

  • 读写 DynamoDB、S3 等服务。

触发器 vs SDK 调用

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

一个具体示例

  • 文件上传到 S3。
  • 触发 Lambda 运行。
  • 在 DynamoDB 中存一条小记录。

S3 上传 -> Lambda -> DynamoDB

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

事件负载:定位所需信息

{
  "Records": [{
    "s3": {
      "bucket": {"name": "…"},
      "object": {"key": "…"}
    }
  }]
}

S3 事件负载标注

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

AWS SDK 的作用位置

  • 您的代码调用 SDK(boto3)。
  • SDK 调用 AWS API。
  • IAM 负责访问控制。

处理器 -> SDK -> AWS API

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

执行角色 = 凭证

  • 执行角色提供临时凭证。
  • 代码中不放访问密钥。
  • 角色无权调用时,SDK 调用会失败。

执行角色提供凭证

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

最小权限:限定操作和资源

  • 降低影响范围。
  • 仅授予所需的操作与资源。
  • 非必要避免使用通配符。

最小权限:限定操作与资源

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

DynamoDB:选择正确的操作

  • PutItem 写入。
  • GetItem 按键读取。
  • Query 查找关联项。
  • 优先用定向操作而非全表扫描。

DynamoDB 操作

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

S3:按存储桶 + 键操作

  • 对象位于存储桶 + 键。
  • GetObject 获取内容。
  • PutObject 写入派生文件。

S3 存储桶与键

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

将配置放入环境变量

  • 资源名硬编码脆弱。
  • 使用环境变量。
  • 同一代码可部署到开发和生产。

环境变量配置

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

SDK 代码:小而可测

import boto3
ddb = boto3.client("dynamodb")
def handler(event, context):
    ddb.put_item(
        TableName="files",
        Item={"pk": {"S": "1"}},
    )
  • 校验输入,调用 SDK,返回结果。
  • 对纯逻辑做单元测试。

小型处理器与 SDK 调用

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

有意识地处理 SDK 错误

  • 初期常见权限错误。
  • 调用失败时,应清晰说明原因。
  • 良好日志便于更安全地调试。

成功与失败路径

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

当 IAM 配置有误时代码看起来没问题

AccessDeniedException
required action denied
  • 先修复 IAM,再调整处理器逻辑。

访问被拒绝

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

幂等性:安全重试与去重

  • 可能会收到重复事件。
  • 幂等键可避免重复处理。
  • 条件写入确保重复安全。

幂等键模式

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

端到端整合

  • S3 事件提供存储桶和键。
  • 处理器解析二者。
  • PutItem 将元数据写入 DynamoDB。
  • 在 CloudWatch Logs 查看结果。

端到端集成总结

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

要点回顾

  • 将触发器与 SDK 调用解耦。
  • 用执行角色收紧权限。
  • 用环境变量实现可移植配置。

集成要点

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

Passons à la pratique !

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

Preparing Video For Download...