使用 .zip 封存檔部署 Node.js Lambda 函數 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 .zip 封存檔部署 Node.js Lambda 函數

AWS Lambda 函數的程式碼包含一個 .js 或 .mjs 檔案,其中包含函數的處理常式程式碼,以及程式碼依賴的任何其他套件和模組。若要將此函數程式碼部署到 Lambda,您可以使用部署套件。此套件可以是 .zip 封存檔或容器映像。如需有關搭配使用容器映像與 Node.js 的詳細資訊,請參閱使用容器映像部署 Node.js Lambda 函數

若要建立 .zip 封存檔的部署套件,您可以使用命令列工具的內建 .zip 封存檔公用程式,或任何其他 .zip 檔案公用程式 (例如 7zip)。以下各節顯示的範例假設您在 Linux 或 MacOS 環境中使用命令列 zip 工具。若要在 Windows 中使用相同命令,您可以安裝適用於 Linux 的 Windows 子系統,以取得 Ubuntu 和 Bash 的 Windows 整合版本。

請注意,Lambda 使用POSIX檔案許可,因此您可能需要在建立 .zip 檔案封存之前設定部署套件資料夾的許可

Node.js 中的執行期相依項

對於使用 Node.js 執行期的 Lambda 函數,相依項可以是任何 Node.js 模組。Node.js 執行期包含許多常見程式庫,以及 AWS SDK for JavaScript的某個版本。nodejs16.x Lambda 執行期包含 的 2SDK.x 版。執行期版本 nodejs18.x和更新版本包含 的第 3 版SDK。若要將 第 2 版SDK與執行期版本 nodejs18.x 及更新版本搭配使用,請將 SDK新增至您的 .zip 檔案部署套件。如果您選擇的執行期包含SDK您正在使用的 版本,則不需要在 .zip 檔案中包含程式SDK庫。若要了解您使用的執行階段SDK中包含的 版本,請參閱 包含執行期的SDK版本

Lambda 會定期更新 Node.js 執行期中的SDK程式庫,以包含最新的功能和安全升級。Lambda 也會將安全修補程式和更新套用至執行期中包含的其他程式庫。若要完全控制套件中的相依項,可以將任何包含執行期之相依項的偏好版本新增至部署套件。例如,如果您想要使用適用於 SDK 的特定 版本 JavaScript,您可以將其包含在 .zip 檔案中作為相依性。如需有關將包含執行期的相依項新增至 .zip 檔案的詳細資訊,請參閱 相依項搜尋路徑和含執行期程式庫

在 AWS  共同責任模式下,您負責管理函數部署套件中的任何相依項。這包括套用更新和安全性修補程式。若要更新函數部署套件中的相依項,請先建立新的 .zip 檔案,然後將其上傳至 Lambda。如需詳細資訊,請參閱 建立含相依項的 .zip 部署套件使用 .zip 檔案建立及更新 Node.js Lambda 函數

建立不含相依項的 .zip 部署套件

如果除了 Lambda 執行期中包含的程式庫之外,函數程式碼沒有其他相依項,則 .zip 檔案只包含具有函數處理常式程式碼的 index.jsindex.mjs 檔案。使用您慣用的 zip 公用程式建立 .zip 檔案,並將 index.jsindex.mjs 檔案放在根目錄下。如果包含處理常式程式碼的檔案不在 .zip 檔案的根目錄下,則 Lambda 將無法執行程式碼。

若要了解如何部署 .zip 檔案以建立新的 Lambda 函數或更新現有函數,請參閱使用 .zip 檔案建立及更新 Node.js Lambda 函數

建立含相依項的 .zip 部署套件

如果函數程式碼相依於 Lambda Node.js 執行期中不包含的套件或模組,則可以使用函數程式碼將這些相依項新增至 .zip 檔案,或使用 Lambda 層。本節中的指示說明如何在 .zip 部署套件中包含相依項。如需如何在層中包含相依項的指示,請參閱為相依項建立 Node.js 層

