トランスパイルされた TypeScript コードを .zip ファイルアーカイブで Lambda にデプロイする - AWS Lambda

トランスパイルされた TypeScript コードを .zip ファイルアーカイブで Lambda にデプロイする

TypeScript コードを にデプロイする前にAWS Lambda、コードを にトランスパイルする必要があります JavaScript。このページでは、.zip ファイルアーカイブを使用して TypeScript コードをビルドして Lambda にデプロイする 3 つの方法について説明します。

AWS SAM と は、 TypeScript 関数の構築とデプロイAWS CDKを簡素化します。AWS SAM テンプレート仕様は、サーバーレスアプリケーションを構成する Lambda 関数、API、アクセス許可、設定、およびイベントを記述するためのシンプルで簡潔な構文を提供します。AWS CDK を使用すると、プログラミング言語の優れた表現力を活かして、信頼性が高く、スケーラブルで、コスト効率の高いアプリケーションをクラウドで構築できます。AWS CDK は、中級~上級レベルの AWS ユーザーを対象としています。AWS CDK と はどちらも esbuild AWS SAMを使用して TypeScript コードを にトランスパイルします JavaScript。

AWS SAM を使用して Lambda に TypeScript コードをデプロイする

以下の手順に従って、 を使用して Hello World サンプル TypeScript アプリケーションをダウンロード、ビルド、デプロイしますAWS SAM。このアプリケーションは、基本的な API バックエンドを実装し、Amazon API Gateway エンドポイントと Lambda 関数で構成されています。API Gateway エンドポイントに GET リクエストを送信すると、Lambda 関数が呼び出されます。関数は hello world のメッセージを返します。

注記

AWS SAM は esbuild を使用して TypeScript コードから Node.js Lambda 関数を作成します。esbuild サポートは現在パブリックプレビュー中です。パブリックプレビュー中は、esbuild のサポートは、下位互換性のない変更の対象となる場合があります。

前提条件

このセクションの手順を完了するには、以下が必要です。

AWS SAM サンプルアプリケーションをデプロイする
  1. Hello World TypeScript テンプレートを使用してアプリケーションを初期化します。

    sam init --app-template hello-world-typescript --name sam-app --package-type Zip --runtime nodejs18.x
  2. (オプション) サンプルアプリケーションには、コードの linting 用の ESLint やユニットテスト用の Jest など、一般的に使用されるツールの設定が含まれています。lint コマンドとテストコマンドを実行するには、次のコードを使用します。

    cd sam-app/hello-world npm install npm run lint npm run test
  3. アプリケーションを構築します。

    cd sam-app sam build
  4. アプリケーションをデプロイします。

    sam deploy --guided
  5. 画面に表示されるプロンプトに従ってください。インタラクティブな形式で提供されるデフォルトオプションを受け入れるには、Enter を押して応答します。

  6. REST API のエンドポイントが出力に表示されます。ブラウザでエンドポイントを開き、関数をテストします。次のレスポンスが表示されます。

    {"message":"hello world"}
  7. これは、インターネット経由でアクセス可能なパブリック API エンドポイントです。テスト後にエンドポイントを削除することを推奨します。

    sam delete

を使用して Lambda に TypeScript コードをAWS CDKデプロイする

を使用してサンプル TypeScript アプリケーションを構築およびデプロイするには、以下のステップに従いますAWS CDK。このアプリケーションは、基本的な API バックエンドを実装し、API Gateway エンドポイントと Lambda 関数で構成されています。API Gateway エンドポイントに GET リクエストを送信すると、Lambda 関数が呼び出されます。関数は hello world のメッセージを返します。

前提条件

このセクションの手順を完了するには、以下が必要です。

