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

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

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

  1. Install the Nx Console VSCode Plugin if you haven't already
  2. Open the Nx Console in VSCode
  3. Click Generate (UI) in the "Common Nx Commands" section
  4. Search for @aws/nx-plugin - ts#lambda-function
  5. Fill in the required parameters
    • Click Generate
    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.

    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

    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

    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.

    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:

    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 Metrics với CloudWatch
    4. Type-safety sử dụng parser middleware
    5. Bundling với Rolldown cho các gói triển khai được tối ưu hóa

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

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

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

    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.

    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 run <project-name>:bundle

    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ã 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:

    1. AWS Lambda function
    2. CloudWatch log group
    3. Cấu hình X-Ray tracing
    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)],
    });
    }
    }