无法让 AWS Lambda 函数将(文本输出)记录到 CloudWatch

Can't get AWS Lambda function to log (text output) to CloudWatch

我正在尝试设置一个 Lambda 函数,该函数将在文件上传到 S3 存储桶时对其进行处理。当我上传文件时,我需要一种方法来查看 console.log 的输出,但我不知道如何将我的 Lambda 函数 link 发送到 CloudWatch。

我通过查看 context 对象了解到我的日志组是 /aws/lambda/wavToMp3,日志流是 2016/05/23/[$LATEST]hex_code_redacted。所以我在 CloudWatch 中创建了该组和流,但没有任何内容记录到其中。

对于创建日志流并将日志发布到cloudwatch的lambda函数,lambda执行角色需要具有以下权限。

{
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                 "logs:CreateLogStream",
                 "logs:PutLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
} 

更多详情请参考以下AWS文档 http://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role

确保您的 lambda 函数中有 "Existing role" 的完整路径 "Configuration":

角色:选择现有角色 现有角色:service-role/yourRoleName

出于某种原因,仅键入 yourRoleName 将适用于某些服务(如 SES),但不适用于 CloudWatch。

此外,您可以尝试创建一个新角色而不是使用现有角色。这将创建具有正确配置的角色(希望如此)。

更新策略后,您似乎必须更新函数的设置以刷新所有作业实例以读取新策略。

因此,如果您在 IAM 中更新角色策略后从 Lambda 控制台单击 'test' 按钮,缓存的 Lambda 实例仍将具有旧角色权限,因此您仍然不会看到任何日志写入 Cloudwatch日志。

只需将超时更改一秒,然后单击 'save and test' 按钮,您将开始在 Cloudwatch 中查看日志。

For the lambda function to create log stream and publish logs to cloudwatch, the lambda execution role needs to have the following permissions

我已经拥有这些权限,但它不起作用。

Just change your timeout by a second and click on 'save and test' button, and you will start to see logs in Cloudwatch.

我更改了超时,保存,但日志仍然无效。

我分配了另一个角色,但日志仍然无效。

最终对我有用的是单击 "Create a custom role",然后单击 "Allow"。就是这样,日志开始生成,但由于我不想使用新角色而是我现有的角色,我只是在之后分配了我现有的角色并且它起作用了。所以从技术上讲,我应该回到原来的配置,它不起作用,但现在可以了。去图吧。

可能有点晚了,但对于那些仍然难以在 cloudwatch 中看到 lambda 日志的人来说。关于 lambda 函数的执行角色,我注意到了这一点:"You may use an existing role with this function. Note that the role must be assumable by Lambda and must have Cloudwatch Logs permissions." 所以在 IAM 中,我将“CloudWatchLogsFullAccess”授予了我分配给我的函数的角色。然后在 cloudwatch 的日志下,您将看到分配了该角色的函数的日志。

问题是我试图通过以下方式在 Cloudformation 脚本中创建一个日志组: AWS::Logs::LogGroup 然后尝试将 Lambda 日志推送到此日志组。 :P 新手 仔细阅读后,我发现 Lambda 使用上述格式创建自己的日志: /aws/lambda/ 我们只需要为这个日志组提供策略权限,或者只是一个通用的资源权限: arn:aws:logs:::*

希望这对您有所帮助

显然,发生日志记录的另一个必要条件是 Lambda 函数必须指示完成;例如在 Python 上下文中,处理程序必须 return 除了 None.

正如其他答案所述,您需要授予 lambda 权限以将 post 日志记录到云监视日志。 AWS 专门为此提供了 AWSLambdaExecute 政策。它的 json 是 -

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

您可以在分配给您的 lambda 的角色中添加此策略,您应该会开始看到日志。

注意:它还具有 S3 read/write 访问权限。如果您不想要它,您可以创建一个仅包含日志部分的自定义策略。

它可能已经记录了,我们只是找不到我们期望的日志...

例如

app.use(function simpleLogger (req, res, next) {
  console.info('[Logger]', req.method, req.originalUrl)
  next()
})

执行后GET /hello?world=1,

本地控制台:(简单明了,不错!)

[Logger] GET /hello?world=1

CloudWatch Logs:(您能轻松找到下面的确切日志吗?)

START RequestId: a3552c34-f7a6-11e8-90ba-2fb886f31fb0 Version: $LATEST
2018-12-04T09:26:11.236Z  a3552c34-f7a6-11e8-90ba-2fb886f31fb0  [Logger] GET /hello?world=1
END RequestId: a3552c34-f7a6-11e8-90ba-2fb886f31fb0
REPORT RequestId: a3552c34-f7a6-11e8-90ba-2fb886f31fb0  Duration: 41.02 ms  Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 29 MB

结论:过于冗长,无法找到原始日志。

我遇到了这个问题,但上面 none 的答案解决了我的问题。事实证明,当我第一次启动 CloudWatch 时,该区域以某种方式设置为俄亥俄州。我把它改成美国东部(弗吉尼亚北部)后,一切正常。

CloudWatchCloudWatch Logs 是不同的权限,您需要将 CloudWatch Logs 添加到与您的角色相关的策略中。

有一篇名为 How to Monitor AWS Lambda with CloudWatch 的文章,其中有一节关于 "How to Use CloudWatch Logs with Lambda"。看起来您已经找到了答案,但对于没有 IAM 特定问题的任何人,这可能会有所帮助。

您可能希望将 上次摄取时间 列添加到日志输出中。我的所有活动都需要几分钟才能完成。

虽然这个问题已经得到解答,但我只是想补充我的经验,这可能对其他人有用。

即使适当地设置了权限以便lambda 可以登录cloudwatch,有时需要3-4 小时才能反映日志组。

在我的例子中,当使用 lambda 处理 DynamoDB 事件时,lambda 被授予了 cloudwatch 和 DynamoDB 所需的所有权限。反映日志花了 4 个小时。 可能是 AWS 端的一些同步问题。 4 小时后我没有采取任何行动,我能够看到 Cloudwatch 日志。

还要确保您在创建函数的同一区域搜索日志。

2020 年 7 月更新!!

日志可能不在us-east-1,尝试在不同地区寻找lambda边缘日志!!

在我的例子中,问题是为角色设置的权限边界。

尽管角色策略允许 logs:PutLogEvents,但角色上设置的权限边界不允许对日志组执行此操作。