无服务器 AWS Lambda@Edge:如何调试

Serverless AWS Lambda@Edge: How to debug

我用 serverless 部署了一个 python Lambda@Edge 函数,使用测试功能工作正常:

仅供参考,它设置为 viewer-request:

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

如果我转到 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 debug guide it says that 503 status code 是:

如果我查看控制台测试,它们 仅消耗 ~220ms 和 ~75MB 所以我认为我们 远远低于 5 秒/128MB viewer request

的限制

如果我查看 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    -   -

问题 2:有没有办法增加 CloudFront 日志的详细程度(我找不到)?

问题 3:如果我无法在 CloudWatch 中获取我的 CloudFront Lambda@Edge 调用(Q1=否)并且我无法增加 CloudFront 日志的详细程度(Q2=否),我该如何做进一步调试?

您尝试过 AWS X 射线吗? https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html

这是一个分布式跟踪实用程序,可让您调试 lambda 函数。可能需要一些设置开销,但从长远来看 运行 可能会派上用场

这里有几个关键的考虑因素。

首先,重要的是要注意边缘函数的工作原理。

部署后,您的边缘函数将在所有 AWS 区域复制。

当收到 Cloudfront 请求时,它会被路由到离用户位置最近的可用区域。

因此,该函数在离调用者最近的区域而不是初始部署区域中执行其日志。

有时这可能有点违反直觉。可能总部设在英格兰,但更靠近爱尔兰地区。

接下来,您的 lambda 函数可能没有登录 Cloudfront 所需的权限。

使用 Cloudfront 日志时,您需要明确授予函数日志记录权限。

考虑以下 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:*:*"
        ]
    }
  ]
}

此角色启用创建日志组、日志流并将事件放入 Cloudfront 和 Cloudwatch 日志的功能。

注意通配符,这是因为在部署到边缘时,您需要使用 arn arn:aws:logs:*:*:log-group:/aws/cloudfront/*.

提供 Cloudfront specific permission
  • Lambda@Edge 函数必须部署到 us-east-1 区域。

  • x-amz-cf-pop header 给出了有关请求执行位置的提示。可以参考这个非官方列表here.

  • us-east-1 的日志可以在组 /aws/lambda/<Your-function-name> 下的 CloudWatch 中找到。对于任何其他区域,日志组将为 /aws/lambda/us-east-1.<Your-function-name>。如果您知道该地区,那么 select 相应的地区。转到 CloudWatch 并搜索相应的日志组。

  • 您还可以从 CloudFront 页面导航到相应的日志。转到 Monitoring 部分 -> 选择你的 Distribution -> View Distribution Metrics -> Lambda@Edge Errors。当您将鼠标悬停在数据点上时,图表将显示所有区域的错误。一旦知道发生错误的区域,您可以 select 相同,然后是 Lambda 功能,最后单击 View logs。请参考下图。

  • 看看官方的一些例子here。对于 viewer-request 事件,操纵 request 的事件是相关的。

  • 可以在 /aws/cloudfront/LambdaEdge/<YourDistributionId>

    访问 CloudFront 日志

希望这能帮助您继续前进。