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

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

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

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

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

架構和事件結構

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

  • AWS Lambda - 執行函數程式碼、將日誌傳送至 CloudWatch Logs,以及將追蹤資料傳送至 X-Ray。

  • Amazon CloudWatch Logs - 收集日誌,以及在日誌項目符合篩選模式時叫用函數。

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

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

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

應用程式中的 Lambda 函數會隨機產生錯誤。當 CloudWatch Logs 在函數的日誌中偵測到 ERROR 這個詞語時,它會將事件傳送至處理器函數進行處理。

範例 CloudWatch Logs 訊息事件

{ "awslogs": { "data": "H4sIAAAAAAAAAHWQT0/DMAzFv0vEkbLYcdJkt4qVXmCDteIAm1DbZKjS+kdpB0Jo350MhsQFyVLsZ+unl/fJWjeO5asrPgbH5..." } }

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

範例 已解碼的 CloudWatch Logs 事件資料

{ "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 Logs 事件中取得請求 ID,並使用 AWS SDK for JavaScript 來搜尋該請求的 X-Ray。它會使用 AWS 開發套件用戶端 (透過 X-Ray 開發套件進行檢測) 來下載追蹤和日誌串流。並將其存放在輸出儲存貯體中。X-Ray SDK 會記錄這些呼叫,並且它們在追蹤中顯示為子區段。

AWS CloudFormation 範本和其他資源

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

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

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

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

  • CloudWatch Logs 訂閱 - 日誌串流的訂閱,可在記錄 ERROR 這個字時觸發處理器函數。

  • 以資源為基礎的政策 - 處理器函數的許可陳述,可讓 CloudWatch Logs 叫用它。

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

請查看 GitHub 上的應用程式範本

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

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