空白功能示例應用 AWS Lambda - AWS Lambda

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

空白功能示例應用 AWS Lambda

Blank 函數範例應用程式利用一個呼叫 Lambda API 的函數來示範 Lambda 中的一般操作。它顯示了日誌記錄,環境變量, AWS X-Ray 跟踪,層,單元測試和 AWS SDK 的使用。探索此應用程式可了解如何使用您的程式設計語言建置 Lambda 函數,或以它做為自有專案的起點。

此範例應用程式有下列幾種語言的變體:

變體

本主題中的範例聚焦於 Node.js 版本的程式碼,但詳細資訊通常適用於所有變體。

您可以使用 AWS CLI 和在幾分鐘內部署範例 AWS CloudFormation。依照 README 中的指示進行下載、設定,以及在您的帳戶中部署。

架構和處理常式程式碼

範例應用程式包含函式程式碼、 AWS CloudFormation 範本和支援資源。當您部署範例時,您會使用下列 AWS 服務:

每項服務均需收取標準費用。如需詳細資訊,請參閱 AWS 定價

函數程式碼顯示處理事件的基本工作流程。處理常式接受一個 Amazon Simple Queue Service (Amazon SQS) 事件作為輸入,並逐一處理事件內含的記錄,記錄每個訊息的內容。它會記錄事件、內容物件和環境變數的內容。然後,它會使用 AWS SDK 進行呼叫,並將回應傳送回 Lambda 執行階段。

範例 blank-nodejs/function/index.js - 處理常式程式碼
// Handler exports.handler = async function(event, context) { event.Records.forEach(record => { console.log(record.body); }); console.log('## ENVIRONMENT VARIABLES: ' + serialize(process.env)); console.log('## CONTEXT: ' + serialize(context)); console.log('## EVENT: ' + serialize(event)); return getAccountSettings(); }; // Use SDK client var getAccountSettings = function() { return lambda.send(new GetAccountSettingsCommand()); }; var serialize = function(object) { return JSON.stringify(object, null, 2); };

範例應用程式不包含傳送事件的 Amazon SQS 佇列,但會使用來自 Amazon SQS (event.json) 的事件來說明事件的處理方式。若要將 Amazon SQS 佇列新增至您的應用程式,請參閱 搭配 Amazon SQS 使用 Lambda

使用 AWS CloudFormation 和的部署自動化 AWS CLI

範例應用程式的資源是在 AWS CloudFormation 範本中定義,並使用 AWS CLI. 專案包含簡單的 Shell 指令碼,可將應用程式的設定、部署、叫用和拆卸程序自動化。

應用程式範本使用 AWS Serverless Application Model (AWS SAM) 資源類型來定義模型。 AWS SAM 透過自動化定義執行角色、API 和其他資源,簡化無伺服器應用程式的範本建立作業。

範本會定義應用程式堆疊中的資源。這包括函數、其執行角色,以及提供函數程式庫依賴項的 Lambda 層。堆疊不包含部署期間所 AWS CLI 使用的值區或記 CloudWatch 錄檔群組。

範例 blank-nodejs/template.yml - 無伺服器資源
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs20.x

當您部署應用程式時,會 AWS SAM 將轉換 AWS CloudFormation 套用至範本,以產生具有標準類型 (例如AWS::Lambda::Function和) 的 AWS CloudFormation 範本AWS::IAM::Role

