无法使AWS Lambda函数登录(文本输出)到CloudWatch


78

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

通过查看context我的日志组/aws/lambda/wavToMp3和日志流为的对象,我知道了2016/05/23/[$LATEST]hex_code_redacted。因此,我在CloudWatch中创建了该组和流,但是没有任何日志记录到它。


1
您可以将context.logGroupName和context.logStreamName记录到lamda控制台吗?然后确认您是否检查了正确的流。
Shibashis

是的,我做到了..那就是我首先获得分组和直播的方式。
ffxsam '16

通常有趣的是,这不需要任何其他配置,您是否尝试过从aws lambda监视屏幕导航到cloudwatch控制台,右上角有一个链接?
Shibashis

2
我能想到的唯一原因是缺少对lambda执行角色的许可?您可以确认角色具有以下权限“ logs:CreateLogGroup”,“ logs:CreateLogStream”,“ logs:PutLogEvents”。
Shibashis

1
@Shibashis是的。就是这样 将此作为您的正式答案,我会接受的。
ffxsam '16

Answers:


129

为了使lambda函数创建日志流并将日志发布到cloudwatch,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


17
请注意以下由hoonoh回答的问题,在实际应用此新策略之前,我需要更新设置。
史蒂夫·史密斯

3
我来这里是因为遇到同样的问题,在我看来,错误是Log group not found。在这里添加它,以便其他人使用它都会找到这个答案
hansaplast

1
就像@SteveSmith所说的那样,请看下面的hoonoh答案(投票数比这个公认的答案还多):仅当您在更新lambda的策略(修改超时,添加虚拟环境var等)之后更新lambda时才有效。 )
Christophe Blin

168

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

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

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


17
谢谢!我被困了一个小时。
reggie3

7
这是我对正确答案的投票。如果您遇到此AWS错误,文档中的任何内容都将无济于事。
brycem

2
谢谢。。。这也是我被困的地方。
John Chrysostom

1
谢谢 !他们至少应该在lambda角色编辑器中添加“重新加载角色/策略”,因此您无需进行虚拟编辑。甚至可以选择“传播”政策更新。
马丁

1
如果可以将此答案合并为公认的答案,那就太好了-它们是解决问题所必需的同一过程的一部分。
Michael Berry

17

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

我已经拥有这些权限,但是没有用。

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

我更改了超时时间,已保存并且日志仍然无法正常工作。

我分配了另一个角色,日志仍然无法正常工作。

最后为我工作的是单击“创建自定义角色”,然后单击“允许”。就是这样,并且开始生成日志,但是由于我不想使用新角色,而是想使用现有角色,因此之后我只是分配了现有角色就可以了。因此,从技术上讲,我应该回到无法使用的原始配置,但现在可以使用了。去搞清楚。


1
同样在这里,花了2个小时来解决这个问题。对lambda到cloudwatch设置的错误和绝对不透明以及不直观感到失望。谢谢!
alecxe

太厉害了 有人应该认真地与AWS Lambda竞争。就像他们没有动力去改善服务。
卡梅隆·埃利斯

1
也发生在我身上,我很确定这是因为我将执行角色更改为现有角色,该角色没有显式权限为我的lambda创建/写入Cloudwatch日志流。
user2719094 '19

谢谢!有效!
克里希纳

5

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


1

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

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

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

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


1

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

希望这可以帮助


0

也许有些迟了,但是对于那些仍在查看Cloudwatch中的lambda日志的人来说还是很困难的。我注意到了有关lambda函数的执行角色的问题:“您可以将此函数与现有角色一起使用。请注意,该角色必须由Lambda承担,并且必须具有Cloudwatch Logs权限。” 因此,在IAM中,我将“ CloudWatchLogsFullAccess”授予分配给我的功能的角色。然后在cloudwatch中的日志下,您将看到分配了该角色的功能的日志。


0

如其他答案所述,您需要授予lambda权限才能将日志发布到云监视日志。AWSAWSLambdaExecute仅为此提供了策略。它的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读/写访问权限。如果您不希望这样做,则可以仅使用日志部分来创建自定义策略。


0

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

例如

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

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


0

我遇到了这个问题,但是以上答案都无法解决我的问题。事实证明,当我第一次启动CloudWatch时,该区域已设置为俄亥俄州。将其更改为美国东部(弗吉尼亚北部)后,一切正常。


0

CloudWatchCloudWatch Logs是不同的权限,您需要添加CloudWatch Logs到角色随附的策略中。


0

有一篇名为“如何使用CloudWatch监视AWS Lambda”的文章,其中有“如何在Lambda中使用CloudWatch日志”部分。看来您已经找到了答案,但是对于没有IAM特定问题的任何人,这可能会有所帮助。


0

您可能想要将Last Ingestion Time列添加到日志输出。我的所有活动都需要几分钟的时间来编写。


0

尽管已经回答了这个问题,但Just希望添加我的经验,这可能对其他人有用。

甚至权限也已适当设置,以便lambda可以登录cloudwatch,有时需要3-4个小时来反映日志组。

就我而言,在将lambda用于DynamoDB事件时,为lambda提供了cloudwatch和DynamoDB的所有必需权限。花了4个小时才反映出日志。可能是来自AWS端的一些同步问题。4小时后,我没有采取任何措施,之后我可以看到Cloudwatch日志。

另外,请确保您在创建函数的同一区域中对日志进行搜寻。


0

2020年7月更新!!

日志可能不在us-east-1中,请尝试在不同区域中查找lambda边缘日志!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.