无服务器 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 是:
- 执行次数太多(不是我的情况,那个云端的流量为 0,纯粹是测试)
- 函数超出了 Lambda 函数超时配额
如果我查看控制台测试,它们 仅消耗 ~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
日志
希望这能帮助您继续前进。
我用 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 是:
- 执行次数太多(不是我的情况,那个云端的流量为 0,纯粹是测试)
- 函数超出了 Lambda 函数超时配额
如果我查看控制台测试,它们 仅消耗 ~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/*
.
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
日志
希望这能帮助您继续前进。