AWS Lambda 函数不会向 CloudWatch 显示日志,除非该函数被修改并重新部署

问题描述 投票:0回答:1

我正在使用三个 lambda:第一个有一个用于触发器的 API 网关,第二个有一个 SQS FIFO 队列(让我们将其命名为队列 1)作为触发器,第三个还有一个 SQS FIFO 队列(让我们将其命名为队列1)。将其命名为queue2) 作为触发器。我还为每个 FIFO 队列分配了一个 DLQ FIFO 队列(总共 2 个 DLQ)。

因此,每当我通过 API 网关触发第一个 lambda 时,我都可以看到队列中正在处理的消息(在队列 1 中出现,如果重试次数超过或可见性超时到期,则该消息将发送到 DLQ队列1)。尽管如此,我在 CloudWatch 上看不到任何日志。

一开始,人们可能会认为这是权限问题。我拥有具有这些权限的 IAM 角色。三个 lambda 使用相同的角色。

The roles used by my lambdas

现在,在图中,您可以看到我有两个自定义内联策略。这些用于允许从我拥有的 SQS FIFO 队列发送和接收消息。我每个队列都有一个策略,这就是我在其中的内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "sqs:ReceiveMessage",
                "sqs:SendMessage",
                "sqs:GetQueueAttributes"
            ],
            "Resource": "arn:aws:sqs:<rest-of-the-arn>.fifo"
        }
    ]
}

我已阅读此线程并尝试了他们的建议(检查 AWSLambdaBasicExecutionRole 是否存在、将函数超时更改一秒等),并且它适用于更改后的第一次执行。但是,如果我通过 API 网关再次触发我的工作流程,则不会打印任何日志,但其他一切都正常。

我还没有尝试过的唯一一件事是每个 lambda 有一个角色,并显式指定 CloudWatch 日志组的 arn。尽管如此,我不认为这是问题所在,因为每次我想要获取日志时重新部署函数都可以使一切正常工作,但只是一次。

您认为可能是什么原因造成的?

我已经尝试了此线程中提供的大部分解决方案(检查 AWSLambdaBasicExecutionRole 是否存在、将函数超时更改一秒等)。他们中的大多数都暂时解决了问题,这意味着在所述更改之后立即完成的执行日志可以在cloudwatch上找到。但是,对于后续执行,日志不会再次显示。

amazon-web-services aws-lambda amazon-cloudwatch
1个回答
0
投票

我想我找到了“问题”。其实根本没有问题,只是我对日志流如何工作的理解错误。

@Mark B 让我检查日志组中的所有日志流。函数执行的日志被放入现有的日志流中,而不是创建新的日志流。

因此,我知道这是期望的行为,并且仅当连接到日志组的服务(在本例中为 lambda 函数)被修改时才会创建新的日志流。如果不修改函数,所有执行的所有日志将存储在同一个日志流中。

这个假设正确吗?

我还注意到,在一段时间(约 20 分钟)后,执行 lambda 函数会导致创建一个新的日志流。这正常吗?有没有办法改变这个时间?

现在,如果这是正确的,那么单个日志流中可以存储多少条“消息”?

© www.soinside.com 2019 - 2024. All rights reserved.