記錄和監控 TypeScript Lambda 函數 - AWS Lambda

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

記錄和監控 TypeScript Lambda 函數

AWS Lambda 會自動監控 Lambda 函數,並將日誌項目傳送至 Amazon CloudWatch。您的 Lambda 函數隨附有 CloudWatch Logs 日誌群組,且函數的每一執行個體各有一個日誌串流。Lambda 執行期環境會將每次調用的詳細資訊和函數程式碼的其他輸出,傳送至日誌串流。如需 CloudWatch Logs 的詳細資訊,請參閱 將 CloudWatch Logs 與 Lambda 搭配使用

若要由您的函數程式碼輸出日誌,您可以在主控台物件上使用方法。若要更詳細記錄,您可以使用任何寫入 stdoutstderr 的記錄程式庫。

使用日誌記錄工具和程式庫

Powertools for AWS Lambda TypeScript 是開發人員工具組,可實作無伺服器最佳實務並提高開發人員速度。Logger 公用程式提供 Lambda 優化記錄器,其中包含有關所有函數之函數內容的其他資訊,輸出結構為 JSON。使用此公用程式執行下列操作:

  • 從 Lambda 內容、冷啟動和 JSON 形式的結構記錄輸出中擷取關鍵欄位

  • 在收到指示時記錄 Lambda 調用事件 (預設為停用)

  • 透過日誌採樣僅列印調用百分比的所有日誌 (預設為停用)

  • 在任何時間點將其他金鑰附加至結構化日誌

  • 使用自訂日誌格式化程式 (自帶格式化程式),以與組織的日誌記錄 RFC 相容的結構輸出日誌。

使用 Powertools for AWS Lambda (TypeScript) 和 AWS SAM 進行結構化日誌記錄

請依照以下步驟操作,使用 AWS SAM 透過整合式 Powertools for AWS Lambda (TypeScript) 模組,下載、建置和部署範例 Hello World TypeScript 應用程式。此應用程式實作了基本 API 後端,並使用 Powertools 發送日誌、指標和追蹤。其包含 Amazon API Gateway 端點和 Lambda 函數。當您將 GET 請求傳送至 API Gateway 端點時,Lambda 函數會調用、使用內嵌指標格式將日誌和指標傳送至 CloudWatch,並將追蹤傳送至 AWS X-Ray。該函數會傳回 hello world 訊息。

必要條件

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

部署範例 AWS SAM 應用程式
  1. 使用 Hello World TypeScript 範本來初始化應用程式。

    sam init --app-template hello-world-powertools-typescript --name sam-app --package-type Zip --runtime nodejs18.x
  2. 建置應用程式。

    cd sam-app && sam build
  3. 部署應用程式。

    sam deploy --guided
  4. 依照螢幕上的提示操作。若要接受互動體驗中提供的預設選項,請按下 Enter

    注意

    對於 HelloWorldFunction may not have authorization defined, Is this okay?,確保輸入 y

  5. 取得已部署應用程式的 URL:

    aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
  6. 調用 API 端點:

    curl <URL_FROM_PREVIOUS_STEP>

    成功的話,您將會看到以下回應:

    {"message":"hello world"}
  7. 若要獲取該函數的日誌,請執行 sam 日誌。如需詳細資訊,請參閱《AWS Serverless Application Model 開發人員指南》 中的使用日誌

    sam logs --stack-name sam-app

    日誌輸出如下:

    2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.552000 START RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Version: $LATEST 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.594000 2022-08-31T09:33:10.557Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390556,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[{"Name":"ColdStart","Unit":"Count"}]}]},"service":"helloWorld","ColdStart":1} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.595000 2022-08-31T09:33:10.595Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"level":"INFO","message":"This is an INFO log - sending HTTP 200 - hello world response","service":"helloWorld","timestamp":"2022-08-31T09:33:10.594Z"} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.655000 2022-08-31T09:33:10.655Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390655,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[]}]},"service":"helloWorld"} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.754000 END RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.754000 REPORT RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Duration: 201.55 ms Billed Duration: 202 ms Memory Size: 128 MB Max Memory Used: 66 MB Init Duration: 252.42 ms XRAY TraceId: 1-630f2ad5-1de22b6d29a658a466e7ecf5 SegmentId: 567c116658fbf11a Sampled: true
  8. 這是可透過網際網路存取的公有 API 端點。建議您在測試後刪除端點。

    sam delete

管理日誌保留

當您刪除函數時,不會自動刪除日誌群組。若要避免無限期地儲存日誌,請刪除日誌群組,或設定保留期間,CloudWatch 會在該時間之後自動刪除日誌。若要設定日誌保留,請將下列項目新增至 AWS SAM 範本:

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: # Omitting other properties LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}" RetentionInDays: 7

使用 Powertools for AWS Lambda (TypeScript) 和 AWS CDK 進行結構化日誌記錄

