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

Hàm Lambda TypeScript

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

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

Trình tạo này tạo một handler lambda TypeScript mới với cấu hình cơ sở hạ tầng AWS CDK hoặc Terraform. Handler được tạo sử dụng AWS Lambda Powertools for TypeScript để quan sát, bao gồm ghi log, truy vết AWS X-Ray và CloudWatch Metrics, cũng như tùy chọn type-safety cho sự kiện bằng cách sử dụng Parser from AWS Lambda Powertools

Bạn có thể tạo một hàm lambda theo hai cách:

Terminal window
pnpm nx g @aws/nx-plugin:ts#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:ts#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 function cần thêm
functionPath string-Thư mục con tùy chọn trong thư mục nguồn của dự án để thêm hàm vào
event Any | AlbSchema | APIGatewayProxyEventSchema | APIGatewayRequestAuthorizerEventSchema | APIGatewayTokenAuthorizerEventSchema | APIGatewayProxyEventV2Schema | APIGatewayProxyWebsocketEventSchema | APIGatewayRequestAuthorizerEventV2Schema | CloudFormationCustomResourceCreateSchema | CloudFormationCustomResourceUpdateSchema | CloudFormationCustomResourceDeleteSchema | CloudWatchLogsSchema | PreSignupTriggerSchema | PostConfirmationTriggerSchema | CustomMessageTriggerSchema | MigrateUserTriggerSchema | CustomSMSSenderTriggerSchema | CustomEmailSenderTriggerSchema | DefineAuthChallengeTriggerSchema | CreateAuthChallengeTriggerSchema | VerifyAuthChallengeTriggerSchema | PreTokenGenerationTriggerSchemaV1 | PreTokenGenerationTriggerSchemaV2AndV3 | DynamoDBStreamSchema | EventBridgeSchema | KafkaMskEventSchema | KafkaSelfManagedEventSchema | KinesisDataStreamSchema | KinesisFirehoseSchema | KinesisDynamoDBStreamSchema | KinesisFirehoseSqsSchema | LambdaFunctionUrlSchema | S3EventNotificationEventBridgeSchema | S3Schema | S3ObjectLambdaEventSchema | S3SqsEventNotificationSchema | SesSchema | SnsSchema | SqsSchema | TransferFamilySchema | VpcLatticeSchema | VpcLatticeV2SchemaAnySchema nguồn sự kiện tùy chọn để sử dụng cho lambda function
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 đượ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 để 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<project-name>
    • Thư mụcsrc/
      • <lambda-function>.ts Function implementation

Nếu tùy chọn functionPath được cung cấp, trình tạo 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 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 mã cơ sở hạ tầng để triển khai hàm của bạn dựa trên iac đã chọn:

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

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>.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);

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

  1. Middy middleware stack để tăng cường chức năng Lambda
  2. Tích hợp AWS Lambda Powertools để quan sát
  3. Thu thập số liệu với CloudWatch
  4. Type-safety sử dụng parser middleware
  5. Đóng gói với Rolldown để tối ưu hóa các gói triển khai

Trình tạo cấu hình ghi log có cấu trúc bằng cách sử dụng AWS Lambda Powertools với tự động chèn ngữ cảnh thông qua Middy middleware.

export const handler = middy()
.use(injectLambdaContext(logger))
.handler(myFunction);

Truy vết AWS X-Ray đượ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 các trace của mình:

const tracer = new Tracer();
export const myFunction = async (
event: z.infer<typeof EventBridgeSchema>,
): Promise<void> => {
// Creates a new subsegment
const subsegment = tracer.getSegment()?.addNewSubsegment('custom-operation');
try {
// Your logic here
} catch (error) {
subsegment?.addError(error as Error);
throw error;
} finally {
subsegment?.close();
}
};
export const handler = middy()
.use(captureLambdaHandler(tracer))
.handler(myFunction);

Số liệu CloudWatch được thu thập tự động cho mỗi yêu cầu thông qua middleware logMetrics. Bạn có thể thêm các số liệu 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);
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ị parser middleware from AWS Lambda Powertools. Ví dụ:

export const myFunction = async (
event: z.infer<typeof EventBridgeSchema>,
): Promise<void> => {
event.detail // <- type-safe with IDE autocompletion
};
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 thời gian chạy cho các sự kiện Lambda của bạn.

event = Any

Nếu bạn đã chọn Any cho event của mình, middleware parser không được kết nối và tham số event được gõ là any. Tạo lại hàm với một event cụ thể nếu bạn muốn type safety tại thời điểm biên dịch và xác thực thời gian chạy.

Generator tự động cấu hình một target bundle sử dụng Rolldown để tạo gói triển khai:

Terminal window
pnpm nx bundle <project-name>

Cấ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.

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