Hàm Lambda Python
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.
Cách sử dụng
Phần tiêu đề “Cách sử dụng”Tạo một Hàm Lambda
Phần tiêu đề “Tạo một Hàm Lambda”Bạn có thể tạo một Hàm Lambda mới theo hai cách:
pnpm nx g @aws/nx-plugin:py#lambda-functionyarn nx g @aws/nx-plugin:py#lambda-functionnpx nx g @aws/nx-plugin:py#lambda-functionbunx nx g @aws/nx-plugin:py#lambda-functionBạn cũng có thể thực hiện chạy thử để xem những tệp nào sẽ bị thay đổi
pnpm nx g @aws/nx-plugin:py#lambda-function --dry-runyarn nx g @aws/nx-plugin:py#lambda-function --dry-runnpx nx g @aws/nx-plugin:py#lambda-function --dry-runbunx nx g @aws/nx-plugin:py#lambda-function --dry-run- Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
- Mở Nx Console trong VSCode
- Nhấp
Generate (UI)trong phần "Common Nx Commands" - Tìm kiếm
@aws/nx-plugin - py#lambda-function - Điền các tham số bắt buộc
- Nhấp
Generate
Tùy chọn
Phần tiêu đề “Tùy chọn”| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
| project Bắt buộc | string | - | Dự án để thêm hàm lambda vào |
| name Bắt buộc | string | - | 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 | VpcLatticeV2Model | Any | Mô hình nguồn sự kiện tùy chọn để sử dụng cho hàm lambda |
| infra | lambda | none | lambda | Loại hạ tầng để triển khai Lambda function của bạn. |
| iac | inherit | cdk | terraform | inherit | Nhà 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 | boolean | true | Có 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. |
Kết quả của Trình tạo
Phần tiêu đề “Kết quả của Trình tạo”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
Cơ sở hạ tầng
Phần tiêu đề “Cơ sở hạ tầng”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
Thư mụcpackages/common/terraform
Thư mụcsrc
Thư mụcapp/ Terraform modules for infrastructure specific to a project/generator
- …
Thư mụccore/ Generic modules which are reused by modules in
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.
Trình tạo tạo một Terraform module có thể được sử dụng để triển khai hàm của bạn, nằm trong thư mục packages/common/terraform/src/app/lambda-functions/<function-name>.
Kiến trúc
Phần tiêu đề “Kiến trúc”Hàm được triển khai có kiến trúc như sau:
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 của bạn
Phần tiêu đề “Triển khai Hàm của bạn”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, Tracerfrom aws_lambda_powertools.metrics import MetricUnitfrom aws_lambda_powertools.utilities.parser import event_parserfrom aws_lambda_powertools.utilities.parser.models import EventBridgeModelfrom 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 requiredTrình tạo thiết lập một số tính năng tự động:
- Tích hợp AWS Lambda Powertools cho khả năng quan sát
- Thu thập metrics
- Type-safety sử dụng
@event_parser
Khả năng quan sát với AWS Lambda Powertools
Phần tiêu đề “Khả năng quan sát với AWS Lambda Powertools”Logging
Phần tiêu đề “Logging”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
Tracing
Phần tiêu đề “Tracing”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 ....Metrics
Phần tiêu đề “Metrics”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
Type Safety
Phần tiêu đề “Type Safety”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.
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.
Đóng gói
Phần tiêu đề “Đóng gói”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:
pnpm nx bundle <project-name>yarn nx bundle <project-name>npx nx bundle <project-name>bunx nx bundle <project-name>Quá trình này sử dụng:
uv exportđể xuất các phụ thuộc Python của bạn sang tệprequirements.txtuv 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
Triển khai Hàm của bạn
Phần tiêu đề “Triển khai Hàm của bạn”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:
- AWS Lambda function
- CloudWatch log group
- X-Ray tracing configuration
- 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)], }); }}Generator này tạo ra một Terraform module để triển khai function của bạn trong thư mục common/terraform. Khởi tạo module core/asset-bucket được chia sẻ một lần cho mỗi lần triển khai và truyền bucket_name của nó vào input asset_bucket_name:
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
module "my_project_my_function" { source = "../../common/terraform/src/app/lambda-functions/my-project-my-function"
asset_bucket_name = module.asset_bucket.bucket_name
env = { SOME_VARIABLE = "some value" }
additional_iam_policy_statements = [ # Add any additional permissions your function needs ]}Điều này thiết lập:
- AWS Lambda function
- CloudWatch log group
- X-Ray tracing configuration
- 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ã Terraform để gọi lambda function của bạn theo lịch trình sử dụng EventBridge:
# EventBridge rule for scheduled executionresource "aws_cloudwatch_event_rule" "my_function_schedule" { name = "my-function-schedule" description = "Trigger my function every 15 minutes" schedule_expression = "cron(15 * * * ? *)"}
# EventBridge targetresource "aws_cloudwatch_event_target" "lambda_target" { rule = aws_cloudwatch_event_rule.my_function_schedule.name target_id = "MyFunctionTarget" arn = module.my_project_my_function.function_arn}
# Permission for EventBridge to invoke the Lambda functionresource "aws_lambda_permission" "allow_eventbridge" { statement_id = "AllowExecutionFromEventBridge" action = "lambda:InvokeFunction" function_name = module.my_project_my_function.function_name principal = "events.amazonaws.com" source_arn = aws_cloudwatch_event_rule.my_function_schedule.arn}