.zip ファイルアーカイブで Node.js Lambda 関数をデプロイする - AWS Lambda

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

.zip ファイルアーカイブで Node.js Lambda 関数をデプロイする

AWS Lambda 関数のコードは、関数のハンドラーコードと、そのコードが依存するその他のパッケージやモジュールを含む .jp または .mjs ファイルで構成されています。この関数コードを Lambda にデプロイするには、デプロイパッケージを使用します。このパッケージは、.zip ファイルアーカイブでもコンテナイメージでもかまいません。Node.js でコンテナイメージを使用する方法の詳細については、「コンテナイメージで Node.js Lambda 関数をデプロイする」を参照してください。

.zip ファイルのデプロイパッケージを .zip ファイルアーカイブとして作成するには、コマンドラインツール用の組み込み .zip ファイルアーカイブユーティリティ、または他の .zip ファイルユーティリティ (7zip など) を使用します。次のセクションに示す例では、Linux または macOS 環境でコマンドライン zip ツールを使用していることを前提としています。Windows で同じコマンドを使用するには、Windows Subsystem for Linux をインストールして、Windows 統合バージョンの Ubuntu と Bash を取得します

Lambda は POSIX ファイルアクセス許可を使用するため、.zip ファイルアーカイブを作成する前に、デプロイパッケージフォルダのアクセス許可を設定することが必要になる場合があります。

Node.js でのランタイム依存関係

Node.js ランタイムを使用する Lambda 関数の場合、依存関係はどの Node.js モジュールでもかまいません。Node.js ランタイムには、多くの共通ライブラリに加えて、あるバージョンの AWS SDK for JavaScript が含まれています。nodejs16.x Lambda ランタイムには、SDK バージョン 2.x が含まれています。ランタイムバージョン nodejs18.x 以降には、SDK バージョン 3 が含まれています。ランタイムバージョン nodejs18.x 以降の SDK バージョン 2 を使用するには、SDK を .zip ファイルのデプロイパッケージに追加します。選択したランタイムに、使用している SDK のバージョンが含まれている場合は、.zip ファイルに SDK ライブラリを含める必要はありません。使用しているランタイムに含まれている SDK のバージョンを確認するには、「ランタイムに含まれる SDK バージョン」を参照してください。

Lambda は Node.js ランタイムの SDK ライブラリを定期的に更新して、最新機能とセキュリティアップグレードを適用します。Lambda は、ランタイムに含まれる他のライブラリにもセキュリティパッチとアップデートを適用します。パッケージ内の依存関係を完全に制御するには、ランタイムに含まれる依存関係の任意のバージョンをデプロイパッケージに追加できます。例えば、特定のバージョンの JavaScript 用 SDK を使用する場合は、そのバージョンを依存関係として .zip ファイルに含めることができます。ランタイムに含まれる依存関係を .zip ファイルに追加する方法の詳細については、依存関係検索パスおよびランタイムを含むライブラリ を参照してください。

AWS 責任分担モデルでは、関数のデプロイパッケージに含まれる依存関係を管理する責任があります。これには、更新とセキュリティパッチの適用が含まれます。関数のデプロイパッケージ内の依存関係を更新するには、まず新しい .zip ファイルを作成し、そのファイルを Lambda にアップロードします。詳細については、「依存関係を含めて .zip デプロイパッケージを作成する」と「.zip ファイルを使用した Node.js Lambda 関数の作成と更新」を参照してください。

依存関係のない .zip デプロイパッケージを作成する

関数コードに、Lambda ランタイムに含まれるライブラリ以外の依存関係がない場合、.zip ファイルには関数のハンドラーコードを含む index.js または index.mjs ファイルのみが含まれます。任意の zip ユーティリティを使用して、index.js または index.mjs ファイルをルートに置く .zip ファイルを作成します。関数のハンドラーコードを含むファイルが .zip ファイルのルートにない場合、Lambda はコードを実行できません。

.zip ファイルをデプロイして新しい Lambda 関数を作成する方法の詳細、既存の Lambda 関数を更新する方法の詳細については、「.zip ファイルを使用した Node.js Lambda 関数の作成と更新」を参照してください。

