跳转到内容

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 - The project to add the lambda function to
    functionName 必需 string - The name of the function to add
    functionPath string - The path within the project source directory to add the function to
    eventSource string Any Optional event source model to use for the lambda function
    iacProvider string Inherit The preferred IaC provider. By default this is inherited from your initial selection.

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

    • 文件夹<模块名称>
      • <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 run <project-name>:bundle

    打包流程包含:

    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)],
    });
    }
    }