下列範例CLI命令會建立名為 的 .zip 檔案,my_deployment_package.zip其中包含 index.js或 檔案index.mjs,其中包含函數的處理常式程式碼及其相依性。在此範例中,可以使用 npm 套件管理工具來安裝相依項。

建立部署套件
  1. 導覽到包含 index.jsindex.mjs 原始程式碼檔案的專案目錄。在此範例中,目錄名為 my_function

    cd my_function
  2. 使用 npm install 命令將函數的所需程式庫安裝在 node_modules 目錄中。在此範例中,將安裝 適用於 Node.js 的 AWS X-Ray SDK。

    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變數擷取您的層內容,您的 layer .zip 檔案應該在以下資料夾路徑中具有其相依性:

  • 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 層中。

當您在程式碼中使用 importrequire 陳述式時,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 套件內的個別資料夾中新增相依項。例如,可以將自訂模組新增至名為 common 的 .zip 套件中的資料夾。解壓縮並掛載您的 .zip 套件時,此資料夾會放在 /var/task 目錄中。若要使用來自程式碼中 .zip 部署套件中資料夾的相依性,請使用 import { } fromconst { } = require()陳述式,具體取決於您是使用 CJS或 ESM 模組解析度。例如:

import { myModule } from './common'

如果將程式碼與 esbuildrollup 或類似屬性綁定在一起,則函數使用的相依項會一起綁定在一個或多個檔案中。建議盡可能使用此方法來確定相依項。與將相依項新增至部署套件相比,綁定程式碼可提高效能,因為減少了 I/O 操作。

使用 .zip 檔案建立及更新 Node.js Lambda 函數

建立 .zip 部署套件之後,您可以使用它建立新的 Lambda 函數或更新現有函數。您可以使用 Lambda 主控台、 AWS Command Line Interface和 Lambda 部署 .zip 套件API。您也可以使用 AWS Serverless Application Model  (AWS SAM) 和  AWS CloudFormation 建立並更新 Lambda 函數。

Lambda 的 .zip 部署套件大小上限為 250 MB (解壓縮)。請注意,此限制適用於您上傳的所有檔案 (包括任何 Lambda 層) 的大小總和。

Lambda 執行時間需有許可才能讀取部署套裝服務中的檔案。在 Linux 許可八位元符號中,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,您可以透過直接從本機電腦上傳檔案來建立或更新函數。若 .zip 檔案大於 50 MB,您必須先將套件上傳至 Amazon S3 儲存貯體。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS Management Console,請參閱 Amazon S3 入門。若要使用 上傳檔案 AWS CLI,請參閱 AWS CLI 使用者指南 中的移動物件

注意

您無法變更現有函數的部署套件類型 (.zip 或容器映像)。例如,您無法將容器映像函數轉換為使用 .zip 檔案封存。您必須建立新的函數。

若要建立新的函數 (主控台)
  1. 開啟 Lambda 主控台的函數頁面,然後選擇建立函數

  2. 選擇 Author from scratch (從頭開始撰寫)。

  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. 選擇 Open (開啟)。

    3. 選擇 Save (儲存)。

若要從 Amazon S3 儲存貯體上傳 .zip 封存檔 (控制台)
  1. 在 Lambda 主控台的函數頁面中選擇要上傳新 .zip 檔案的函數。

  2. 選取程式碼索引標籤。

  3. 程式碼來源窗格中選擇上傳來源

  4. 選擇 Amazon S3 位置

  5. 貼上 .zip 檔案URL的 Amazon S3 連結,然後選擇儲存

使用主控台程式碼編輯器更新 .zip 檔案函數

對於某些具有 .zip 部署套件的函數,您可以使用 Lambda 主控台的內建程式碼編輯器直接更新函數程式碼。若要使用此功能,您的函數必須符合下列條件:

  • 您的函數必須使用其中一種轉譯語言執行期 (Python、Node.js 或 Ruby)

  • 函數的部署套件必須小於 3MB。