依存関係を含めて .zip デプロイパッケージを作成する

関数コードが Lambda Node.js ランタイムに含まれていないパッケージやモジュールに依存している場合、これらの依存関係を関数コードとともに .zip ファイルに追加するか、Lambda レイヤーを使用できます。このセクションでは、依存関係を .zip デプロイパッケージに含める方法について説明します。依存関係をレイヤーに含める方法については、「依存関係の Node.js レイヤーを作成する」を参照してください。

次の CLI コマンドの例では、関数のハンドラーコードとその依存関係を含む index.js または index.mjs ファイルを格納する my_deployment_package.zip という名前の .zip ファイルを作成します。この例では、npm パッケージマネージャーを使用して依存関係をインストールします。

デプロイパッケージを作成するには
  1. index.js または index.mjs ソースコードファイルを含むプロジェクトディレクトリに移動します。この例では、ディレクトリ名は my_function です。

    cd my_function
  2. npm install コマンドを使用して、node_modules ディレクトリに関数に必要なライブラリをインストールします。この例では、AWS X-Ray SDK for Node.js をインストールします。

    npm install aws-xray-sdk

    次のようなフォルダ構造が作成されます。

    ~/my_function ├── index.mjs └── node_modules ├── async ├── async-listener ├── atomic-batcher ├── aws-sdk ├── aws-xray-sdk ├── aws-xray-sdk-core

    自分で作成したカスタムモジュールをデプロイパッケージに追加することもできます。モジュールの名前を使用して node_modules にディレクトリを作成し、そこにカスタムで作成したパッケージを保存します。

  3. プロジェクトフォルダの内容を含む .zip ファイルをルートに作成します。r (再帰的) オプションを使用して、zip がサブフォルダを確実に圧縮するようにします。

    zip -r my_deployment_package.zip .

依存関係の Node.js レイヤーを作成する

このセクションでは、依存関係をレイヤーに含める方法について説明します。依存関係をデプロイパッケージに含める方法については、「依存関係を含めて .zip デプロイパッケージを作成する」を参照してください。

関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の /opt ディレクトリに読み込みます。Lambda ランタイムごとに、PATH 変数には /opt ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。レイヤーのコンテンツが PATH 変数によって確実に取得されるようにするには、次のフォルダパスにコンテンツを含めます。

  • nodejs/node_modules

  • nodejs/node16/node_modules (NODE_PATH)

  • nodejs/node18/node_modules (NODE_PATH)

  • nodejs/node20/node_modules (NODE_PATH)

例えば、レイヤーの.zip ファイルの構造は次のようになります。

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk

さらに、Lambda は /opt/lib ディレクトリ内のライブラリ、および /opt/bin ディレクトリ内のバイナリを自動的に検出します。Lambda がレイヤーのコンテンツを正しく検出できるように、次の構造でレイヤーを作成することもできます。

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

レイヤーをパッケージ化したら、「Lambda でのレイヤーの作成と削除」および「関数へのレイヤーの追加」を参照してレイヤーの設定を完了してください。

依存関係検索パスおよびランタイムを含むライブラリ

Node.js ランタイムには、多くの共通ライブラリに加えて、あるバージョンの AWS SDK for JavaScript が含まれています。ランタイムに含まれるライブラリの別のバージョンを使用する場合は、それを関数にバンドルするか、デプロイパッケージに依存関係として追加することで対応できます。例えば、別のバージョンの SDK を .zip デプロイパッケージに追加して使用できます。関数の Lambda レイヤーに含めることもできます。

コードで import または require ステートメントを使用すると、Node.js ランタイムはモジュールが見つかるまで NODE_PATH パス内のディレクトリを検索します。デフォルトでは、ランタイムが最初に検索する場所は、.zip デプロイパッケージを解凍してマウントするディレクトリ (/var/task) です。ランタイムに含まれるライブラリのバージョンをデプロイパッケージに含める場合、そのバージョンが、ランタイムに含まれるバージョンよりも優先されます。デプロイパッケージ内の依存関係も、レイヤー内の依存関係よりも優先されます。

