Hàm Lambda TypeScript
Generator TypeScript Lambda Function cung cấp khả năng thêm một lambda function vào dự án TypeScript hiện có.
Generator này tạo một lambda handler TypeScript mới với cấu hình cơ sở hạ tầng AWS CDK hoặc Terraform. Handler được tạo ra sử dụng AWS Lambda Powertools for TypeScript để quan sát, bao gồm logging, AWS X-Ray tracing và CloudWatch Metrics, cũng như tùy chọn type-safety cho event bằng cách sử dụng Parser từ AWS Lambda Powertools
Cách sử dụng
Phần tiêu đề “Cách sử dụng”Tạo một TypeScript lambda function
Phần tiêu đề “Tạo một TypeScript lambda function”Bạn có thể tạo một lambda function 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 - ts#lambda-function - Fill in the required parameters
- Click
Generate
pnpm nx g @aws/nx-plugin:ts#lambda-functionyarn nx g @aws/nx-plugin:ts#lambda-functionnpx nx g @aws/nx-plugin:ts#lambda-functionbunx nx g @aws/nx-plugin:ts#lambda-functionYou can also perform a dry-run to see what files would be changed
pnpm nx g @aws/nx-plugin:ts#lambda-function --dry-runyarn nx g @aws/nx-plugin:ts#lambda-function --dry-runnpx nx g @aws/nx-plugin:ts#lambda-function --dry-runbunx nx g @aws/nx-plugin:ts#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 | - | Optional subdirectory within the project source directory to add the function to |
| eventSource | string | Any | Optional event source schema 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<project-name>
Thư mụcsrc/
- <lambda-function>.ts Triển khai Function
Nếu tùy chọn functionPath được cung cấp, generator sẽ thêm handler vào đường dẫn được chỉ định trong thư mục nguồn của dự án:
Thư mục<project-name>
Thư mụcsrc/
Thư mục<custom-path>/
- <function-name>.ts Triển khai Function
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 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 một 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/src/app/lambda-functions.
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>.ts. Đây là một ví dụ:
import { parser } from '@aws-lambda-powertools/parser/middleware';import { EventBridgeSchema } from '@aws-lambda-powertools/parser/schemas';import middy from '@middy/core';import { Tracer } from '@aws-lambda-powertools/tracer';import { captureLambdaHandler } from '@aws-lambda-powertools/tracer/middleware';import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware';import { Logger } from '@aws-lambda-powertools/logger';import { Metrics } from '@aws-lambda-powertools/metrics';import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';import { z } from 'zod';
process.env.POWERTOOLS_METRICS_NAMESPACE = 'MyFunction';process.env.POWERTOOLS_SERVICE_NAME = 'MyFunction';
const tracer = new Tracer();const logger = new Logger();const metrics = new Metrics();
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { logger.info('Received event', event);
// TODO: implement};
export const handler = middy() .use(captureLambdaHandler(tracer)) .use(injectLambdaContext(logger)) .use(logMetrics(metrics)) .use(parser({ schema: EventBridgeSchema })) .handler(myFunction);Generator tự động thiết lập một số tính năng:
- Middy middleware stack để tăng cường chức năng Lambda
- Tích hợp AWS Lambda Powertools để quan sát
- Thu thập Metrics với CloudWatch
- Type-safety sử dụng parser middleware
- Bundling với Rolldown cho các gói triển khai được tối ưu hóa
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 với tự động inject context thông qua Middy middleware.
export const handler = middy() .use(injectLambdaContext(logger)) .handler(myFunction);Tracing
Phần tiêu đề “Tracing”AWS X-Ray tracing được cấu hình tự động thông qua middleware captureLambdaHandler. Bạn có thể thêm các subsegment tùy chỉnh vào traces của mình:
const tracer = new Tracer();
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { // Tạo một subsegment mới const subsegment = tracer.getSegment()?.addNewSubsegment('custom-operation'); try { // Logic của bạn ở đây } catch (error) { subsegment?.addError(error as Error); throw error; } finally { subsegment?.close(); }};
export const handler = middy() .use(captureLambdaHandler(tracer)) .handler(myFunction);Metrics
Phần tiêu đề “Metrics”CloudWatch metrics được thu thập tự động cho mỗi request thông qua middleware logMetrics. Bạn có thể thêm các metric tùy chỉnh:
const metrics = new Metrics();
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { metrics.addMetric("CustomMetric", MetricUnit.Count, 1); metrics.addMetric("ProcessingTime", MetricUnit.Milliseconds, processingTime);};
export const handler = middy() .use(logMetrics(metrics)) .handler(myFunction);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 sẽ được trang bị parser middleware từ AWS Lambda Powertools. Ví dụ:
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { event.detail // <- type-safe với tự động hoàn thành IDE};
export const handler = middy() .use(parser({ schema: EventBridgeSchema })) .handler(myFunction);Điều này cung cấp type safety tại thời điểm biên dịch và xác thực runtime cho các Lambda events của bạn.
Nếu bạn không muốn type cho event của mình, bạn có thể chọn Any cho eventSource, điều này sẽ dẫn đến kiểu any cho tham số event.
Bundling
Phần tiêu đề “Bundling”Generator tự động cấu hình một target bundle sử dụng Rolldown để tạo gói triển khai:
pnpm nx run <project-name>:bundleyarn nx run <project-name>:bundlenpx nx run <project-name>:bundlebunx nx run <project-name>:bundleCấu hình Rolldown có thể được tìm thấy trong rolldown.config.ts, với một entry cho mỗi bundle cần tạo. Rolldown quản lý việc tạo nhiều bundle song song nếu được định nghĩa.
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}