Hàm Lambda trong Python
Generator Python Lambda Function cung cấp khả năng thêm một lambda function vào một dự án python hiện có.
Generator này tạo một python lambda handler mới với cấu hình 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 Lambda Function
Phần tiêu đề “Tạo một Lambda Function”Bạn có thể tạo một Lambda Function mới theo hai cách:
- Install the Nx Console VSCode Plugin if you haven't already
- Open the Nx Console in VSCode
- Click
Generate (UI)in the "Common Nx Commands" section - Search for
@aws/nx-plugin - py#lambda-function - Fill in the required parameters
- Click
Generate
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-functionYou can also perform a dry-run to see what files would be changed
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-runTùy chọn
Phần tiêu đề “Tùy chọn”| Parameter | Type | Default | Description |
|---|---|---|---|
| project Required | string | - | The project to add the lambda function to |
| functionName Required | 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. |
Kết quả của Generator
Phần tiêu đề “Kết quả của Generator”Generator sẽ thêm các file sau vào dự án của bạn:
Thư mục<module-name>
- <lambda-function>.py Triển khai function
Nếu tùy chọn functionPath được cung cấp, generator sẽ thêm các file 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 Triển khai function
Hạ tầng
Phần tiêu đề “Hạ tầng”Vì generator này cung cấp infrastructure as code dựa trên iacProvider 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 cho infrastructure cụ thể của một dự án/generator
- …
Thư mụccore/ Constructs chung được tái sử dụng bởi các constructs trong
app- …
- index.ts Entry point xuất các constructs từ
app
- project.json Các build targets và cấu hình của dự án
Thư mụcpackages/common/terraform
Thư mụcsrc
Thư mụcapp/ Terraform modules cho infrastructure cụ thể của một dự án/generator
- …
Thư mụccore/ Modules chung được tái sử dụng bởi các modules trong
app- …
- project.json Các build targets và cấu hình của dự án
Generator tạo infrastructure as code để triển khai function của bạn dựa trên iacProvider đã chọn:
Generator tạo các CDK construct có thể được sử dụng để triển khai function của bạn, nằm trong thư mục packages/common/constructs.
Generator tạo một Terraform module có thể được sử dụng để triển khai function của bạn, nằm trong thư mục packages/common/terraform/src/app/lambda-functions/<function-name>.
Triển khai Function của bạn
Phần tiêu đề “Triển khai Function của bạn”Triển khai function 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 requiredGenerator tự động thiết lập một số tính nă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”Generator 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 request 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): # Tạo một subsegment mới with tracer.provider.in_subsegment("function-subsegment"): # Logic của bạn ở đây return ....Metrics
Phần tiêu đề “Metrics”CloudWatch metrics được thu thập tự động cho mỗi request. 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 invocation
- Số lần thành công/thất bại
- Các metric cold start
Type Safety
Phần tiêu đề “Type Safety”Nếu bạn đã chọn một eventSource khi tạo lambda function, function 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 với 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 không muốn type cho event của mình, bạn chỉ cần chọn Any cho eventSource.
Bundling
Phần tiêu đề “Bundling”Generator tự động cấu hình Python bundling cho các deployment package Lambda sử dụng uv:
pnpm nx run <project-name>:bundleyarn nx run <project-name>:bundlenpx nx run <project-name>:bundlebunx nx run <project-name>:bundleQuá trình này sử dụng:
uv exportđể export các Python dependency của bạn vào filerequirements.txtuv pip installđể cài đặt các dependency cho nền tảng target (x86_64-manylinux2014) cho triển khai Lambda
Triển khai Function của bạn
Phần tiêu đề “Triển khai Function của bạn”Generator này tạo ra mã infrastructure as code bằng CDK hoặc Terraform dựa trên iacProvider 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
- Cấu hình X-Ray tracing
- 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. Bạn có thể sử dụng nó trong cấu hình Terraform:
module "my_project_my_function" { source = "../../common/terraform/src/app/lambda-functions/my-project-my-function"
# Environment variables for the Lambda function env = { SOME_VARIABLE = "some value" }
# Additional IAM policies if needed 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
- Cấu hình X-Ray tracing
- 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}