本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 TypeScript Lambda 函數的層
Lambda 層是含有補充程式碼或資料的 .zip 封存檔。層通常具備程式庫相依性、自訂執行期或組態檔案。建立層包含三個一般步驟:
-
封裝層內容。這表示建立 .zip 封存檔,其中包含您要在函數中使用的相依項。
-
在 Lambda 中建立層。
-
將層新增至函數中。
本主題包含步驟和指導,說明如何正確封裝和建立具有外部程式庫相依項的 Node.js Lambda 層。此外,本主題說明如何將層與以 TypeScript 撰寫的函數搭配使用。
必要條件
若要完成本節中的步驟,您必須執行下列各項:
-
Node.js 20
和 npm 套件管理員。如需安裝 Node.js 的詳細資訊,請參閱 Node.js 文件中的 Installing Node.js via package manager 。
在本主題中,我們會參考 aws-lambda-developer-guide GitHub 儲存庫中的 layer-nodejslayer
目錄包含用於產生層的指令碼。該應用程式還在 function-ts
目錄中包含 TypeScript 範例函數,該函數使用層中的相依項。建立層之後,您可以轉譯、部署並調用對應的函數來驗證一切是否運作正常。本文件會逐步說明如何使用 TypeScript 範例函數建立、封裝、部署和測試此層。
此範例應用程式使用 Node.js 20 執行時期。如果將其他相依項新增至層,它們必須與 Node.js 20 相容。
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
資訊清單檔案的 engines
、os
和 cpu
欄位指定其相容性。如需有關 package.json
檔案的詳細資訊,請參閱 NPM 文件中的 package.json
Node.js 執行時期的層路徑
將層新增至函數時,Lambda 會將層內容載入執行環境。如果您的層將相依項封裝在特定的資料夾路徑,Node.js 執行環境就會識別這些模組,您就可以從函數程式碼中引用這些模組。
為確保您的模組能被擷取,請將其打包成層 .zip 檔案,並放在下列其中一個資料夾路徑中。這些檔案存放在 /opt
中,資料夾路徑會載入 PATH
環境變數。
nodejs/node_modules
nodejs/node
X
/node_modules
例如,您在本教學課程中建立的層 .zip 檔案具有下列目錄結構:
layer_content.zip
└ nodejs
└ node20
└ node_modules
└ lodash
└ <other potential dependencies>
└ ...
您會將 lodash
nodejs/node20/node_modules
目錄。這可確保 Lambda 可以在函數調用期間找到程式庫。
封裝層內容
在此範例中,您會將 lodash
程式庫封裝到層 .zip 檔案中。請完成下列步驟,以安裝和封裝層內容。
安裝和封裝層內容
-
從 GitHub 複製 aws-lambda-developer-guide
儲存庫,其中包含您在 sample-apps/layer-nodejs
目錄中所需的範例程式碼。git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
導覽至
layer-nodejs
範例應用程式的layer
目錄。此目錄包含您用來正確建立和封裝層的指令碼。cd aws-lambda-developer-guide/sample-apps/layer-nodejs/layer
-
確保
package.json
檔案列示lodash
。此檔案會定義您要包含在層中的相依項。您可以更新此檔案,以在層中包含您想要的任何相依項。注意
此步驟中使用的
package.json
在上傳至 Lambda 層後,不會與您的相依項一起儲存或使用。它僅用於層封裝程序,不會像 Node.js 應用程式或發布的套件中的檔案那樣指定執行命令和相容性。 -
確保您擁有 Shell 許可,可在
layer
目錄中執行指令碼。chmod 744 1-install.sh && chmod 744 2-package.sh
-
使用以下命令來執行 1-install.sh
指令碼。 ./1-install.sh
此指令碼執行
npm install
,它會讀取您的package.json
並下載其中定義的相依項。範例 1-install.sh
npm install .
-
使用以下命令來執行 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:
。在本教學課程的下一個步驟中,當您將層新增至函數時,將需要此 Amazon Resource Name (ARN)。123456789012
:layer:nodejs-lodash-layer:1
將層新增至函數
部署一個在函數程式碼中使用 lodash
程式庫的範例 Lambda 函數,然後連接您建立的層。若要使用以 TypeScript 撰寫的函數程式碼建立 Lambda 函數,您必須將 TypeScript 轉譯成 JavaScript,以供 Node.js 執行時期使用。如需此程序的詳細資訊,請參閱 定義 TypeScript 格式的 Lambda 函數處理常式。為了提高相容性,當您使用層分配相依項時,請使用 tsc 來轉譯 TypeScript 模組。如果您綁定相依項,請考慮使用 esbuild。如需使用 esbuild 綁定的詳細資訊,請參閱使用 .zip 檔案封存,在 Lambda 中部署轉換的 TypeScript 程式碼。
若要部署函數,您需要執行角色。如需詳細資訊,請參閱 使用執行角色定義 Lambda 函數許可。如果沒有現有的執行角色,請依可摺疊區段中的步驟操作。否則,請跳到下一節部署函數。
若要建立執行角色
-
在 IAM 主控台中開啟角色頁面
。 -
選擇建立角色。
-
建立具備下列屬性的角色。
-
信任實體 - Lambda。
-
許可 - AWSLambdaBasicExecutionRole。
-
角色名稱 -
lambda-role
。
AWSLambdaBasicExecutionRole 政策具備函數將日誌寫入到 CloudWatch Logs 時所需的許可。
-
範例函數程式碼_.findLastIndex
方法讀取物件陣列。它會比較物件與標準,找出符合的索引。然後,它會傳回 Lambda 回應中物件的索引和值。
import { Handler } from 'aws-lambda'; import * as _ from 'lodash'; type User = { user: string; active: boolean; } type UserResult = { statusCode: number; body: string; } const users: User[] = [ { 'user': 'Carlos', 'active': true }, { 'user': 'Gil-dong', 'active': false }, { 'user': 'Pat', 'active': false } ]; export const handler: Handler<any, UserResult> = async (): Promise<UserResult> => { let out = _.findLastIndex(users, (user: User) => { return user.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), }; return response; };
部署 Lambda 函數
-
導覽至
layer-nodejs
範例應用程式的function-ts/
目錄。如果您目前位於layer-nodejs
範例應用程式的layer/
目錄中,請執行以下命令:cd ../function-ts
-
使用以下命令安裝
package.json
中列出的開發相依項:npm install
-
執行
package.json
中定義的build
任務,以轉譯函數程式碼並將其封裝為 .zip 檔案。使用下列命令:npm run build
-
部署函數。在下列 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://dist/index.zip -
將層附接到您的函數中。在下列 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
" -
使用下列 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 層
-
開啟 Lambda 主控台中的層頁面
。 -
選取您建立的層。
-
選擇刪除,然後再次選擇刪除。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
delete
,然後選擇刪除。