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