14
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TypeScriptで書いたLambda関数をtscなしでCDKデプロイする備忘録

14
Last updated at Posted at 2025-10-10

◾️ はじめに

 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!

14
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?