對 Node.js Lambda 函數使用層 - AWS Lambda

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

對 Node.js Lambda 函數使用層

Lambda 層是含有補充程式碼或資料的 .zip 封存檔。層通常具備程式庫相依性、自訂執行期或組態檔案。建立層包含三個一般步驟:

  1. 封裝層內容。這表示建立 .zip 封存檔,其中包含您要在函數中使用的相依項。

  2. 在 Lambda 中建立層。

  3. 將層新增至函數中。

本主題包含步驟和指導,說明如何正確封裝和建立具有外部程式庫相依項的 Node.js Lambda 層。

必要條件

若要完成本節中的步驟,您必須執行下列各項:

在本主題中,我們會參考 aws-lambda-developer-guide GitHub 儲存庫中的 layer-nodejs 範例應用程式。此應用程式包含可下載相依項並將其封裝為層的指令碼。應用程式也包含使用層相依項的對應函數。建立層之後,您可以部署並調用對應的函數,以驗證一切是否正常運作。此範例應用程式使用 Node.js 20 執行時期。如果將其他相依項新增至層,它們必須與 Node.js 20 相容。

layer-nodejs 範例應用程式會將 lodash 程式庫封裝至 Lambda 層。layer 目錄包含用於產生層的指令碼。function 目錄包含一個範例函數來測試層是否運作正常。本文件會逐步說明如何建立、封裝、部署和測試此層。

Node.js 層與 Lambda 執行時期環境的相容性

當您在 Node.js 層中封裝程式碼時,可以指定與程式碼相容的 Lambda 執行時期環境。若要評估程式碼與執行時期的相容性,請考慮程式碼適用的 Node.js 版本、作業系統以及指令集架構。

Lambda Node.js 執行時期會指定其 Node.js 版本和作業系統。在本文件中,您將使用以 AL2023 為基礎的 Node.js 20 執行時期。如需執行時期版本的詳細資訊,請參閱支援的執行期。建立 Lambda 函數時,可以指定指令集架構。在本文件中,您將使用 arm64 架構。如需 Lambda 架構的詳細資訊,請參閱選取和設定 Lambda 函數的指令集架構

當您使用套件中的程式碼時,每個套件維護器會獨立定義其相容性。大多數 Node.js 都被設計為獨立於作業系統和指令集架構。此外,打破與新 Node.js 版本不相容的情況並不常見。您需要花更多時間評估套件之間的相容性,而不是評估套件與 Node.js 版本、作業系統或指令集架構的相容性。

有時 Node.js 套件包含編譯的程式碼,這需要您考慮作業系統和指令集架構的相容性。如果需要為套件評估程式碼相容性,則需要檢查套件及其文件。NPM 中的套件可以透過 package.json 資訊清單檔案的 enginesoscpu 欄位指定其相容性。如需有關 package.json 檔案的詳細資訊,請參閱 NPM 文件中的 package.json

Node.js 執行時期的層路徑

將層新增至函數時,Lambda 會將層內容載入執行環境。如果您的層將相依項封裝在特定的資料夾路徑,Node.js 執行環境就會識別這些模組,您就可以從函數程式碼中引用這些模組。

為確保您的模組能被擷取,請將其打包成層 .zip 檔案,並放在下列其中一個資料夾路徑中。這些檔案存放在 /opt 中,資料夾路徑會載入 PATH 環境變數。

  • nodejs/node_modules

  • nodejs/nodeX/node_modules

例如,您在本教學課程中建立的層 .zip 檔案具有下列目錄結構:

layer_content.zip └ nodejs └ node20 └ node_modules └ lodash └ <other potential dependencies> └ ...

您會將 lodash 程式庫放入 nodejs/node20/node_modules 目錄。這可確保 Lambda 可以在函數調用期間找到程式庫。

封裝層內容

在此範例中,您會將 lodash 程式庫封裝到層 .zip 檔案中。請完成下列步驟,以安裝和封裝層內容。

