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

问题描述

我使用 python Lambda@Edge 部署了一个 serverless 函数,它使用测试功能运行正常

enter image description here

仅供参考,它设置为查看者请求

enter image description here

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

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

enter image description here

现在,当我使用 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,它说 503 status code 是:

  • 执行次数过多(不是我的情况,该云前端的流量为 0,这纯粹是测试)
  • 函数超出了 Lambda 函数超时配额

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

enter image description here

如果我看一下 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=no)并且我无法增加 CloudFront 日志的详细程度(Q2=no),我该如何进一步调试?

解决方法

  • Lambda@Edge 函数必须部署到 us-east-1 区域。

  • x-amz-cf-pop 标头提供了有关执行请求的位置的提示。你可以参考这个非官方列表here

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

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

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

  • 可以在 CloudFront

    访问 /aws/cloudfront/LambdaEdge/<YourDistributionId> 日志

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

,

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

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

部署后,您的边缘功能将在所有 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

,

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

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