範例 已處理範本
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "An AWS Lambda application that calls the Lambda API.", "Resources": { "function": { "Type": "AWS::Lambda::Function", "Properties": { "Layers": [ { "Ref": "libs32xmpl61b2" } ], "TracingConfig": { "Mode": "Active" }, "Code": { "S3Bucket": "lambda-artifacts-6b000xmpl1e9bf2a", "S3Key": "3d3axmpl473d249d039d2d7a37512db3" }, "Description": "Call the AWS Lambda API", "Tags": [ { "Value": "SAM", "Key": "lambda:createdBy" } ],

在此範例中,Code 屬性指定 Amazon S3 儲存貯體中的物件。這一項對應到專案範本中 CodeUri 屬性的本機路徑:

CodeUri: function/.

為了將專案檔案上傳至 Amazon S3,部署指令碼應使用 AWS CLI中的命令。cloudformation package 命令預先處理範本、上傳成品,並以 Amazon S3 物件位置取代本機路徑。指cloudformation deploy令會使用 AWS CloudFormation 變更集部署已處理的範本。

範例 blank-nodejs/3-deploy.sh - 封裝與部署
#!/bin/bash set -eo pipefail ARTIFACT_BUCKET=$(cat bucket-name.txt) aws cloudformation package --template-file template.yml --s3-bucket $ARTIFACT_BUCKET --output-template-file out.yml aws cloudformation deploy --template-file out.yml --stack-name blank-nodejs --capabilities CAPABILITY_NAMED_IAM

第一次執行此指令碼時,會建立名為的 AWS CloudFormation 堆疊blank-nodejs。如果您變更函數程式碼或範本,您可以再次執行它以更新堆疊。

清除指令碼 (blank-nodejs/5-cleanup.sh) 會刪除堆疊,並選擇性地刪除部署儲存貯體和函數日誌。

儀器與 AWS X-Ray

範例函數已設定為可使用 AWS X-Ray 進行追蹤。若將追蹤模式設定為作用中,Lambda 會記錄叫用子集的計時資訊,並將其傳送至 X-Ray。X-Ray 處理資料以產生服務映射,顯示用戶端節點和兩個服務節點。

第一個服務節點 (AWS::Lambda) 代表 Lambda 服務,它會驗證叫用請求並將其傳送給函數。第二個節點 AWS::Lambda::Function 代表函數本身。

為了記錄其他詳細資訊,範例函數使用 X-Ray 開發套件。只要對函數程式碼進行最少的變更,X-Ray SDK 就會記錄使用 AWS SDK 對 AWS 服務進行的呼叫的詳細資訊。

範例 blank-nodejs/function/index.js – 檢測
const AWSXRay = require('aws-xray-sdk-core'); const { LambdaClient, GetAccountSettingsCommand } = require('@aws-sdk/client-lambda'); // Create client outside of handler to reuse const lambda = AWSXRay.captureAWSv3Client(new LambdaClient());

檢測 AWS SDK 用戶端會在服務對應中新增一個額外的節點,並在追蹤中加入更多詳細資訊。在此範例中,服務映射所顯示的範例函數會呼叫 Lambda API 以取得目前區域中儲存體和並行用量的詳細資訊。

追蹤會顯示呼叫的計時詳細資訊,針對函數初始化、呼叫和額外負荷各有不同子區段。呼叫子區段具有 AWS SDK 呼叫 API 作業的子區段。GetAccountSettings

您可以將 X-Ray 開發套件和其他程式庫包含在函數的部署套件中,或將它們分別部署在 Lambda 層。對於 Node.js、紅寶石和 Python,Lambda 執行階段會在執行環境中包含 AWS 開發套件。

使用 Layer 的相依性管理

您可以在本機安裝程式庫,並將它們包含在您上傳到 Lambda 的部署套件中,但這有其缺點。較大型的檔案會導致部署時間增加,並且可能令您無法在 Lambda 主控台中測試函數程式碼的變更。為了保持小部署套件,並避免上傳未變更的相依性,範例應用程式會建立一個 Lambda 層,並將其與函數建立關聯。

範例 blank-nodejs/template.yml - 相依性層
Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs20.x

2-build-layer.sh 指令碼使用 npm 來安裝函數的相依性,並將它們放置在具有 Lambda 執行時間所需結構的資料夾中。

範例 2-build-layer.sh - 準備該層
#!/bin/bash set -eo pipefail mkdir -p lib/nodejs rm -rf node_modules lib/nodejs/node_modules npm install --production mv node_modules lib/nodejs/

第一次部署範例應用程式時,會將層與函數程式碼分開 AWS CLI 封裝,並同時部署兩者。若是後續部署,則只有當 lib 資料夾內容已變更時,才會上傳 Layer 存檔。