安裝和封裝層內容
  1. 從 GitHub 複製 aws-lambda-developer-guide 儲存庫,其中包含您在 sample-apps/layer-nodejs 目錄中所需的範例程式碼。

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. 導覽至 layer-nodejs 範例應用程式的 layer 目錄。此目錄包含您用來正確建立和封裝層的指令碼。

    cd aws-lambda-developer-guide/sample-apps/layer-nodejs/layer
  3. 確保 package.json 檔案列示 lodash。此檔案會定義您要包含在層中的相依項。您可以更新此檔案,以在層中包含您想要的任何相依項。

    注意

    此步驟中使用的 package.json 在上傳至 Lambda 層後,不會與您的相依項一起儲存或使用。它僅用於層封裝程序,不會像 Node.js 應用程式或發布的套件中的檔案那樣指定執行命令和相容性。

  4. 確保您擁有 Shell 許可,可在 layer 目錄中執行指令碼。

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 使用以下命令來執行 1-install.sh 指令碼。

    ./1-install.sh

    此指令碼執行 npm install,它會讀取您的 package.json 並下載其中定義的相依項。

    範例 1-install.sh
    npm install .
  6. 使用以下命令來執行 2-package.sh 指令碼:

    ./2-package.sh

    此指令碼會將 node_modules 目錄中的內容複製到名為 nodejs/node20 的新目錄。然後,它會將 nodejs 目錄的內容壓縮成名為 layer_content.zip 的檔案。這是層的 .zip 檔案。您可以解壓縮該檔案,並確認其包含正確的檔案結構,如Node.js 執行時期的層路徑一節所示。

    範例 2-package.sh
    mkdir -p nodejs/node20 cp -r node_modules nodejs/node20/ zip -r layer_content.zip nodejs

建立層

取得您在上一節中產生的 layer_content.zip 檔案,並將其上傳為 Lambda 層。您可以透過 AWS Command Line Interface (AWS CLI) 使用 AWS Management Console或 Lambda API 上傳層。當您上傳層 .zip 檔案時,請在下列 PublishLayerVersion AWS CLI 命令中,將 nodejs20.x 指定為相容的執行時期,將 arm64 指定為相容的架構。

aws lambda publish-layer-version --layer-name nodejs-lodash-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes nodejs20.x \ --compatible-architectures "arm64"

從回應中記下 LayerVersionArn,它類似於 arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1。在本教學課程的下一個步驟中,當您將層新增至函數時,將需要此 Amazon Resource Name (ARN)。

將層新增至函數

部署一個在函數程式碼中使用 lodash 程式庫的範例 Lambda 函數,然後連接您建立的層。若要部署函數,您需要執行角色。如需詳細資訊,請參閱使用執行角色定義 Lambda 函數許可。如果沒有現有的執行角色,請依可摺疊區段中的步驟操作。否則,請跳到下一節部署函數。

若要建立執行角色
  1. 在 IAM 主控台中開啟 角色頁面

  2. 選擇 建立角色

  3. 建立具備下列屬性的角色。

    • 信任實體 - Lambda

    • 許可 - AWSLambdaBasicExecutionRole

    • 角色名稱 - lambda-role

    AWSLambdaBasicExecutionRole 政策具備函數將日誌寫入到 CloudWatch Logs 時所需的許可。

範例函數程式碼使用 lodash _.findLastIndex 方法讀取物件陣列。它會比較物件與標準,找出符合的索引。然後,它會傳回 Lambda 回應中物件的索引和值。

import _ from "lodash" export const handler = async (event) => { var users = [ { 'user': 'Carlos', 'active': true }, { 'user': 'Gil-dong', 'active': false }, { 'user': 'Pat', 'active': false } ]; let out = _.findLastIndex(users, function(o) { return o.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), }; return response; };
部署 Lambda 函數
  1. 導覽至 function/ 目錄。如果您目前在 layer/ 目錄中,則執行下列命令:

    cd ../function-js
  2. 使用以下命令建立 .zip 檔案部署套件:

    zip my_deployment_package.zip index.mjs
  3. 部署函數。在下列 AWS CLI 命令中,將 --role 參數取代為您的執行角色 ARN:

    aws lambda create-function --function-name nodejs_function_with_layer \ --runtime nodejs20.x \ --architectures "arm64" \ --handler index.handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  4. 將層附接到您的函數中。在下列 AWS CLI 命令中,將 --layers 參數取代為您先前記下的層版本 ARN:

    aws lambda update-function-configuration --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1"
  5. 使用下列 AWS CLI 命令調用您的函數以確認其是否正常運作:

    aws lambda invoke --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{}' response.json

    您應該會看到輸出,如下所示:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    輸出的 response.json 檔案包含回應的詳細資訊。

除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除您不再使用的 AWS 資源,可為 AWS 帳戶 避免不必要的費用。

刪除 Lambda 層
  1. 開啟 Lambda 主控台中的 層頁面

  2. 選取您建立的層。

  3. 選擇刪除,然後再次選擇刪除

若要刪除 Lambda 函數
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇您建立的函數。

  3. 選擇 Actions (動作)、Delete (刪除)。

  4. 在文字輸入欄位中輸入 delete,然後選擇刪除