Amazon web services Can';t获取AWS Lambda函数以记录(文本输出)到CloudWatch

Amazon web services Can';t获取AWS Lambda函数以记录(文本输出)到CloudWatch,amazon-web-services,aws-lambda,amazon-cloudwatch,Amazon Web Services,Aws Lambda,Amazon Cloudwatch,我正在尝试设置一个Lambda函数,当文件上传到S3存储桶时,该函数将处理该文件。当我上传文件时,我需要一种查看console.log输出的方法,但我不知道如何将Lambda函数链接到CloudWatch 通过查看上下文对象,我发现我的日志组是/aws/lambda/wavToMp3,日志流是2016/05/23/[$LATEST]hex\u-code\u-redated。因此,我在CloudWatch中创建了该组和流,但没有记录任何内容。对于lambda函数创建日志流并将日志发布到CloudW

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


通过查看
上下文
对象,我发现我的日志组是
/aws/lambda/wavToMp3
,日志流是
2016/05/23/[$LATEST]hex\u-code\u-redated
。因此,我在CloudWatch中创建了该组和流,但没有记录任何内容。

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

{
“声明”:[
{
“行动”:[
“日志:CreateLogGroup”,
“日志:CreateLogStream”,
“日志:PutLogEvents”
],
“效果”:“允许”,
“资源”:“arn:aws:logs:**”
}
]
} 
有关更多详细信息,请参阅以下AWS文档

确保您在lambda函数“配置”中拥有“现有角色”的完整路径:

角色:选择现有角色 现有角色:服务角色/yourRoleName

出于某种原因,只输入yourlonename将适用于某些服务(如SES),但不适用于CloudWatch


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

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

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

只需将超时时间更改一秒钟,然后单击“保存并测试”按钮,您将开始在Cloudwatch中看到日志


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

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

只需将超时更改一秒钟,然后单击“保存并测试”按钮,您将开始在Cloudwatch中看到日志

我更改了超时时间,保存了日志,但日志仍然无法工作

我分配了另一个角色,但日志仍然不起作用


最终对我有效的是单击“创建自定义角色”,然后单击“允许”。就是这样,开始生成日志,但因为我不想使用新角色,而是我现有的角色,所以我只是在之后分配了我现有的角色,它就工作了。所以从技术上讲,我应该回到原来的配置,它不工作,但现在它的工作。想想看。

可能有点晚了,但对于那些仍在努力在cloudwatch中查看lambda日志的人来说。我注意到关于lambda函数的执行角色的这一点:“您可以将现有角色用于此函数。请注意,该角色必须可由lambda分配,并且必须具有Cloudwatch日志权限。”因此,在IAM中,我向分配给我的函数的角色授予了“Cloudwatch LogsFullAccess”。然后在cloudwatch中的“日志”下,您将看到分配给此角色的功能的日志。

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


希望这有帮助

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

之外的其他内容,因为其他答案表明您需要授予lambda将日志发布到云监视日志的权限。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读/写访问权限。如果您不需要它,您可以仅使用日志部分创建一个自定义策略。

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

例如 执行
GET/hello?world=1

本地控制台:(简单明了,很好!)

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


结论:太冗长,无法找到原始日志。我遇到了这个问题,但上面的答案都没有解决我的问题。事实证明,当我第一次启动CloudWatch时,该地区不知何故被设定为俄亥俄州。在我将其更改为美国东部(北弗吉尼亚州)后,一切正常。

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

有一个名为“如何将CloudWatch日志与Lambda一起使用”的文件。看起来您已经找到了答案,但对于没有IAM特定问题的任何人来说,这可能会有所帮助。

您可能需要将上次摄入时间列添加到日志输出中。写下我所有的事件需要几分钟。

虽然这已经得到了回答,但我只是想增加我的经验,这可能对其他人有用

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

在我的例子中,当使用lambda处理DynamoDB事件时,lambda获得了cloudwatch和DynamoDB所需的所有权限。花了4个小时才拿到l
app.use(function simpleLogger (req, res, next) {
  console.info('[Logger]', req.method, req.originalUrl)
  next()
})
[Logger] GET /hello?world=1
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