具有容器映像部署套件之函數的函數程式碼無法直接在主控台中編輯。

若要使用主控台程式碼編輯器更新函數程式碼
  1. 開啟 Lambda 主控台的函數頁面,然後選取您的函數。

  2. 選取程式碼索引標籤。

  3. 程式碼來源窗格中,選取您的原始程式碼檔案,然後在整合式程式碼編輯器中加以編輯。

  4. 完成編輯程式碼後,請選擇部署,以儲存變更並更新函數。

使用 使用 .zip 檔案建立和更新函數 AWS CLI

您可以使用 AWS CLI 建立新函數,或使用 .zip 檔案更新現有函數。使用 create-functionupdate-function-code 命令來部署 .zip 套件。如果您的 .zip 檔案小於 50 MB,則可以從本機建置電腦的檔案位置上傳 .zip 套件。若檔案較大,則必須先從 Amazon S3 儲存貯體上傳 .zip 套件。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI,請參閱 AWS CLI 使用者指南 中的移動物件

注意

如果您使用 從 Amazon S3 儲存貯體上傳 .zip 檔案 AWS CLI,則該儲存貯體必須與您的 AWS 區域 函數位於相同位置。

若要使用具有 的 .zip 檔案建立新的函數 AWS CLI,您必須指定以下內容:

  • 函數名稱 (--function-name)

  • 函數的執行期 (--runtime)

  • 函數執行角色 (ARN) 的 Amazon Resource Name (--role

  • 函數程式碼中處理常式方法的名稱 (--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=amzn-s3-demo-bucket,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 amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version

使用 Lambda 使用 .zip 檔案建立和更新函數 API

若要使用 .zip 檔案封存建立和更新函數,請使用下列API操作:

使用 .zip 檔案建立和更新函數 AWS SAM

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 函數。若要使用 建立 Lambda 函數 AWS SAM,您可以將 .zip 檔案儲存在 Amazon S3 儲存貯體或建置機器的本機資料夾中。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI,請參閱 AWS CLI 使用者指南 中的移動物件

在 AWS SAM 範本中,AWS::Serverless::Function資源會指定您的 Lambda 函數。在本資源中設定下列屬性,以使用 .zip 封存檔建立函數:

  • PackageType:設定為 Zip

  • CodeUri - 設定為函數程式碼的 Amazon S3 URI、本機資料夾的路徑或FunctionCode物件

  • Runtime:設定為所選執行期

使用 AWS SAM時,如果您的 .zip 檔案大於 50MB則不需要先將其上傳至 Amazon S3 儲存貯體。 AWS SAM 可以從本機建置機器的位置上傳 .zip 套件,最大允許大小為 250MB (解壓縮)。

若要進一步了解如何在 中使用 .zip 檔案部署函數 AWS SAM,請參閱 AWS SAM 開發人員指南 中的 AWS::Serverless::Function

使用 .zip 檔案建立和更新函數 AWS CloudFormation

您可以使用 AWS CloudFormation 建立使用 .zip 檔案封存的 Lambda 函數。若要使用 .zip 檔案建立 Lambda 函數,您必須先將檔案上傳至 Amazon S3 儲存貯體。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI,請參閱 使用者指南中的移動物件AWS CLI

在 AWS CloudFormation 範本中,AWS::Lambda::Function資源會指定您的 Lambda 函數。在本資源中設定下列屬性,以使用 .zip 封存檔建立函數:

  • PackageType:設定為 Zip

  • Code:在 S3Bucket 和 S3Key 欄位中輸入 Amazon S3 儲存貯體名稱和 .zip 檔案名稱。

  • Runtime:設定為所選執行期

AWS CloudFormation 產生的 .zip 檔案不得超過 4MB 。若要進一步了解如何在 中使用 .zip 檔案部署函數 AWS CloudFormation,請參閱 AWS CloudFormation 使用者指南 中的 AWS::Lambda::Function