簡體   English   中英

無服務器 AWS Lambda@Edge:如何調試

[英]Serverless AWS Lambda@Edge: How to debug

我有一個python Lambda@Edge function 部署了serverless使用測試功能可以正常工作

在此處輸入圖像描述

僅供參考,它設置為查看器請求

在此處輸入圖像描述

functions:
  cfLambda:
    handler: handler.lambda_handler
    events:
      - cloudFront:
          eventType: viewer-request

如果我 go 到CloudWatch ,我可以看到日志:

在此處輸入圖像描述

現在,當我使用cURL進行測試時,它以503失敗

HTTP/2 503 
content-type: text/html
content-length: 1019
server: CloudFront
date: Mon, 05 Apr 2021 07:24:45 GMT
x-cache: LambdaExecutionError from cloudfront
via: 1.1 XXXXXXXXXXXXXXXXXX.cloudfront.net (CloudFront)
x-amz-cf-pop: AMS50-C1
x-amz-cf-id: 4vYpBnOGd6yfgowoSpiCyBkh5cbV1g3IJf1H2Eheln89MpEnScL-1g==

但是這次我在 CloudWatch 中沒有任何日志。 問題 1:如何在 CloudWatch 中顯示我的 Lambda@Edge CloudFront 調用跟蹤?

如果我閱讀Lambda@Edge 調試指南,它會說503 狀態代碼是:

  • 執行次數過多(不是我的情況,該雲端的流量為 0,純粹是測試)
  • function 超出了 Lambda function 超時配額

如果我查看控制台測試,它們僅消耗 ~220ms 和 ~75MB ,所以我認為我們遠低於查看器請求的 5 秒 / 128MB 限制

在此處輸入圖像描述

如果我查看CloudFront logs ,它們似乎沒用,因為它們只是確認 503:

E2HX7F6YEZN897.2021-04-04-16.a77a21e1:2021-04-04    16:34:12    SEA19-C3    389 35.247.33.169   HEAD    XXXXXXXX.cloudfront.net /   503 -   Mozilla/5.0%20(Windows%20NT%205.1)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/41.0.2224.3%20Safari/537.36  -   -   LambdaExecutionError    AcM5SX3ggB53fmjXO83xND_Lw3-eHXd8dlIZGEO53XaDMjuctRw==   example.org https   223 0.021   -   TLSv1.3 TLS_AES_128_GCM_SHA256  LambdaExecutionError    HTTP/1.1    -   -   51810   0.021   LambdaExecutionError    text/html   1019    -   -

Q2:有沒有辦法增加 CloudFront 日志的詳細程度(我找不到)?

Q3:如果我無法在 CloudWatch 中獲得 CloudFront Lambda@Edge 調用(Q1=否)並且我無法增加 CloudFront 日志的詳細程度(Q2=否),我該如何進一步調試?

  • Lambda@Edge function 必須部署到us-east-1區域。

  • x-amz-cf-pop header 提示了請求的執行位置。 您可以在此處參考此非官方列表。

  • 對於us-east-1 ,可以在CloudWatch中的/aws/lambda/<Your-function-name>組下找到日志。 對於任何其他區域,日志組將為/aws/lambda/us-east-1.<Your-function-name> 如果您知道區域,那么 select 是相應的區域。 Go 到CloudWatch並搜索相應的日志組。 在此處輸入圖像描述

  • 您還可以從CloudFront頁面導航到相應的日志。 Go 到Monitoring部分 -> Choose your Distribution -> View Distribution Metrics -> Lambda@Edge Errors 當您在數據點上進行 hover 時,該圖表將顯示所有區域的錯誤。 一旦您知道發生錯誤的區域,您可以 select 相同,然后是Lambda function 最后單擊View logs 請參考下圖。 在此處輸入圖像描述

  • 看看這里的一些官方例子。 對於viewer-request事件,操縱request的事件是相關的。

  • CloudFront日志可通過/aws/cloudfront/LambdaEdge/<YourDistributionId>訪問

希望這可以幫助您進一步進行。

這里有幾個關鍵的考慮因素。

首先,重要的是要注意邊緣函數是如何工作的。

部署后,您的邊緣 function 將在所有 AWS 區域中復制。

當 Cloudfront 請求進入時,它會被路由到離用戶位置最近的可用區域。

因此,function 在距離調用者最近的區域而不是初始部署區域中執行其日志。

有時這可能有點違反直覺。 總部可能設在英格蘭,但例如更靠近愛爾蘭地區。

接下來,您的 lambda 函數可能沒有登錄到 Cloudfront 所需的權限。

使用 Cloudfront 日志時,您需要明確授予 function 日志記錄權限。

考慮以下 IAM 角色:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "logs:CreateLogGroup",
        "Resource": "arn:aws:logs:*:*:*"
    },
    {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": [
            "arn:aws:logs:*:*:log-group:*:*"
        ]
    }
  ]
}

此角色使 function 能夠創建日志組、日志流並將事件放入 Cloudfront 和 Cloudwatch 的日志中。

注意通配符,這是因為在部署到邊緣時,您需要使用 arn arn:aws:logs:*:*:log-group:/aws/cloudfront/*提供Cloudfront 特定權限

您是否嘗試過 AWS X 射線? https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html

它是一個分布式跟蹤工具,可讓您調試 lambda 函數。 可能需要一些設置開銷,但從長遠來看可能會派上用場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM