AWS Lambda@Edge 不记录

AWS Lambda@Edge not logging

我已将查看器请求和原始响应 Lambda 函数部署到 CloudFront 分配,它们正在触发,但未记录到 CloudWatch。我花了相当多的时间研究这个主题,并且 运行 阅读了其他帖子的所有建议,包括:

有趣的是,当我故意将错误编码到一个 Lambda 函数中时,我确实在名为 /aws/cloudfront/LambdaEdge/<cloudfront distribution id> 的组中创建了包含错误日志的日志,但是 console.log 语句没有输出这里。

对于我的生活,我无法弄清楚如何启用将所有请求(包括成功和失败)记录到 CloudWatch,其中包含使用 console.log() 的调试语句。

AWSServiceRoleForCloudFrontLogger 包含一个策略AWSCloudFrontLogger

    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:/aws/cloudfront/*"
        }
    ]
}

编辑:

以下是 AWS 支持建议的 AWS 角色。我可以确认这有效并解决了问题。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        }
    ]
}```

问题很可能是Lambda 没有权限将日志输出到CloudWatch。

你能仔细检查一下 Lambda 函数执行角色权限吗?

相关Link:

说明

所以这里有两种日志,因此你必须在两个不同的地方提供对 CloudWatch 的权限。

  1. 您放入 Lambda 函数中的日志(使用 console.log),因为这些日志将由函数发布到 CloudWatch,函数执行角色应该具有对 CloudWatch 的 permission。无论谁触发 Lambda 函数,都是如此。
  2. 现在 L@E 来了,有时您最终可能会以 not valid as per CloudFront. In these scenarios only ClodFront has the knowledge that you messed up(your Lambda function doesn't know this) and it publishes this knowledge in form of logs to CloudWatch. Now since this is a different entity, it needs it own permissions 的方式修改 request/response 以将日志推送到 CloudWatch(您已通过 AWSServiceRoleForCloudFrontLogger 提供)。