設定 CloudWatch 日誌群組 - AWS Lambda

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

設定 CloudWatch 日誌群組

根據預設,CloudWatch 會在第一次調用時自動為您的函數建立名為 /aws/lambda/<function name> 的日誌群組。若要將函數設定為將日誌傳送到現有的日誌群組,或為您的函數建立新的日誌群組,您可以使用 Lambda 主控台或 AWS CLI. 您也可以使用 CreateFunctionUpdateFunctionConfiguration Lambda API 命令和 AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function 資源來設定自訂日誌群組。

您可以設定多個 Lambda 函數,將日誌傳送至同一個 CloudWatch 日誌群組。例如,您可以使用單一日誌群組來儲存組成特定應用程式之所有 Lambda 函數的記錄。當您針對 Lambda 函數使用自訂日誌群組時,Lambda 建立的日誌串流會包含函數名稱和函數版本。如此可確保日誌訊息和函數之間的映射會被保留,即使您對多個函數使用相同的日誌群組也是如此。

自訂日誌群組的日誌串流命名格式遵循下列慣例:

YYYY/MM/DD/<function_name>[<function_version>][<execution_environment_GUID>]

請注意,設定自訂日誌群組時,您為日誌群組選取的名稱必須遵循 CloudWatch Logs 命名規則。此外,自訂日誌群組名稱不得以字串 aws/ 開頭。如果您以 aws/ 開頭建立自訂日誌群組,Lambda 將無法建立日誌群組。因此,您的函數的日誌將不會傳送到 CloudWatch。

若要變更函數的日誌群組 (主控台)
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 在函數組態頁面上,選擇監視和操作工具

  4. 日誌組態窗格中,選擇編輯

  5. 日誌群組窗格中,對於 CloudWatch 日誌群組,選擇自訂

  6. 自訂日誌群組之下,輸入要將函數傳送日誌前往的 CloudWatch 日誌群組的名稱。如果您輸入現有日誌群組的名稱,則您的函數將使用該群組。如果沒有具有您輸入名稱的日誌群組,則 Lambda 會以該名稱為您的函數建立新的日誌群組。

若要變更函數的日誌群組 (AWS CLI)
  • 若要變更現有函數的日誌群組,請使用 update-function-configuration 命令。

    aws lambda update-function-configuration \ --function-name myFunction \ --logging-config LogGroup=myLogGroup
若要在建立函數 (AWS CLI) 時指定自訂日誌群組
  • 若要在使用 建立新的 Lambda 函數時指定自訂日誌群組 AWS CLI,請使用 --logging-config選項。下列範例命令會建立 Node.js Lambda 函數,該函數會將日誌檔傳送至名為 myLogGroup 的日誌群組。

    aws lambda create-function \ --function-name myFunction \ --runtime nodejs24.x \ --handler index.handler \ --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole \ --logging-config LogGroup=myLogGroup

執行角色許可

為了讓您的函數將日誌傳送到 CloudWatch Logs,其必須具有 logs:PutLogEvents 許可。在您透過 Lambda 主控台設定函式的日誌群組時,Lambda 會在下列條件下將此許可新增至角色:

  • 服務目的地設定為 CloudWatch Logs

  • 函式的執行角色缺少將日誌上傳至 CloudWatch Logs (預設目的地) 的許可

注意

Lambda 不會針對 Amazon S3 或 Firehose 日誌目的地新增任何 Put 許可。

當 Lambda 新增此許可時,它會授予將日誌傳送至任何 CloudWatch Logs 日誌群組的函數許可。

若要防止 Lambda 自動更新函數的執行角色並改為手動編輯,請展開許可,然後取消勾選新增所需許可

當您使用 設定函數的日誌群組時 AWS CLI,Lambda 不會自動新增logs:PutLogEvents許可。如果函數的執行角色尚不具備許可,請將其新增至函數的執行角色。這些許可包含在 AWSLambdaBasicExecutionRole 受管政策中。

Lambda 受管執行個體的 CloudWatch 記錄

使用 Lambda 受管執行個體時,將日誌傳送至 CloudWatch Logs 還有其他考量:

VPC 聯網需求

Lambda 受管執行個體會在 VPC 中客戶擁有的 EC2 執行個體上執行。若要將日誌傳送至 CloudWatch Logs,並將追蹤傳送至 X-Ray,您必須確保這些 AWS APIs 可從 VPC 路由。您有多種選擇:

  • AWS PrivateLink (建議):使用 AWS PrivateLink 為 CloudWatch Logs 和 X-Ray 服務建立 VPC 端點。這可讓您的執行個體私密存取這些服務,而不需要網際網路閘道或 NAT 閘道。如需詳細資訊,請參閱搭配介面 VPC 端點使用 CloudWatch Logs

  • NAT 閘道:設定 NAT 閘道以允許從私有子網路進行傳出網際網路存取。

  • 網際網路閘道:對於公有子網路,請確定您的 VPC 已設定網際網路閘道。

如果 CloudWatch Logs 或 X-Ray APIs 無法從您的 VPC 路由,您的函數日誌和追蹤將不會交付。

並行調用和日誌歸因

Lambda 受管執行個體執行環境可以同時處理多個調用。當多個調用同時執行時,其日誌項目會交錯在相同的日誌串流中。若要有效篩選和分析來自並行調用的日誌,您應該確保每個日誌項目都包含 AWS 請求 ID。

我們建議採用下列其中一種方法:

  • 使用預設 Lambda 執行期記錄器 (建議):Lambda 受管執行期提供的預設記錄程式庫會自動在每個日誌項目中包含請求 ID。

  • 實作結構化 JSON 記錄:如果您要建置自訂執行時間或需要自訂記錄,請實作 JSON 格式的日誌,其中包含每個項目中的請求 ID。Lambda 受管執行個體僅支援 JSON 日誌格式。在 JSON 日誌中包含 requestId 欄位,以透過調用啟用篩選:

    { "timestamp": "2025-01-15T10:30:00.000Z", "level": "INFO", "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "message": "Processing request" }

透過請求 ID 屬性,您可以使用 CloudWatch Logs Insights 查詢來篩選特定調用的 CloudWatch Logs 日誌項目。例如:

fields @timestamp, @message | filter requestId = "a1b2c3d4-e5f6-7890-abcd-ef1234567890" | sort @timestamp asc

如需 Lambda 受管執行個體記錄需求的詳細資訊,請參閱 了解 Lambda 受管執行個體執行環境