請依照以下步驟操作,使用 AWS CDK 透過整合式 Powertools for AWS Lambda (TypeScript) 模組,下載、建置和部署範例 Hello World TypeScript 應用程式。此應用程式實作了基本 API 後端,並使用 Powertools 發送日誌、指標和追蹤。其包含 Amazon API Gateway 端點和 Lambda 函數。當您將 GET 請求傳送至 API Gateway 端點時,Lambda 函數會調用、使用內嵌指標格式將日誌和指標傳送至 CloudWatch,並將追蹤傳送至 AWS X-Ray。該函數會傳回 hello world 訊息。

必要條件

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

部署範例 AWS CDK 應用程式
  1. 為您的新應用程式建立專案目錄。

    mkdir hello-world cd hello-world
  2. 初始化應用程式。

    cdk init app --language typescript
  3. 新增 @types/aws-lambda 套件作為開發相依項。

    npm install -D @types/aws-lambda
  4. 安裝 Powertools Logger 公用程式

    npm install @aws-lambda-powertools/logger
  5. 開啟 lib 目錄。您應看到名稱為 hello-world-stack.ts 的檔案。在此目錄中建立兩個新檔案:hello-world.function.tshello-world.ts

  6. 開啟 hello-world.function.ts,並將下列程式碼新增至檔案。這是 Lambda 函數的程式碼。

    import { APIGatewayEvent, APIGatewayProxyResult, Context } from 'aws-lambda'; import { Logger } from '@aws-lambda-powertools/logger'; const logger = new Logger(); export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { logger.info('This is an INFO log - sending HTTP 200 - hello world response'); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
  7. 開啟 hello-world.ts,然後將下列程式碼新增至檔案。其中包含 NodejsFunction 建構模組,它會建立 Lambda 函數、設定 Powertools 的環境變數,並將日誌保留設定為一週。另外也包括負責建立 REST API 的 LambdaRestApi 建構模組

    import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; import { RetentionDays } from 'aws-cdk-lib/aws-logs'; import { CfnOutput } from 'aws-cdk-lib'; export class HelloWorld extends Construct { constructor(scope: Construct, id: string) { super(scope, id); const helloFunction = new NodejsFunction(this, 'function', { environment: { Powertools_SERVICE_NAME: 'helloWorld', LOG_LEVEL: 'INFO', }, logRetention: RetentionDays.ONE_WEEK, }); const api = new LambdaRestApi(this, 'apigw', { handler: helloFunction, }); new CfnOutput(this, 'apiUrl', { exportName: 'apiUrl', value: api.url, }); } }
  8. 開啟 hello-world-stack.ts。這是定義 AWS CDK 堆疊的程式碼。將程式碼取代為以下內容:

    import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { HelloWorld } from './hello-world'; export class HelloWorldStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new HelloWorld(this, 'hello-world'); } }
  9. 返回專案目錄。

    cd hello-world
  10. 部署您的應用程式。

    cdk deploy
  11. 取得已部署應用程式的 URL:

    aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?ExportName==`apiUrl`].OutputValue' --output text
  12. 調用 API 端點:

    curl <URL_FROM_PREVIOUS_STEP>

    成功的話,您將會看到以下回應:

    {"message":"hello world"}
  13. 若要獲取該函數的日誌,請執行 sam 日誌。如需詳細資訊,請參閱《AWS Serverless Application Model 開發人員指南》 中的使用日誌

    sam logs --stack-name HelloWorldStack

    日誌輸出如下:

    2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.047000 START RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Version: $LATEST 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.050000 { "level": "INFO", "message": "This is an INFO log - sending HTTP 200 - hello world response", "service": "helloWorld", "timestamp": "2022-08-31T14:48:37.048Z", "xray_trace_id": "1-630f74c4-2b080cf77680a04f2362bcf2" } 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.082000 END RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.082000 REPORT RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Duration: 34.60 ms Billed Duration: 35 ms Memory Size: 128 MB Max Memory Used: 57 MB Init Duration: 173.48 ms
  14. 這是可透過網際網路存取的公有 API 端點。建議您在測試後刪除端點。

    cdk destroy

在 Lambda 主控台檢視日誌

您可以在調用 Lambda 函數之後,使用 Lambda 主控台來檢視日誌輸出。

如果可以從內嵌程式碼編輯器測試您的程式碼,您會在執行結果中找到日誌。使用主控台測試功能以調用函數時,您會在詳細資訊區段找到日誌輸出

在 CloudWatch 主控台中檢視 記錄

您可以使用 Amazon CloudWatch 主控台來檢視所有 Lambda 函數調用的日誌。

若要在 CloudWatch 主控台上檢視日誌
  1. 在 CloudWatch 主控台上開啟日誌群組頁面

  2. 選擇您的函數的日誌群組 (/aws/lambda/your-function-name)。

  3. 選擇日誌串流

每個日誌串流都會對應至函式的執行個體。當您更新 Lambda 函數,以及建立額外執行個體以處理多個並行調用時,便會出現日誌串流。若要尋找特定調用的日誌,建議使用 AWS X-Ray 來檢測函數。X-Ray 會在追蹤內記錄有關請求和日誌串流的詳細資訊。