レイヤーに依存関係を追加すると、Lambda はこれを /opt/nodejs/nodexx/node_modules に抽出します。ここで nodexx は使用しているランタイムのバージョンを表します。検索パスでは、このディレクトリはランタイムに含まれるライブラリを含むディレクトリ (/var/lang/lib/node_modules) よりも優先されます。このため、関数レイヤー内のライブラリは、ランタイムに含まれるバージョンよりも優先されます。

次のコード行を追加すると、Lambda 関数の完全な検索パスを確認できます。

console.log(process.env.NODE_PATH)

.zip パッケージ内の個別のフォルダに依存関係を追加することもできます。例えば、カスタムモジュールを .zip パッケージ内の common というフォルダに追加できます。.zip パッケージを解凍してマウントすると、このフォルダは /var/task ディレクトリ内に配置されます。コード内の.zip デプロイパッケージにあるフォルダの依存関係を使用するには、CJS または ESM のどちらのモジュール解決を使用しているかに応じて、import { } from か const { } = require() ステートメントを使用します。例:

import { myModule } from './common'

コードを esbuildrollup または同様のものでバンドルすると、関数で使用される依存関係が 1 つ以上のファイルにバンドルされます。可能な限り、この方法を使用して依存関係を提供することをお勧めします。デプロイパッケージに依存関係を追加する場合と比較して、コードをバンドルすると I/O 操作が減るため、パフォーマンスが向上します。

.zip ファイルを使用した Node.js Lambda 関数の作成と更新

.zip デプロイパッケージを作成すると、このパッケージを使用して新しい Lambda 関数を作成するか、既存の関数を更新できます。.zip パッケージをデプロイするには、Lambda コンソール、AWS Command Line Interface、Lambda API を使用します。AWS Serverless Application Model (AWS SAM) および AWS CloudFormation を使用して、Lambda 関数を作成および更新することもできます。

Lambda の .zip デプロイパッケージの最大サイズは  250 MB (解凍) です。この制限は、Lambda レイヤーを含む、更新するすべてのファイルの合計サイズに適用されることに注意してください。

Lambda ランタイムには、デプロイパッケージ内のファイルを読み取るアクセス許可が必要です。Linux のアクセス権限の 8 進表記では、Lambda には非実行ファイル用に 644 のアクセス権限 (rw-r--r--) が必要であり、ディレクトリと実行可能ファイル用に 755 のアクセス権限 (rwxr-xr-x) が必要です。

Linux と MacOS で、デプロイパッケージ内のファイルやディレクトリのファイルアクセス権限を変更するには、chmod コマンドを使用します。例えば、実行可能ファイルに正しいアクセス許可を付与するには、次のコマンドを実行します。

chmod 755 <filepath>

Windows でファイルアクセス許可を変更するには、「Microsoft Windows ドキュメント」の「Set, View, Change, or Remove Permissions on an Object」を参照してください。

コンソールを使用して .zip ファイルの関数を作成、更新する

新しい関数を作成するには、まずコンソールで関数を作成し、次に .zip アーカイブをアップロードする必要があります。既存の関数を更新するには、その関数のページを開き、同じ手順に従って更新した .zip ファイルを追加します。

.zip ファイルが 50 MB 未満の場合は、ローカルマシンから直接ファイルをアップロードして関数を作成または更新できます。50 MB を超える .zip ファイルの場合は、まず  Amazon S3 バケットにパッケージをアップロードする必要があります。AWS Management Console を使用して Amazon S3 バケットにファイルをアップロードする手順については、「Amazon S3 の開始方法」を参照してください。AWS CLI を使用してファイルをアップロードするには、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

注記

既存の関数のデプロイパッケージタイプ (.zip またはコンテナイメージ) を変更することはできません。例えば、既存のコンテナイメージ関数を、.zip ファイルアーカイブを使用するように変換することはできません。この場合は、新しい関数を作成する必要があります。

