

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

# 的記錄和指標 AWS Lambda
<a name="lambda-logging-metrics"></a>

[ Lambda ](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)不需要為工作負載管理和監控伺服器，並自動使用 CloudWatch Metrics 和 CloudWatch Logs，而無需進一步設定或檢測應用程式的程式碼。本節可協助您了解 Lambda 所用系統的效能特性，以及您的組態選擇如何影響效能。它還可協助您記錄和監控 Lambda 函數，以最佳化效能並診斷應用程式層級的問題。

## Lambda 函數記錄
<a name="lambda-function-logging"></a>

Lambda 會自動將標準輸出和標準錯誤訊息從 Lambda 函數串流至 CloudWatch Logs，而不需要記錄驅動程式。Lambda 也會自動佈建容器來執行 Lambda 函數，並將它們設定為在個別日誌串流中輸出日誌訊息。

Lambda 函數的後續調用可以重複使用相同的容器和輸出至相同的日誌串流。Lambda 也可以佈建新的容器，並將調用輸出到新的日誌串流。

第一次叫用 Lambda 函數時，Lambda 會自動建立日誌群組。Lambda 函數可以有多個版本，您可以選擇要執行的版本。Lambda 函數調用的所有日誌都會存放在相同的日誌群組中。名稱無法變更，且格式為 `/aws/lambda/<YourLambdaFunctionName>` 。每個 Lambda 函數執行個體的日誌群組中都會建立個別的日誌串流。Lambda 具有使用 `YYYY/MM/DD/[<FunctionVersion>]<InstanceId>` 格式之日誌串流的標準命名慣例。由 `InstanceId`產生 AWS 以識別 Lambda 函數執行個體。

