配置 Lambda 函数

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

Claudio Canales

Senior DevOps Engineer

为何配置很重要

  • 相同代码在不同设置下行为迥异。
  • 配置影响性能、成本与安全。
  • 目标:开发与生产行为可预期。

同一代码,不同设置

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

代码 vs 配置

代码包

  • 代码包
  • 处理程序逻辑 + 依赖。
  • 变更需部署。

函数配置

  • 函数配置
  • 内存、超时、环境变量。
  • 执行角色与层。
使用 AWS Lambda 构建无服务器应用

可控的配置项

  • 运行时 + 处理程序:Lambda 运行的代码。
  • 内存 + 超时:性能、成本、安全。
  • 环境变量:无需硬编码的配置。
  • 执行角色:调用 AWS API 的权限。
  • :函数间共享依赖。

Lambda 配置可调项

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

运行时与处理程序基础

  • Runtime = 运行时环境(如 Python)。
  • Handler = Lambda 调用的入口点。
  • Handler 格式:file.function
  • 示例:lambda_function.lambda_handler

处理程序字符串拆解

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

处理程序字符串:可能出的问题

# lambda_function.py
def lambda_handler(event, context):
    return {"statusCode": 200}

先导入再调用处理程序

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

执行角色(IAM)

  • IAM = 身份与访问管理(权限)。
  • 执行角色定义函数可做的事。
  • 它控制代码可调用的 AWS API。

执行角色如门禁卡

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

什么是 Lambda 层?

  • Layer(层)是附加到函数的 ZIP。
  • 运行时层文件位于 /opt
  • 用于共享库与通用工具。
  • 层更新一次,多函数复用。

层挂载到 /opt 下

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

层在运行时的位置

  • 函数代码挂载在 /var/task
  • 附加的层挂载在 /opt
  • 另有临时目录 /tmp

运行时目录:/var/task、/opt、/tmp

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

内存也影响 CPU

  • 更大内存 -> 更多 CPU。
  • 可缩短 CPU 受限任务时长。
  • 总成本取决于时长与内存。

内存提升带来更多 CPU

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

基于测量调优内存

  • 从合理默认开始(如 256 MB)。
  • 用真实事件测试。
  • 比较不同内存下的时长与成本。

内存扫描:测量时长与成本

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

超时与安全执行

  • 超时可阻止失控执行。
  • 长耗时前先检查剩余时间。
  • 适当时快速失败并重试。

超时作为安全计时器

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

演示:检查剩余时间

def lambda_handler(event, context):
    time_left = context.get_remaining_time_in_millis()
    if time_left < 500:
        raise TimeoutError("Not enough time left")
    return {"statusCode": 200}

上下文倒计时防护

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

环境变量

  • 将配置与代码解耦。
  • 区分开发/测试/生产设置。
  • 机密值用 Secrets Manager。

环境变量配置行为

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

演示:读取环境变量

import os

STAGE = os.getenv("STAGE", "dev")
LOG_LEVEL = os.getenv(
    "LOG_LEVEL", "INFO"
)

默认值让本地测试更安全

  • 导入 os 以访问环境变量。
  • os.getenv 返回值或默认值。
使用 AWS Lambda 构建无服务器应用

常见配置陷阱

  • 在代码中硬编码环境阶段。
  • 超时过低或缺少 IAM 权限。
  • 将机密放在明文环境变量中。

常见陷阱与经验法则

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

Passons à la pratique !

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

Preparing Video For Download...