適用於 AWS Lambda 的錯誤處理器範例應用程式 - AWS Lambda

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

適用於 AWS Lambda 的錯誤處理器範例應用程式

錯誤處理器範例應用程式示範AWS Lambda如何處理來自 Amazon CloudWatch Logs 訂閱的事件。 CloudWatch 記錄可讓您在記錄項目符合模式時叫用 Lambda 函數。此應用程式中的訂閱可監控函數日誌群組中包含 ERROR 這個字的項目。它會調用處理器 Lambda 函數來回應。此處理器函數會針對造成錯誤的請求擷取完整日誌串流和追蹤資料,並加以儲存供日後使用。

函數程式碼可在下列檔案中取得:

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

架構和事件結構

範例應用程式會使用下列 AWS 服務:

  • AWS Lambda— 運行函數代碼,將日誌發送到 CloudWatch 日誌,並將跟踪數據發送到 X-Ray。

  • Amazon CloudWatch 日誌 — 收集日誌,並在日誌項目與篩選器模式匹配時調用函數。

  • AWS X-Ray - 收集追蹤資料、編製追蹤索引以供搜尋,以及產生服務映射。

  • Amazon Simple Storage Service (Amazon S3) — 存放部署成品和應用程式輸出。

每項服務均需收取標準費用。

應用程式中的 Lambda 函數會隨機產生錯誤。當 CloudWatch Logs 檢測到函數日誌ERROR中的單詞時,它會將事件發送到處理器函數進行處理。

範例 CloudWatch 記錄訊息事件
{ "awslogs": { "data": "H4sIAAAAAAAAAHWQT0/DMAzFv0vEkbLYcdJkt4qVXmCDteIAm1DbZKjS+kdpB0Jo350MhsQFyVLsZ+unl/fJWjeO5asrPgbH5..." } }

若資料已解碼,會包含日誌事件的詳細資訊。此函數會使用這些資料來識別日誌串流,以及剖析日誌訊息來取得造成錯誤的請求 ID。

範例 解碼的 CloudWatch 記錄檔事件資料
{ "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "/aws/lambda/lambda-error-processor-randomerror-1GD4SSDNACNP4", "logStream": "2019/04/04/[$LATEST]63311769a9d742f19cedf8d2e38995b9", "subscriptionFilters": [ "lambda-error-processor-subscription-15OPDVQ59CG07" ], "logEvents": [ { "id": "34664632210239891980253245280462376874059932423703429141", "timestamp": 1554415868243, "message": "2019-04-04T22:11:08.243Z\t1d2c1444-efd1-43ec-b16e-8fb2d37508b8\tERROR\n" } ] }

處理器函數會使用 CloudWatch Logs 事件中的資訊,針對造成錯誤的要求下載完整記錄資料流和 X-Ray 追蹤。並將這兩項資料存放在 Amazon S3 儲存貯體中。為了讓日誌串流和追蹤時間得以完成,此函數會先等候一小段時間,再存取資料。

使用 AWS X-Ray 檢測

應用程式會使用 AWS X-Ray 來追蹤函數調用以及函數對 AWS 服務進行的呼叫。X-Ray 會使用它從函數接收的追蹤資料來建立服務映射,以協助您找出錯誤。

範本中會設定兩個 Node.js 函數來進行有效追蹤,並在程式碼中透過 適用於 Node.js 的 AWS X-Ray SDK 檢測。透過有效追蹤,Lambda 標籤會將追蹤標頭新增到傳入請求,並將具有計時詳細資訊的追蹤傳送到 X-Ray。此外,隨機錯誤函數使用 X-Ray 開發套件在註釋中記錄請求 ID 和使用者資訊。註釋會附加在追蹤中,您可以用來找出特定請求的追蹤。

處理器函數會從 CloudWatch 記錄事件取得要求識別碼,並使用搜尋 X-Ray AWS SDK for JavaScript 以尋找該要求。它會使用 AWS 開發套件用戶端 (透過 X-Ray 開發套件進行檢測) 來下載追蹤和日誌串流。並將其存放在輸出儲存貯體中。X-Ray SDK 會記錄這些呼叫,並且它們在追蹤中顯示為子區段。

AWS CloudFormation 範本和其他資源

應用程式以兩個 Node.js 模組實作,並使用 AWS CloudFormation 範本和 Shell 指令碼部署。此範本會建立處理器函數、隨機錯誤函數,以及下列支援資源。

  • 執行角色 - IAM 角色,可授予函數存取其他 AWS 服務的許可。

  • 初階函數 - 額外的函數,可調用隨機錯誤函數來建立一個日誌群組。

  • 自訂資源 - AWS CloudFormation 自訂資源會在部署期間調用初階函數以確保日誌群組存在。

  • CloudWatch 記錄訂閱 — 記錄 ERROR 一詞時觸發處理器功能的記錄資料流的訂閱。

  • 以資源為基礎的原則 — 處理器函數的權限陳述式,可讓 CloudWatch Logs 呼叫它。

  • Amazon S3 儲存貯體 - 處理器函數輸出的儲存位置。

檢視上的應用程式範本 GitHub。

為了解決 Lambda 與 AWS CloudFormation 整合的限制,此範本會建立可在部署期間執行的額外函數。所有 Lambda 函數都附帶一個 CloudWatch 記錄日誌群組,用於儲存函數執行的輸出。不過,第一次調用函數後才會建立日誌群組。

為了建立訂閱 (這取決於日誌群組是否存在),應用程式會使用第三個 Lambda 函數來調用隨機錯誤函數。範本包含內嵌初階函式的程式碼。AWS CloudFormation 自訂資源會在部署期間調用它。DependsOn 屬性可確保在訂閱之前,建立日誌串流和以資源為基礎的政策。