CDKを使ってNode.jsのlambdaを作成する方法

基本

Node.jsの場合、NodejsFunctionクラスを使用します。

import * as lambda from 'aws-cdk-lib/aws-lambda';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';

    const lambdaHello = new NodejsFunction(this, 'HelloHandler', {
      functionName: 'HelloFunction',
      runtime: lambda.Runtime.NODEJS_20_X,
      entry: 'app/lambda/hello.ts',
      handler: 'handler',
      timeout: cdk.Duration.seconds(15),
      environment: {
        ENV_NOW: new Date().toISOString(),
      },
    });

functionNameを指定しておくと、Lambdaのマネージメントコンソール画面で、対象を見つけやすくなります。

tsファイルのビルド

tsファイルの場合、CDKでデプロイするときにビルドされます。 ビルドでは、esbuildがローカルにインストールされていると、esbuildでビルドします。 無い場合は、docker環境を使ってビルドしますが、esbuildより時間がかかります。

esbuildをインストールする場合は、以下を実行します。

npm i -D esbuild

関数URL

lambdaに関数URLを設定すると、直接ブラウザなどからlambdaにアクセスすることが可能になります。

例 全てのアクセスを許可する場合

    const funcUrl = lambdaHello.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
      cors: {
        allowedMethods: [lambda.HttpMethod.ALL],
        allowedOrigins: ["*"],
      },
    });

デプロイ時にURLを表示

CDKのデプロイ時に関数URLはコンソールに出力されず不便です。 そのため、以下のようなコンソール出力を追加しておくと、デプロイ完了後にアクセスしやすくなります。

    new cdk.CfnOutput(this, 'FuntionUrl', {
      value: funcUrl.url
    });

出力は以下のようになります。

Outputs:
LambdaTestStack.FuntionUrl = https://abcdef123456xxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/

サンプル

参考

例 関数lambdaHanderのlambdaを作成

    const apiFunction = new NodejsFunction(this, 'ApiTestLambda', {
      entry: 'app/src/lambdaHandler.ts',
      depsLockFilePath: 'app/package-lock.json',
      handler: 'lambdaHandler',
      runtime: Runtime.NODEJS_18_X,
      timeout: cdk.Duration.minutes(1)
    });

VPCを使用する場合

例 プライベートのサブネットをアタッチ

    const apiFunction = new NodejsFunction(this, 'ApiTestLambda', {
      entry: 'app/src/lambdaHandler.ts',
      depsLockFilePath: 'app/package-lock.json',
      handler: 'lambdaHandler',
      runtime: Runtime.NODEJS_18_X,
      timeout: cdk.Duration.minutes(1),
      vpc,
      vpcSubnets: {
        subnets: vpc.privateSubnets,
      },
    });

関数URLを使ったサンプル

関数URLを使ったサンプルです。

    const lambdaHello = new NodejsFunction(this, 'HelloHandler', {
      functionName: 'HelloFunction',
      runtime: lambda.Runtime.NODEJS_20_X,
      entry: 'app/lambda/hello.ts',
      handler: 'handler',
      timeout: cdk.Duration.seconds(15),
      environment: {
        ENV_NOW: new Date().toISOString(),
      },
    });

    // 関数URLの設定
    const funcUrl = lambdaHello.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
      cors: {
        allowedMethods: [lambda.HttpMethod.ALL],
        allowedOrigins: ["*"],
      },
    });

    // 関数URLの出力
    new cdk.CfnOutput(this, 'FuntionUrl', {
      value: funcUrl.url
    });