我們建議您將日誌訊息格式化為 JSON 格式，因為您可以使用 CloudWatch Logs Insights 更輕鬆地進行查詢。它們也可以更輕鬆地篩選和匯出。您可以使用記錄程式庫來簡化此程序或撰寫您自己的日誌處理函數。我們建議您使用日誌程式庫來協助格式化和分類日誌訊息。例如，如果您的 Lambda 函數是以 Python 撰寫，您可以使用 [Python 記錄模組](https://docs.python.org/3/library/logging.html)來記錄訊息並控制輸出格式。Lambda 原生使用 Python 日誌程式庫處理以 Python 撰寫的 Lambda 函數，而且您可以在 Lambda 函數中擷取和自訂記錄器。 AWS Labs 已建立[AWS Lambda 適用於 Python 開發人員的 Powertools](https://docs.powertools.aws.dev/lambda/python/2.13.0/) 工具組，讓您更輕鬆地使用冷啟動等金鑰資料來豐富日誌訊息。此工具組適用於 Python、Java、Typescript 和 .NET。

另一個最佳實務是使用 變數來設定日誌輸出層級，並根據環境和您的需求進行調整。除了使用的程式庫之外，Lambda 函數的程式碼可能會根據日誌輸出層級輸出大量日誌資料。這可能會影響您的記錄成本並影響效能。

Lambda 可讓您為 Lambda 函數執行期環境設定環境變數，而無需更新程式碼。例如，您可以建立`LAMBDA_LOG_LEVEL`環境變數，定義可從程式碼擷取的日誌輸出層級。下列範例會嘗試擷取`LAMBDA_LOG_LEVEL`環境變數，並使用 值來定義記錄輸出。如果未設定環境變數，則會預設為 `INFO`層級。

```
import logging
from os import getenv

logger = logging.getLogger()
log_level = getenv("LAMBDA_LOG_LEVEL", "INFO")
level = logging.getLevelName(log_level)
logger.setLevel(level)
```

## 從 CloudWatch 將日誌傳送至其他目的地
<a name="send-logs-other-destinations"></a>

您可以使用訂閱篩選條件將日誌傳送至其他目的地 （例如 Amazon OpenSearch Service 或 Lambda 函數）。如果您不使用 Amazon OpenSearch Service，您可以使用 Lambda 函數來處理日誌，並使用 AWS SDKs 將其傳送到您選擇的 AWS 服務。

您也可以在 Lambda 函數中使用適用於 AWS 雲端外部日誌目的地SDKs，將日誌陳述式直接傳送到您選擇的目的地。如果您選擇此選項，建議您考慮延遲的影響、額外的處理時間、錯誤和重試處理，以及操作邏輯與 Lambda 函數的耦合。

## Lambda 函數指標
<a name="lambda-function-metrics"></a>

Lambda 可讓您在不管理或擴展伺服器的情況下執行程式碼，這幾乎消除了系統層級稽核和診斷的負擔。不過，了解 Lambda 函數系統層級的效能和調用指標仍然很重要。這可協助您最佳化資源組態並改善程式碼效能。透過適當調整 Lambda 函數的大小，有效監控和測量效能可以改善使用者體驗並降低成本。一般而言，做為 Lambda 函數執行的工作負載也具有需要擷取和分析的應用程式層級指標。Lambda 直接支援內嵌指標格式，讓擷取應用程式層級 CloudWatch 指標變得更輕鬆。

## 系統層級指標
<a name="system-metrics-lambda"></a>

Lambda 會自動與 CloudWatch 指標整合，並為 [Lambda 函數提供一組標準指標](https://docs.aws.amazon.com//lambda/latest/dg/monitoring-metrics.html)。Lambda 也為具有這些指標的每個 Lambda 函數提供單獨的監控儀表板。您需要監控的兩個重要指標是錯誤和叫用錯誤。了解調用錯誤和其他錯誤類型之間的差異，可協助您診斷和支援 Lambda 部署。

[叫用錯誤](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)會導致 Lambda 函數無法執行。這些錯誤發生在程式碼執行之前，因此您無法在程式碼中實作錯誤處理來識別它們。反之，您應該為 Lambda 函數設定警示，以偵測這些錯誤並通知操作和工作負載擁有者。這些錯誤通常與組態或許可錯誤有關，並可能因組態或許可的變更而發生。調用錯誤可能會啟動重試，這會導致您的函數多次調用。

成功呼叫的 Lambda 函數會傳回 HTTP 200 回應，即使該函數擲回例外狀況。您的 Lambda 函數應實作錯誤處理並引發例外狀況，讓`Errors`指標擷取並識別 Lambda 函數的失敗執行。您應該從 Lambda 函數叫用傳回格式化的回應，其中包含判斷執行是否完全失敗、部分失敗或成功的資訊。

CloudWatch 提供 [CloudWatch Lambda Insights](https://docs.aws.amazon.com//lambda/latest/dg/monitoring-insights.html)，您可以啟用個別 Lambda 函數。Lambda Insights 會收集、彙總和摘要系統層級指標 （例如 CPU 時間、記憶體、磁碟和網路使用量）。Lambda Insights 也會收集、彙總和摘要診斷資訊 （例如冷啟動和 Lambda 工作者關機），以協助您隔離並快速解決問題。

Lambda Insights 使用內嵌指標格式，根據 Lambda 函數的名稱，使用`/aws/lambda-insights/`日誌串流名稱字首自動將效能資訊傳送到日誌群組。這些效能日誌事件會建立 CloudWatch 指標，這是自動 CloudWatch 儀表板的基礎。我們建議您為效能測試和生產環境啟用 Lambda Insights。Lambda Insights 建立的其他指標包括`memory_utilization`有助於正確調整 Lambda 函數大小，讓您避免支付不必要的容量。

## 應用程式指標
<a name="application-metrics-lambda"></a>

您也可以使用內嵌指標格式，在 CloudWatch 中建立和擷取自己的應用程式指標。您可以利用[AWS 提供的內嵌指標格式程式庫](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html)，建立內嵌指標格式陳述式並將其發出至 CloudWatch。整合的 Lambda CloudWatch 記錄設施已設定為處理和擷取適當格式的內嵌指標格式陳述式。