

# TypeScript による Lambda 関数の作成
<a name="lambda-typescript"></a>

Node.js ランタイムを使用すると、TypeScript コードを AWS Lambda で実行できます。Node.js は TypeScript コードをネイティブに実行しないため、最初に TypeScript から JavaScript へのコード変換 (トランスパイル) を行う必要があります。次に、JavaScript ファイルを使用して、この関数コードを Lambda にデプロイします。このコードは、ユーザーが管理する AWS Identity and Access Management (IAM) ロールの認証情報を使用することで、AWS SDK for JavaScript を含む環境内で実行できます。Node.js ランタイムに含まれている SDK バージョンの詳細については、「」を参照してください[ランタイムに含まれる SDK バージョン](lambda-nodejs.md#nodejs-sdk-included)。

Lambda は、以下の Node.js ランタイムをサポートしています。


| 名前 | 識別子 | オペレーティングシステム | 廃止日 | 関数の作成をブロックする | 関数の更新をブロックする | 
| --- | --- | --- | --- | --- | --- | 
| Node.js 24 | `nodejs24.x` | Amazon Linux 2023 |  2028 年 4 月 30 日  |  2028 年 6 月 1 日  |  2028 年 7 月 1 日  | 
| Node.js 22 | `nodejs22.x` | Amazon Linux 2023 |  2027 年 4 月 30 日  |  2027 年 6 月 1 日  |  2027 年 7 月 1 日  | 
| Node.js 20 | `nodejs20.x` | Amazon Linux 2023 |  2026 年 4 月 30 日  |  2026 年 8 月 31 日  |  2026 年 9 月 30 日  | 

**Topics**
+ [TypeScript 開発環境のセットアップ](#typescript-dev)
+ [Lambda のタイプ定義](#typescript-type-definitions)
+ [TypeScript の Lambda 関数ハンドラーの定義](typescript-handler.md)
+ [.zip ファイルアーカイブを使用して、トランスパイルされた TypeScript コードを Lambda にデプロイする](typescript-package.md)
+ [コンテナイメージを使用して、トランスパイルされた TypeScript コードを Lambda にデプロイする](typescript-image.md)
+ [Lambda コンテキストオブジェクトを使用して TypeScript 関数の情報を取得する](typescript-context.md)
+ [TypeScript Lambda 関数のログ記録とモニタリング](typescript-logging.md)
+ [AWS Lambda での TypeScript コードのトレース](typescript-tracing.md)

## TypeScript 開発環境のセットアップ
<a name="typescript-dev"></a>

TypeScript 関数のコードを記述するには、ローカルの統合開発環境 (IDE) またはテキストエディタを使用します。Lambda コンソールでは TypeScript コードを作成できません。

[esbuild](https://esbuild.github.io/) または Microsoft の TypeScript コンパイラ (`tsc`) を使用して、TypeScript コードを JavaScript にトランスパイルできます。[AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html) と [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) はどちらも esbuild を使用します。

esbuild を使用する際は、以下を考慮してください。
+ [TypeScript に関する注意事項](https://esbuild.github.io/content-types/#typescript-caveats)がいくつか存在します。
+ TypeScript のトランスパイルには、使用する予定の Node.js ランタイムに適合する設定を行う必要があります。詳細については、esbuild ドキュメントの「[Target](https://esbuild.github.io/api/#target)」(ターゲット) を参照してください。Lambda でサポートされている特定の Node.js バージョンをターゲットにする場合の、**tsconfig.json** ファイルの例については、[TypeScript GitHub リポジトリ](https://github.com/tsconfig/bases/blob/main/bases/node14.json)を参照してください。
+ esbuild では、型チェックは行われません。型をチェックする場合は、`tsc` コンパイラを使用します。次の例に示すように、`tsc -noEmit` を実行するか、**tsconfig.json** ファイルに `"noEmit"` パラメータを追加します。これを設定することで、`tsc` は JavaScript ファイルを出力しなくなります。型のチェックが終了したら、esbuild を使用して TypeScript ファイルを JavaScript に変換します。

**Example tsconfig.json**  

```
 {
  "compilerOptions": {
    "target": "es2020",
    "strict": true,
    "preserveConstEnums": true,
    "noEmit": true,
    "sourceMap": false,
    "module":"commonjs",
    "moduleResolution":"node",
    "esModuleInterop": true, 
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true, 
    "isolatedModules": true, 
  },
  "exclude": ["node_modules", "**/*.test.ts"]
}
```

## Lambda のタイプ定義
<a name="typescript-type-definitions"></a>

[@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) パッケージには、Lambda 関数のタイプ定義が用意されています。関数が次のいずれかを使用する場合、このパッケージをインストールします。
+ 一般的な AWS イベントソースには次のようなものがあります。
  + `APIGatewayProxyEvent`: [Amazon API Gateway での Lambda プロキシ統合](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)用 
  + `SNSEvent`: [Amazon Simple Notification Service 通知](with-sns.md)用
  + `SQSEvent`: [Amazon Simple Queue Service メッセージ](with-sqs.md)用
  + `S3Event`: [S3 トリガーイベント](with-s3.md)用
  + `DynamoDBStreamEvent`: [Amazon DynamoDB Streams](with-ddb.md) 用
+ Lambda の[コンテキスト](typescript-context.md)オブジェクト
+ [コールバック](typescript-handler.md#typescript-handler-callback)ハンドラーパターン

Lambda タイプ定義を関数に追加するには、開発の依存関係として `@types/aws-lambda` をインストールします。

```
npm install -D @types/aws-lambda
```

次に、`aws-lambda` からタイプをインポートします。

```
import { Context, S3Event, APIGatewayProxyEvent } from 'aws-lambda';

export const handler = async (event: S3Event, context: Context) => {
    // Function code
};
```

`import ... from 'aws-lambda'` ステートメントはタイプ定義をインポートします。`aws-lambda` npm パッケージはインポートされません。これは関連性のないサードパーティーのツールです。詳細については、「DefinitelyTyped GitHub リポジトリ」の「[aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda)」を参照してください。

**注記**  
独自のカスタムタイプ定義を使用する場合、[@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) は必要ありません。イベントオブジェクトの独自のタイプを定義する関数の例については、「[TypeScript Lambda 関数コードの例](typescript-handler.md#typescript-example-code)」を参照してください。