CDKを使ってNode.jsのlambdaを作成する方法
プロジェクト作成
TypescriptでLambda関数を作成する場合は、以下を参考にプロジェクトを作成します。
参考
tsファイルのビルド
tsファイルの場合、CDKでデプロイするときにビルドされます。 ビルドでは、esbuildがローカルにインストールされていると、esbuildでビルドします。 無い場合は、docker環境を使ってビルドしますが、esbuildより時間がかかります。
esbuildをインストールする場合は、以下を実行します。
npm i -D esbuild
基本
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のマネージメントコンソール画面で、対象を見つけやすくなります。
関数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
});