本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
記錄和監控 TypeScript Lambda 數
AWS Lambda 自動監控 Lambda 函數,並將日誌項目傳送到 Amazon CloudWatch。您的 Lambda 函數隨附一個 CloudWatch 日誌記錄群組和函數每個執行個體的日誌串流。Lambda 執行期環境會將每次調用的詳細資訊和函數程式碼的其他輸出,傳送至日誌串流。如需有關 CloudWatch 記錄檔的詳細資訊,請參閱使用 Amazon CloudWatch 日誌 AWS Lambda。
若要由您的函數程式碼輸出日誌,您可以在主控台物件stdout
或 stderr
的記錄程式庫。
章節
使用日誌記錄工具和庫
Powertools to AWS Lambda (TypeScript) 是開發人員工具組,用
從 Lambda 內容、冷啟動和 JSON 形式的結構記錄輸出中擷取關鍵欄位
在收到指示時記錄 Lambda 調用事件 (預設為停用)
透過日誌採樣僅列印調用百分比的所有日誌 (預設為停用)
在任何時間點將其他金鑰附加至結構化日誌
使用自訂日誌格式化程式 (自帶格式化程式),以與組織的日誌記錄 RFC 相容的結構輸出日誌。
使用 Powertools 進行 AWS Lambda (TypeScript)和結構化日 AWS SAM 誌記錄
請按照以下步驟下載,構建和部署示例 Hello World TypeScript 應用程序,其中包含集成的 Powertools 的 AWS Lambda (TypeScript)hello world
訊息。
必要條件
若要完成本節中的步驟,您必須執行下列各項:
-
Node.js 18.x 或更新版本
-
AWS SAM CLI 版本 1.75 或更新版本。如果您使用較舊版本的 AWS SAM CLI,請參閱升級 AWS SAM CLI。
部署範例 AWS SAM 應用程式
-
使用 Hello World TypeScript 範本初始化應用程式。
sam init --app-template hello-world-powertools-typescript --name sam-app --package-type Zip --runtime nodejs18.x
-
建置應用程式。
cd sam-app && sam build
-
部署應用程式。
sam deploy --guided
-
依照螢幕上的提示操作。若要接受互動體驗中提供的預設選項,請按下
Enter
。注意
因為HelloWorldFunction 可能沒有定義授權,這可以嗎? ,請務必輸入
y
。 -
取得已部署應用程式的 URL:
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
調用 API 端點:
curl
<URL_FROM_PREVIOUS_STEP>
成功的話,您將會看到以下回應:
{"message":"hello world"}
-
若要獲取該函數的日誌,請執行 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
-
這是可透過網際網路存取的公有 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
使用動力工具 AWS Lambda (TypeScript)和結構化日 AWS CDK 誌記錄
請按照以下步驟下載,構建和部署示例 Hello World TypeScript 應用程序,其中包含集成的 Powertools 的 AWS Lambda (TypeScript)hello world
訊息。
必要條件
若要完成本節中的步驟,您必須執行下列各項:
-
Node.js 18.x 或更新版本
-
AWS SAM CLI 版本 1.75 或更新版本。如果您使用較舊版本的 AWS SAM CLI,請參閱升級 AWS SAM CLI。
部署範例 AWS CDK 應用程式
-
為您的新應用程式建立專案目錄。
mkdir hello-world cd hello-world
-
初始化應用程式。
cdk init app --language typescript
-
新增 @types/aws-lambda
套件作為開發相依項。 npm install -D @types/aws-lambda
-
安裝 Powertools Logger 公用程式
。 npm install @aws-lambda-powertools/logger
-
開啟 lib 目錄。您應該會看到一個名為 hello-world-stack.ts 的檔案。在此目錄中建立兩個新檔案:hello-world.function.ts 和 hello-world.ts。
-
開啟 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', }), }; };
-
開啟 hello-world.ts,然後將下列程式碼新增至檔案。其中包含NodejsFunction 建立 Lambda 函數的建構、設定 Powertools 的環境變數,以及將記錄保留設定為一週。它也包含LambdaRestApi 建立 REST API 的建構。
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, }); } }
-
開啟 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'); } }
-
返回專案目錄。
cd hello-world
-
部署您的應用程式。
cdk deploy
-
取得已部署應用程式的 URL:
aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?ExportName==`apiUrl`].OutputValue' --output text
-
調用 API 端點:
curl
<URL_FROM_PREVIOUS_STEP>
成功的話,您將會看到以下回應:
{"message":"hello world"}
-
若要獲取該函數的日誌,請執行 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
-
這是可透過網際網路存取的公有 API 端點。建議您在測試後刪除端點。
cdk destroy
在 Lambda 主控台中檢視記錄
您可以在調用 Lambda 函數之後,使用 Lambda 主控台來檢視日誌輸出。
如果可以從內嵌程式碼編輯器測試您的程式碼,您會在執行結果中找到日誌。使用主控台測試功能以調用函數時,您會在詳細資訊區段找到日誌輸出。
在 CloudWatch 主控台中檢視記錄
您可以使用 Amazon 主 CloudWatch 控台來檢視所有 Lambda 函數叫用的日誌。
在 CloudWatch 主控台上檢視記錄檔
-
在主控台上開啟 [記錄群組] 頁 CloudWatch 面
。 -
為您的函數選擇日誌組(/aws/lambda/
your-function-name
)。 -
選擇日誌串流
每個日誌串流都會對應至函式的執行個體。當您更新 Lambda 函數,以及建立額外執行個體以處理多個並行調用時,便會出現日誌串流。要查找特定調用的日誌,我們建議使用檢測您的函數。 AWS X-Ray X-Ray 會在追蹤內記錄有關請求和日誌串流的詳細資訊。