◾️ はじめに
CDKを用いてインフラ環境を構築しているのですが、従来はtscでコンパイルしてdistに出力したJSを lambda.Functionでデプロイしていました。
しかし、CDKのNodejsFunctionを使用すれば、tsc不要でTypeScriptをそのままデプロイできることを知ったので、仕組みと実装方法を備忘録としてまとめます。
参考にした記事:AWS CDKでTypeScriptで記述したLambdaをデプロイする方法 - Zenn
◾️ なぜTypeScript(.ts)でLambda関数を作成するのか
結論から言うと、型安全性とバグの早期発見が可能になるからです!
TypeScriptでは、実行前に型の不一致や未定義プロパティへのアクセスといったエラーを検出できます。
そのため、ランタイムエラーを減らし、開発段階で問題を修正しやすくなります。
例)
// JavaScriptの場合:型チェックが行われない
function add(a, b) {
return a + b;
}
// 実行はできるが "12" になってしまう
add('1', 2);
// TypeScriptの場合:コンパイル時に型エラーを検出
function add(a: number, b: number): number {
return a + b;
}
// ❌ コンパイルエラーで止まる
add('1', 2);
jsファイルでLambda関数を設定した場合
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
const myLambda = new lambda.Function(this, 'MyLambda', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler', // ファイル名.関数名
code: lambda.Code.fromAsset(path.join(__dirname, '../dist')), // 事前にJS化されたコード
});
lambda.Functionとは、
AWS CDKの基本のLambdaリソース定義クラスで、「すでにビルド済みのコード(zip,distフォルダ)をデプロイしたい」時に使用します。
ポイント
• code に「すでに JS にコンパイルされた」コードを渡す
• CDKはビルドを実行しない(手動でtscなどを行う)
• Node.js 以外(Python, Go, Java)でも使用可能
この方法では、CDKはビルドを担当しないため、事前にTypeScriptをJavaScriptへ変換しておく必要があります。
また、JavaScriptで関数を定義すると、型の不一致や未定義プロパティなどが検知されないままデプロイされてしまう可能性があります。
◾️ tsファイルで作成し、CDKデプロイ時に自動コンパイルする
TypeScriptファイルを直接指定したい場合は、aws-lambda-nodejsライブラリのNodejsFunctionを使用します。これは、CDKがデプロイ時に自動でesbuildを実行してTypeScriptをコンパイル & バンドルしてくれる便利な機能です。
※ここでは、単純なAPI・DBアクセスなどネイティブ依存がないLambdaを想定しています。
NodejsFunctionとは、
aws-lambda-nodejsというCDKの拡張ライブラリに含まれるクラスで、Node.js + TypeScriptのLambda関数を簡単にデプロイするためのラッパーです。
ポイント
• entry に TypeScriptのファイルを直接指定できる。
• CDKがデプロイ時に esbuild で自動コンパイル & バンドルしてくれる。
• 依存関係の解決、minify、source mapまで自動でやってくれる。
• Docker環境でも自動的に同じLambda環境でビルド可能。
実装例
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
const myLambda = new NodejsFunction(this, 'MyLambda', {
// TypeScriptを直接指定
entry: path.join(__dirname, '../lambda/hello.ts'),
// export const handler = ... に対応
handler: 'handler',
runtime: lambda.Runtime.NODEJS_20_X,
bundling: {
minify: true,
sourceMap: true,
target: 'node20',
// SDKは除外して軽量化も可能
externalModules: ['@aws-sdk/*'],
},
});
◾️ lambda.Function と NodejsFunction の違いまとめ
| 項目 | lambda.Function | NodejsFunction |
|---|---|---|
| 主な用途 | 既にデプロイ済みのJSをデプロイ | TypeScriptをそのままデプロイ |
| 自動ビルド | なし(手動でtscなどを行う) | あり(esbuildで自動) |
| 対応言語 | Node.js 以外(Python, Go, Java)でも使用可能 | Node.js専用 |
| 開発体験 | 型チェックなし | 型安全・自動ビルドで快適 |
◾️ まとめ
・TypeScriptを使うことで型安全性と開発効率を両立できる
・従来のlambda.Functionはビルド済みコード前提で少し手間がかかる
・NodejsFunctionを使えばCDKが自動でTypeScriptをビルドしてくれる
・単純なAPIやDB処理のLambdaなら、NodejsFunction一択でOK!