跳转到内容

Python Lambda 函数

Python Lambda 函数生成器能够为现有 Python 项目添加 Lambda 函数。

该生成器会创建一个新的 Python Lambda 处理程序,并配置 AWS CDK 或 Terraform 基础设施。生成的后端使用 AWS Lambda 进行无服务器部署,并可选使用 AWS Lambda Powertools 的 Parser 实现类型安全。它集成了 AWS Lambda Powertools 用于可观测性功能,包括日志记录、AWS X-Ray 追踪和 Cloudwatch 指标。

您可以通过两种方式生成新的 Lambda 函数:

  1. 安装 Nx Console VSCode Plugin 如果您尚未安装
  2. 在VSCode中打开Nx控制台
  3. 点击 Generate (UI) 在"Common Nx Commands"部分
  4. 搜索 @aws/nx-plugin - py#lambda-function
  5. 填写必需参数
    • 点击 Generate
    参数 类型 默认值 描述
    project 必需 string - 要添加 Lambda 函数的项目
    functionName 必需 string - 要添加的函数名称
    functionPath string - 在项目源代码目录中添加函数的路径
    eventSource string Any 用于 Lambda 函数的可选事件源模型
    iacProvider string Inherit 首选的 IaC 提供商。默认情况下,这继承自您的初始选择。

    生成器将在项目中添加以下文件:

    • 文件夹<模块名称>
      • <lambda函数>.py 函数实现

    若指定了 functionPath 选项,生成器会将必要文件添加到指定路径:

    • 文件夹<模块名称>
      • 文件夹<自定义路径>
        • <函数名称>.py 函数实现

    由于该生成器会根据您选择的 iacProvider 以基础设施即代码的形式输出,它将在 packages/common 目录下创建一个包含相关 CDK 构造体或 Terraform 模块的项目。

    通用的基础设施即代码项目结构如下:

    • 文件夹packages/common/constructs
      • 文件夹src
        • 文件夹app/ 针对特定项目/生成器的基础设施构造体
        • 文件夹core/ app 目录构造体重用的通用构造体
        • index.ts 导出 app 目录构造体的入口文件
      • project.json 项目构建目标与配置

    生成器会根据所选 iacProvider 创建基础设施即代码(IaC)用于部署函数:

    生成器创建 CDK 构造体用于部署函数,位于 packages/common/constructs 目录。

    主函数实现位于 <函数名称>.py。示例如下:

    import os
    from aws_lambda_powertools import Logger, Metrics, Tracer
    from aws_lambda_powertools.metrics import MetricUnit
    from aws_lambda_powertools.utilities.parser import event_parser
    from aws_lambda_powertools.utilities.parser.models import EventBridgeModel
    from aws_lambda_powertools.utilities.typing import LambdaContext
    os.environ["POWERTOOLS_METRICS_NAMESPACE"] = "Foo"
    os.environ["POWERTOOLS_SERVICE_NAME"] = "Foo"
    logger: Logger = Logger()
    metrics: Metrics = Metrics()
    tracer: Tracer = Tracer()
    @tracer.capture_lambda_handler
    @metrics.log_metrics
    @event_parser(model=EventBridgeModel)
    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    logger.info("Received event", extra={"event": event.model_dump() })
    metrics.add_metric(name="InvocationCount", unit=MetricUnit.Count, value=1)
    try:
    # TODO: 实现业务逻辑
    metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1)
    # TODO: 按需实现成功响应
    except Exception as e:
    logger.exception(e)
    metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1)
    # TODO: 按需实现错误响应

    生成器自动配置以下功能:

    1. AWS Lambda Powertools 集成实现可观测性
    2. 指标收集
    3. 使用 @event_parser 的类型安全

    使用 AWS Lambda Powertools 实现可观测性

    Section titled “使用 AWS Lambda Powertools 实现可观测性”

    生成器通过 AWS Lambda Powertools 配置结构化日志:

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    logger.info("Received event", extra={"event": event.model_dump()})

    日志器自动包含:

    • 事件请求
    • Lambda 上下文信息
    • 冷启动标识

    自动配置 AWS X-Ray 追踪。可添加自定义子段:

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    # 创建新子段
    with tracer.provider.in_subsegment("function-subsegment"):
    # 业务逻辑
    return ....

    自动收集 CloudWatch 指标。可添加自定义指标:

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    metrics.add_metric(name="NewMetric", unit=MetricUnit.Count, value=1)
    return ...

    默认指标包括:

    • 调用次数
    • 成功/失败次数
    • 冷启动指标

    若生成 Lambda 函数时指定了 eventSource,函数将使用 AWS Lambda Powertools 的 @event_parser 进行类型校验。例如:

    @event_parser(model=EventBridgeModel)
    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    event.detail_type # <- 类型安全,支持 IDE 自动补全

    您可以使用 Pydantic 定义数据模型,方式与 Fast API 类似。

    若不需要类型校验,可将 eventSource 设为 Any

    生成器使用 uv 自动配置 Lambda 部署包的 Python 打包:

    Terminal window
    pnpm nx bundle <project-name>

    打包流程包含:

    1. 使用 uv export 导出依赖到 requirements.txt
    2. 使用 uv pip install 为 Lambda 目标平台 (x86_64-manylinux2014) 安装依赖

    该生成器会根据您选择的 iacProvider 创建 CDK 或 Terraform 基础设施即代码。您可以用它来部署函数。

    该生成器会在 common/constructs 目录下创建用于部署函数的 CDK 构造体。您可以在 CDK 应用中使用:

    import { MyProjectMyFunction } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // 将函数添加到堆栈
    const fn = new MyProjectMyFunction(this, 'MyFunction');
    }
    }

    这会配置:

    1. AWS Lambda 函数
    2. CloudWatch 日志组
    3. X-Ray 追踪配置
    4. CloudWatch 指标命名空间

    该函数可作为任何 Lambda 事件源的目标:

    以下示例演示了使用 EventBridge 定时调用 Lambda 函数的 CDK 代码:

    import { Rule, Schedule } from 'aws-cdk-lib/aws-events';
    import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets';
    import { MyProjectMyFunction } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // 将函数添加到堆栈
    const fn = new MyProjectMyFunction(this, 'MyFunction');
    // 将函数添加到 EventBridge 定时规则
    const eventRule = new Rule(this, 'MyFunctionScheduleRule', {
    schedule: Schedule.cron({ minute: '15' }),
    targets: [new LambdaFunction(fn)],
    });
    }
    }