Bỏ qua để đến nội dung

Hàm Lambda Python

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

Trình tạo Hàm Lambda Python cung cấp khả năng thêm một hàm lambda vào một dự án python hiện có.

Trình tạo này tạo một lambda handler python mới với cấu hình cơ sở hạ tầng AWS CDK hoặc Terraform. Backend được tạo sử dụng AWS Lambda cho triển khai serverless, với tùy chọn type-safety sử dụng Parser từ AWS Lambda Powertools. Nó thiết lập AWS Lambda Powertools cho khả năng quan sát, bao gồm logging, AWS X-Ray tracing và Cloudwatch Metrics.

Bạn có thể tạo một Hàm Lambda mới theo hai cách:

Terminal window
pnpm nx g @aws/nx-plugin:py#lambda-function
Bạn cũng có thể thực hiện chạy thử để xem những tệp nào sẽ bị thay đổi
Terminal window
pnpm nx g @aws/nx-plugin:py#lambda-function --dry-run
Tham sốKiểuMặc địnhMô tả
project Bắt buộcstring-Dự án để thêm hàm lambda vào
name Bắt buộcstring-Tên của hàm cần thêm
functionPath string-Đường dẫn trong thư mục nguồn của dự án để thêm hàm vào
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 | VpcLatticeV2ModelAnyMô hình nguồn sự kiện tùy chọn để sử dụng cho hàm lambda
infra lambda | nonelambdaLoại hạ tầng để triển khai Lambda function của bạn.
iac inherit | cdk | terraforminheritNhà cung cấp IaC ưu tiên. Mặc định giá trị này được kế thừa từ lựa chọn ban đầu của bạn.
preferInstallDependencies booleantrueCó nên cài đặt các dependencies sau khi generator chạy hay không. Đặt thành false để trì hoãn việc cài đặt khi chạy nhiều generator liên tiếp (việc cài đặt vẫn sẽ chạy nếu cần thiết để các generator tiếp theo có thể tính toán Nx project graph); cài đặt một lần vào cuối.

Trình tạo sẽ thêm các tệp sau vào dự án của bạn:

  • Thư mục<module-name>
    • <lambda-function>.py Function implementation

Nếu tùy chọn functionPath được cung cấp, trình tạo sẽ thêm các tệp cần thiết vào đường dẫn được chỉ định:

  • Thư mục<module-name>
    • Thư mục<custom-path>
      • <function-name>.py Function implementation

Vì generator này cung cấp infrastructure as code dựa trên iac bạn đã chọn, nó sẽ tạo một dự án trong packages/common bao gồm các CDK constructs hoặc Terraform modules liên quan.

Dự án infrastructure as code chung được cấu trúc như sau:

  • Thư mụcpackages/common/constructs
    • Thư mụcsrc
      • Thư mụcapp/ Constructs for infrastructure specific to a project/generator
      • Thư mụccore/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

Trình tạo tạo infrastructure as code để triển khai hàm của bạn dựa trên iac đã chọn:

Trình tạo tạo các CDK construct có thể được sử dụng để triển khai hàm của bạn, nằm trong thư mục packages/common/constructs.

Hàm được triển khai có kiến trúc như sau:

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

Generator tạo ra chính hàm đó; bạn kết nối nguồn sự kiện trong stack của mình để gọi nó (ví dụ: tích hợp API Gateway, quy tắc EventBridge, thông báo S3 hoặc ánh xạ nguồn sự kiện SQS).

Triển khai hàm chính nằm trong <function-name>.py. Đây là một ví dụ:

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

Trình tạo thiết lập một số tính năng tự động:

  1. Tích hợp AWS Lambda Powertools cho khả năng quan sát
  2. Thu thập metrics
  3. Type-safety sử dụng @event_parser

Trình tạo cấu hình structured logging sử dụng AWS Lambda Powertools.

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

Logger tự động bao gồm:

  • Các yêu cầu event
  • Thông tin Lambda context
  • Chỉ báo cold start

AWS X-Ray tracing được cấu hình tự động. Bạn có thể thêm các subsegment tùy chỉnh vào traces của mình:

def lambda_handler(event: EventBridgeModel, context: LambdaContext):
# Creates a new subsegment
with tracer.provider.in_subsegment("function-subsegment"):
# Your logic here
return ....

CloudWatch metrics được thu thập tự động cho mỗi yêu cầu. Bạn có thể thêm các metric tùy chỉnh:

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

Các metric mặc định bao gồm:

  • Số lần gọi
  • Số lần thành công/thất bại
  • Metrics cold start
event ≠ Any

Nếu bạn chọn một event khi tạo hàm lambda của mình, hàm của bạn được trang bị @event_parser từ AWS Lambda Powertools. Ví dụ:

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

Điều này cho phép bạn định nghĩa các data model sử dụng Pydantic, theo cách tương tự như làm việc với Fast API.

event = Any

Nếu bạn chọn Any cho event của mình, decorator @event_parser không được áp dụng và handler nhận một event dict không có kiểu. Tạo lại với một event cụ thể nếu bạn muốn xác thực Pydantic và truy cập trường có kiểu.

Trình tạo tự động cấu hình đóng gói Python cho các gói triển khai Lambda sử dụng uv:

Terminal window
pnpm nx bundle <project-name>

Quá trình này sử dụng:

  1. uv export để xuất các phụ thuộc Python của bạn sang tệp requirements.txt
  2. uv pip install để cài đặt các phụ thuộc cho nền tảng đích (x86_64-manylinux_2_28) cho triển khai Lambda

Generator này tạo ra mã cơ sở hạ tầng CDK hoặc Terraform dựa trên iac bạn đã chọn. Bạn có thể sử dụng nó để triển khai function của mình.

Generator này tạo ra một CDK construct để triển khai function của bạn trong thư mục common/constructs. Bạn có thể sử dụng nó trong một ứng dụng 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');
}
}

Điều này thiết lập:

  1. AWS Lambda function
  2. CloudWatch log group
  3. X-Ray tracing configuration
  4. CloudWatch metrics namespace

Function này sau đó có thể được sử dụng làm target cho bất kỳ lambda event source nào:

Ví dụ dưới đây minh họa mã CDK để gọi lambda function của bạn theo lịch trình sử dụng EventBridge:

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