新しい関数を作成するには (コンソール)
  1. Lambda コンソールの [関数] ページを開き、[関数の作成] を選択します。

  2. [一から作成] を選択します。

  3. [基本的な情報] で、以下を行います。

    1. [関数名] に、関数名を入力します。

    2. [ランタイム] で、使用するランタイムを選択します。

    3. (オプション) [アーキテクチャ]で、関数の命令セットアーキテクチャを選択します。デフォルトのアーキテクチャは x86_64 です。関数用の .zip デプロイパッケージと選択した命令セットのアーキテクチャに互換性があることを確認してください。

  4. (オプション) [アクセス権限] で、[デフォルトの実行ロールの変更] を展開します。新しい [実行ロール] を作成することも、既存のロールを使用することもできます。

  5. [関数の作成]を選択します。Lambda は、選択したランタイムを使用して基本的な「Hello world」関数を作成します。

ローカルマシンから  zip アーカイブをアップロードするには (コンソール)
  1. Lambda コンソールの [関数ページ] で、.zip ファイルをアップロードする関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインで、[アップロード元] をクリックします。

  4. [.zip ファイル] をクリックします。

  5. .zip ファイルをアップロードするには、次の操作を行います。

    1. [アップロード] をクリックし、ファイルセレクターで .zip ファイルを選択します。

    2. [開く] をクリックします。

    3. [保存] をクリックします。

Amazon S3 バケットから .zip アーカイブをアップロードするには (コンソール)
  1. Lambda コンソールの [関数ページ] で、新しい .zip ファイルをアップロードする関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインで、[アップロード元] をクリックします。

  4. [Amazon S3 ロケーション] を選択します。

  5. .zip ファイルの Amazon S3 リンク URL を貼り付けて、[保存] を選択します。

コンソールコードエディタを使用して .zip ファイル関数を更新する

.zip デプロイパッケージを使用する一部の関数では、Lambda コンソールの組み込みコードエディタを使用して、関数コードを直接更新できます。この機能を使用するには、関数が次の基準を満たしている必要があります。

  • 関数が、インタープリター言語ランタイムのいずれか (Python、Node.js、Ruby) を使用する必要があります。

  • 関数のデプロイパッケージが 3 MB 未満である必要があります。

コンテナイメージデプロイパッケージを含む関数の関数コードは、コンソールで直接編集することはできません。

コンソールのコードエディタを使用して関数コードを更新するには
  1. Lambda コンソールの「関数ページ」を開き、関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインでソースコードファイルを選択し、統合コードエディタで編集します。

  4. コードの編集が終了したら、[デプロイ] を選択して変更を保存し、関数を更新します。

AWS CLI を使用して .zip ファイルで関数を作成、更新する

AWS CLI を使用して新しい関数を作成したり、.zip ファイルを使用して既存の関数を更新したりできます。create-function コマンドと update-function-code を使用して、.zip パッケージをデプロイします。.zip ファイルが 50 MB 未満の場合は、ローカルビルドマシン上のファイルの場所から .zip パッケージをアップロードできます。サイズの大きいファイルの場合は、Amazon S3 バケットから .zip パッケージをアップロードする必要があります。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

注記

AWS CLI を使用して Amazon S3 バケットから .zip ファイルをアップロードする場合、このバケットは関数と同じ AWS リージョン に配置する必要があります。

AWS CLI を含む .zip ファイルを使用して新しい関数を作成するには、以下を指定する必要があります。

  • 関数の名前 (--function-name)

  • 関数のランタイム (--runtime)

  • 関数の実行ロール (--role) の Amazon リソースネーム (ARN)

  • 関数コード内のハンドラーメソッド (--handler) の名前

.zip ファイルの場所も指定する必要があります。.zip ファイルがローカルビルドマシン上のフォルダにある場合は、次のコマンド例に示すように、--zip-file オプションを使用してファイルパスを指定します。

aws lambda create-function --function-name myFunction \ --runtime nodejs20.x --handler index.handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip

Amazon S3 バケット内の .zip ファイルの場所を指定するには、以下のコマンド例にある --code オプションを使用します。S3ObjectVersion パラメータは、バージョン管理下のオブジェクトにのみ使用する必要があります。

