问题描述
我使用 python Lambda@Edge
部署了一个 serverless
函数,它使用测试功能运行正常:
仅供参考,它设置为查看者请求:
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,它说 503 status code 是:
如果我查看控制台测试,它们仅消耗 ~220 毫秒和 ~75MB,所以我认为我们远低于 viewer request 的 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=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
并搜索相应的日志组。 -
您还可以从
CloudFront
页面导航到相应的日志。转到Monitoring
部分 -> 选择您的Distribution
->View Distribution Metrics
->Lambda@Edge Errors
。当您将鼠标悬停在数据点上时,图表将显示所有区域的错误。知道发生错误的区域后,您可以选择相同的Lambda
函数,最后单击View logs
。请参考下图。 -
看看一些官方示例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 函数。可能需要一些设置开销,但从长远来看可能会派上用场