跳转到内容

Python Lambda 函数

Filter this guidePick generator option values to hide sections that don't apply.

Python Lambda Function 生成器提供了向现有 Python 项目添加 lambda 函数的能力。

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

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

Terminal window
pnpm nx g @aws/nx-plugin:py#lambda-function
您还可以执行试运行以查看哪些文件会被更改
Terminal window
pnpm nx g @aws/nx-plugin:py#lambda-function --dry-run
参数类型默认值描述
project 必需string-要添加 Lambda 函数的项目
name 必需string-要添加的函数名称
functionPath string-在项目源代码目录中添加函数的路径
event Any | AlbModel | APIGatewayProxyEventModel | ApiGatewayAuthorizerToken | ApiGatewayAuthorizerRequest | APIGatewayProxyEventV2Model | ApiGatewayAuthorizerRequestV2 | APIGatewayWebSocketMessageEventModel | APIGatewayWebSocketConnectEventModel | APIGatewayWebSocketDisconnectEventModel | BedrockAgentEventModel | CloudFormationCustomResourceCreateModel | CloudFormationCustomResourceUpdateModel | CloudFormationCustomResourceDeleteModel | CloudWatchLogsModel | DynamoDBStreamModel | EventBridgeModel | IoTCoreThingEvent | IoTCoreThingTypeEvent | IoTCoreThingTypeAssociationEvent | IoTCoreThingGroupEvent | IoTCoreAddOrRemoveFromThingGroupEvent | IoTCoreAddOrDeleteFromThingGroupEvent | KafkaMskEventModel | KafkaSelfManagedEventModel | KinesisDataStreamModel | KinesisFirehoseModel | KinesisFirehoseSqsModel | LambdaFunctionUrlModel | S3BatchOperationModel | S3EventNotificationEventBridgeModel | S3Model | S3ObjectLambdaEvent | S3SqsEventNotificationModel | SesModel | SnsModel | SqsModel | TransferFamilyAuthorizer | VpcLatticeModel | VpcLatticeV2ModelAny用于 lambda 函数的可选事件源模型
infra lambda | nonelambda用于部署 Lambda 函数的基础设施类型。
iac inherit | cdk | terraforminherit首选的 IaC 提供商。默认情况下,这继承自您的初始选择。
preferInstallDependencies booleantrue是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。

生成器将向您的项目添加以下文件:

  • 文件夹<module-name>
    • <lambda-function>.py Function implementation

如果提供了 functionPath 选项,生成器将在指定路径中添加必要的文件:

  • 文件夹<module-name>
    • 文件夹<custom-path>
      • <function-name>.py Function implementation

由于此生成器根据您选择的 iac 提供基础设施即代码,它将在 packages/common 中创建一个项目,其中包含相关的 CDK 构造或 Terraform 模块。

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

  • 文件夹packages/common/constructs
    • 文件夹src
      • 文件夹app/ Constructs for infrastructure specific to a project/generator
      • 文件夹core/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

生成器根据您选择的 iac 创建用于部署函数的基础设施即代码:

生成器创建可用于部署函数的 CDK 构造,这些构造位于 packages/common/constructs 目录中。

已部署的函数具有以下架构:

Event Source(SNS, SQS, ...)LambdaCloudWatch(Logs, Metrics)X-Ray(Traces)

生成器提供函数本身;您需要在堆栈中连接事件源以调用它(例如,API Gateway 集成、EventBridge 规则、S3 通知或 SQS 事件源映射)。

主要函数实现位于 <function-name>.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: Implement
metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1)
# TODO: Implement success response if required
except Exception as e:
logger.exception(e)
metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1)
# TODO: Implement error response if required

生成器会自动设置以下几个功能:

  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):
# Creates a new subsegment
with tracer.provider.in_subsegment("function-subsegment"):
# Your logic here
return ....

每个请求都会自动收集 CloudWatch 指标。您可以添加自定义指标:

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

默认指标包括:

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

如果您在生成 lambda 函数时选择了 event,您的函数将使用 @event_parser from AWS Lambda Powertools 进行检测。例如:

@event_parser(model=EventBridgeModel)
def lambda_handler(event: EventBridgeModel, context: LambdaContext):
event.detail_type # <- type-safe with IDE autocompletion

这允许您使用 Pydantic 定义数据模型,其方式类似于使用 Fast API

event = Any

如果您为 event 选择了 Any,则不会应用 @event_parser 装饰器,处理程序将接收未类型化的事件字典。如果您想要 Pydantic 验证和类型化字段访问,请使用特定的 event 重新生成。

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

Terminal window
pnpm nx bundle <project-name>

此过程使用:

  1. uv export 将您的 Python 依赖项导出到 requirements.txt 文件
  2. uv pip install 为目标平台(x86_64-manylinux_2_28)安装依赖项以进行 Lambda 部署

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

此生成器会在 common/constructs 文件夹中创建一个用于部署函数的 CDK 构造。您可以在 CDK 应用程序中使用它:

import { MyProjectMyFunction } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
// Add the function to your stack
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) {
// Add the function to your stack
const fn = new MyProjectMyFunction(this, 'MyFunction');
// Add the function to an EventBridge scheduled rule
const eventRule = new Rule(this, 'MyFunctionScheduleRule', {
schedule: Schedule.cron({ minute: '15' }),
targets: [new LambdaFunction(fn)],
});
}
}