AWS CDK サンプルアプリケーションをデプロイする
  1. 新しいアプリケーション用のプロジェクトディレクトリを作成します。

    mkdir hello-world cd hello-world
  2. アプリケーションを初期化します。

    cdk init app --language typescript
  3. 開発環境の依存関係として @types/aws-lambda パッケージを追加します。このパッケージには Lambda の型定義が含まれています。

    npm install -D @types/aws-lambda
  4. lib ディレクトリを開きます。hello-world-stack.ts というファイルが表示されます。このディレクトリに hello-world.function.tshello-world.ts の 2 つの新しいファイルを作成します。

  5. hello-world.function.ts を開き、次のコードをファイルに追加します。これは Lambda 関数のコードです。

    注記

    import ステートメントは、@types/aws-lambda から型定義をインポートします。aws-lambda NPM パッケージはインポートされません。これは関連性のないサードパーティーのツールです。詳細については、 DefinitelyTyped GitHub リポジトリの「aws-lambda」を参照してください。

    import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
  6. hello-world.ts を開き、次のコードをファイルに追加します。これには、Lambda 関数を作成するNodejsFunction コンストラクト と、REST API を作成するLambdaRestApi コンストラクト が含まれます。

    import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; export class HelloWorld extends Construct { constructor(scope: Construct, id: string) { super(scope, id); const helloFunction = new NodejsFunction(this, 'function'); new LambdaRestApi(this, 'apigw', { handler: helloFunction, }); } }

    NodejsFunction コンストラクトでは、デフォルトで次のことを前提としています。

    • 関数ハンドラーは handler と呼ばれます。

    • 関数コードを含む .ts ファイル (hello-world.function.ts) は、コンストラクトを含む .ts ファイル (hello-world.ts) と同じディレクトリに存在します。コンストラクトは、コンストラクトの ID (「hello-world」) と Lambda ハンドラーファイルの名前 (「function」) を使用して、関数コードを検索します。例えば、関数コードが hello-world.my-function.ts という名前のファイルに含まれている場合、hello-world.ts ファイルは、関数コードを次のようにして参照する必要があります。

      const helloFunction = new NodejsFunction(this, 'my-function');

    この動作を変更したり、他の esbuild パラメータを設定したりできます。詳細については、「AWS CDK API リファレンス」の「Configuring esbuild」(esbuild の設定) を参照してください。

  7. hello-world-stack.ts を開きます。これは、AWS CDK スタックを定義するコードです。このコードを、次のコードで置き換えます。

    import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { HelloWorld } from './hello-world'; export class HelloWorldStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new HelloWorld(this, 'hello-world'); } }
  8. cdk.json ファイルが含まれる hello-world ディレクトリから、アプリケーションをデプロイします。

    cdk deploy
  9. AWS CDK は、esbuild を使用して Lambda 関数をビルドおよびパッケージ化し、その関数を Lambda ランタイムにデプロイします。REST API のエンドポイントが出力に表示されます。ブラウザでエンドポイントを開き、関数をテストします。次のレスポンスが表示されます。

    {"message":"hello world"}

    これは、インターネット経由でアクセス可能なパブリック API エンドポイントです。テスト後にエンドポイントを削除することを推奨します。

AWS CLI および esbuild を使用した Lambda への TypeScript コードのデプロイ

次の例は、esbuild と を使用して TypeScript コードをトランスパイルして Lambda にデプロイする方法を示していますAWS CLI。esbuild は、すべての依存関係を持つ 1 つの JavaScript ファイルを生成します。これは、.zip アーカイブに追加する必要がある唯一のファイルです。

前提条件

このセクションの手順を完了するには、以下が必要です。

サンプル関数をデプロイする
  1. ローカルマシンで、新しい関数のプロジェクトディレクトリを作成します。

  2. npm または任意のパッケージマネージャーを使用して、新しい Node.js プロジェクトを作成します。

    npm init
  3. @types/aws-lambda および esbuild のパッケージを開発環境の依存関係として追加します。@types/aws-lambda パッケージには Lambda の型定義が含まれています。

    npm install -D @types/aws-lambda esbuild
  4. index.ts という名前の新しいファイルを作成します。次のコードを新しいファイルに追加します。これは Lambda 関数のコードです。関数は hello world のメッセージを返します。関数は、API Gateway リソースを作成しません。

    注記

    import ステートメントは、@types/aws-lambda から型定義をインポートします。aws-lambda NPM パッケージはインポートされません。これは関連性のないサードパーティーのツールです。詳細については、 DefinitelyTyped GitHub リポジトリの「aws-lambda」を参照してください。

    import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
  5. ビルドスクリプトを package.json ファイルに追加します。これにより、esbuild が.zip デプロイパッケージを自動的に作成するように設定されます。詳細については、esbuild ドキュメントの「Build scripts」(ビルドスクリプト) を参照してください。

    Linux and MacOS
    "scripts": { "prebuild": "rm -rf dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && zip -r index.zip index.js*" },
    Windows

    この例では、"postbuild" コマンドは 7zip ユーティリティを使用して .zip ファイルを作成します。お好みの Windows zip ユーティリティを使用し、必要に応じてコマンドを変更します。

    "scripts": { "prebuild": "del /q dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && 7z a -tzip index.zip index.js*" },
  6. パッケージをビルドします。

    npm run build
  7. .zip デプロイパッケージを使用して Lambda 関数を作成します。ハイライト表示されたテキストを、実行ロールの Amazon リソースネーム (ARN) で置き換えます。

    aws lambda create-function --function-name hello-world --runtime "nodejs18.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler
  8. テストイベントを実行して、関数が次のレスポンスを返すことを確認します。API Gateway を使用してこの関数を呼び出す場合は、REST API を作成および設定してください

    { "statusCode": 200, "body": "{\"message\":\"hello world\"}" }