aws lambda create-function --function-name myFunction \ --runtime nodejs20.x --handler index.handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --code S3Bucket=myBucketName,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

CLI を使用して既存の関数を更新するには、--function-name パラメータを使用して関数の名前を指定します。関数コードの更新に使用する .zip ファイルの場所も指定する必要があります。.zip ファイルがローカルビルドマシン上のフォルダにある場合は、次のコマンド例に示すように、--zip-file オプションを使用してファイルパスを指定します。

aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip

Amazon S3 バケット内の .zip ファイルの場所を指定するには、以下のコマンド例にある --s3-bucket および --s3-key オプションを使用します。--s3-object-version パラメータは、バージョン管理下のオブジェクトにのみ使用する必要があります。

aws lambda update-function-code --function-name myFunction \ --s3-bucket myBucketName --s3-key myFileName.zip --s3-object-version myObject Version

Lambda API を使用して .zip ファイルで関数を作成、更新する

.zip ファイルアーカイブを使用して関数を作成および更新するには、以下の API オペレーションを使用します。

AWS SAM を使用して .zip ファイルで関数を作成、更新する

AWS Serverless Application Model (AWS SAM) は、AWS のサーバーレスアプリケーションの構築と実行のプロセスを合理化するのに役立つツールキットです。YAML または JSON テンプレートでアプリケーションのリソースを定義し、AWS SAM コマンドラインインターフェイス (AWS SAM CLI) を使用して、アプリケーションを構築、パッケージ化、デプロイします。AWS SAM テンプレートから Lambda 関数を構築すると、AWS SAM は関数コードと指定した任意の依存関係を含む .zip デプロイパッケージまたはコンテナイメージを自動的に作成します。AWS SAM を使用して Lambda 関数を構築およびデプロイする方法の詳細については、「AWS Serverless Application Model 開発者ガイドの」の「AWS SAM の開始方法」を参照してください。

AWS SAM を使用して、既存の .zip ファイルアーカイブを使用する Lambda 関数を作成できます。AWS SAM を使用して Lambda 関数を作成するには、.zip  ファイルを Amazon S3 バケットまたはビルドマシンのローカルフォルダに保存します。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

AWS SAM テンプレートでは、Lambda 関数は AWS::Serverless::Function のリソースにより指定されます。このリソースで次のプロパティを設定し、.zip ファイルアーカイブを使用して関数を作成します。

  • PackageTypeZip に設定

  • CodeUri - 関数コードの Amazon S3 URI、ローカルフォルダへのパス、または FunctionCode オブジェクトに設定

  • Runtime - 選択したランタイムに設定

AWS SAM では、.zip ファイルが 50 MB を超える場合、この .zip ファイルを最初に Amazon S3 バケットにアップロードする必要はありません。AWS SAM では、ローカルビルドマシン上の場所から、最大許容サイズ 250 MB (解凍) の .zip パッケージをアップロードできます。

AWS SAM で .zip ファイルを使用して関数をデプロイする方法の詳細については、「AWS SAM 開発者ガイド」の「AWS::Serverless::Function」を参照してください。

AWS CloudFormation を使用して .zip ファイルで関数を作成、更新する

AWS CloudFormation を使用して、.zip ファイルアーカイブを使用する Lambda 関数を作成できます。.zip ファイルから Lambda 関数を作成するには、最初にファイルを Amazon S3 バケットにアップロードする必要があります。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

AWS CloudFormation テンプレートでは、Lambda 関数は AWS::Lambda::Function のリソースにより指定されます。このリソースで次のプロパティを設定し、.zip ファイルアーカイブを使用して関数を作成します。

  • PackageTypeZip に設定

  • CodeS3Bucket および S3Key フィールドに Amazon S3 バケット名と .zip ファイル名を入力

  • Runtime - 選択したランタイムに設定

AWS CloudFormation が生成する .zip ファイルは、4 MB を超えることはできません。AWS CloudFormation で .zip ファイルを使用して関数をデプロイする方法の詳細については、「AWS CloudFormation ユーザーガイド」の「AWS::Lambda::Function」を参照してください。