Lambda @ Edge未登录云端请求

for*_*aka 11 amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge

正如文档中所解释的,我为Lambfront触发器设置了Lambda @ edge Viewer Response.

lambda函数代码:

'use strict';

exports.handler = (event, context, callback) => {
    console.log('----EXECUTED------');

    const response = event.Records[0].cf.response;      
    console.log(event.Records[0].cf_response);

    callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)

我已经为Viewer Response事件设置了适当的触发器.

现在,当我通过cloudfront发出请求时,必须将其记录在cloudwatch中,但事实并非如此.
如果我做一个简单的Test Lambda Function(使用Button),它会被正确记录.

这可能是什么问题?

Kan*_*yan 35

当你部署拉姆达@边功能,它被部署到各地区在世界各地与LAMBDA边缘功能的它们的版本副本.

当用户请求最近的pop/edge时,将调用与最近区域相关联lambda.与这些区域关联的Lambda的所有日志都将在其区域云监视日志中.

对于Eg,

如果用户正在击中us-east-1区域,则其关联日志将为us-east-1.

要准确了解您的函数记录的位置(在哪个区域),您可以运行此AWS CLI脚本:

FUNCTION_NAME=function_name_without_qualifiers
for region in $(aws --output text  ec2 describe-regions | cut -f 3) 
do
    for loggroup in $(aws --output text  logs describe-log-groups --log-group-name "/aws/lambda/us-east-1.$FUNCTION_NAME" --region $region --query 'logGroups[].logGroupName')
    do
        echo $region $loggroup
    done
done
Run Code Online (Sandbox Code Playgroud)

您必须使用lambda @ edge的名称替换"function_name_without_qualifiers".链接

希望能帮助到你.

  • 我做了 2 次编辑才能使其今天发挥作用。一种是将 `cut -3` 更改为 `cut -4`,另一种是将硬编码的 us-east-1 从日志组名称中删除。它不是我的日志组名称的一部分。完成所有这些后,我仍然没有收到任何日志。我看到测试运行的日志,但 CloudFront 没有执行任何操作。 (4认同)
  • 就在这上面浪费了一天的时间。谢谢你!!!另一个重要的问题是,您只能在 us-east-1 区域中定义 lambda@edge 函数,但随后可以在任何 cloudfront 发行版上触发它们。 (3认同)
  • 哇,花了半天时间寻找那些日志...只是为了找到这个SO帖子作为第一个Google搜索结果.谢谢! (2认同)

Yev*_*nyk 15

对于那些也搜索过日志但无法使用@Kannaiyan 提供的脚本找到它们的人。

TL; 博士

将此 IAM 角色用于您的 Lambda 函数

{
"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:*:*"
        ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

====

确保您拥有正确的 IAM 角色。如果您先创建了 Lambda,然后将其部署到 Lambda@Edge,则自动生成的 IAM 角色将仅具有将单个区域中的数据记录到以 Lambda 函数命名的日志组中的权限,而使用 Lambda@Edge 意味着它将尝试将不同区域的数据记录到“/aws/lambda/”中。日志组。因此,有必要更改 IAM 角色以允许在不同区域中创建日志组和写入访问权限。在 TL;DR 部分,我提供了示例 IAM 角色,但请确保缩小对生产中特定日志组列表的访问范围

  • 如果您的角色承担 AWSLambdaBasicExecutionRole,您应该获得这些权限。 (2认同)
  • 这就是我的原因。首先创建了一个 lambda 函数(使用控制台),然后将其作为 lambda@edge 添加到 cloudfront,因此它以 us-east-1 作为区域,因此在边缘位置没有创建日志组。 (2认同)

cap*_*ack 9

根据Lambda@Edge 函数的AWS 文档

检查日志文件时,请注意日志文件存储在距离执行函数位置最近的区域中。因此,如果您从伦敦访问网站,则必须更改区域以查看伦敦区域的 CloudWatch 日志。


Nic*_*tts 9

Lambda@Edge 日志以及请求执行的区域可以在 AWS CloudFront 控制台中找到,尽管路径很复杂,而且 AWS 在记录步骤方面做得非常糟糕。

以下是截至本文发布时有效的步骤:

  1. 导航到 AWS CloudFront 控制台。
  2. 单击“遥测”部分下的“监控”链接(不是“日志”,它会显示 CloudFront 日志)。
  3. 单击“Lambda@Edge”选项卡。
  4. 选择您的 Lambda 函数,然后单击“查看指标”按钮。

然后,您可以使用“调用”图来确定在哪个区域执行了 Lambda 函数的特定调用。获得区域后,您终于可以使用“查看函数日志”下拉菜单来查看特定区域的 Lambda 函数日志。

我通过在控制台中研究了很长时间才发现了这一点。此日志记录的“文档”位于此处,但似乎没有解释如何实际查找特定区域的 Lambda@Edge 日志。

如果有人碰巧找到了有关此内容的正确文档,请更新该帖子。