为什么 AWS Lambda 别名只将 INIT_START 事件记录到 CloudWatch?

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

我有一个通过 Rest API 网关触发的 AWS Lambda 函数。它按预期记录到

/aws/lambda/my-function
CloudWatch 日志组。

我想使用预配置的并发性,因此将 API 网关设置为调用 Lambda 别名。该函数被调用并生成预期的响应。它创建了一个新的日志流,名称中包含函数版本号,而不是

[$LATEST]
,正如预期的那样,但是唯一记录的事件是
INIT_START
当预配的 Lambda 启动时。

我尝试通过 AWS 控制台调用使用测试事件来消除 API 网关这个问题。同样,直接调用该函数会按预期工作,但具有相同事件的别名会产生预期的响应,但不会记录到 CloudWatch。

我已经尝试为 Lambda 函数的执行角色扩大与 CloudWatch 相关的 IAM 权限,但这并没有改善(到

logs:CreateLogGroup/CreateLogStream/PutEvents
上的
arn:aws:logs:*:*:*
)。

我尝试发布我的函数的新版本来更新别名,确保我的测试更改被采纳。

编辑1: 我将

context
对象添加到我返回的响应中,以确认它绝对是我的别名被调用,并且日志记录配置看起来正确:

{
  "context": {
    "callbackWaitsForEmptyEventLoop": true,
    "functionVersion": "6",
    "functionName": "my-function",
    "memoryLimitInMB": "128",
    "logGroupName": "/aws/lambda/my-function",
    "logStreamName": "2023/03/08/[6]541834ec8f884588ba63e209f0be0789",
    "invokedFunctionArn": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:my-function:my-function",
    "awsRequestId": "e0812992-cf58-4a8b-b4a6-1ac0a91445b1"
  }
}

你可以看到

invokedFunctionArn
是别名 - 当直接测试函数时,末尾只有一个
:my-function
。此外,当直接调用
functionVersion
$LATEST
.

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

这里的问题不在于我的函数及其日志记录,而是我正在查看 CloudWatch 控制台中按“上次事件时间”排序的最新流,并且时间戳似乎没有更新。

我将 Lambda 调用

context
对象添加到我的响应中,以确认调用是针对我在问题中的 Lambda 别名(参见 Edit 1)进行的。

当我稍后返回时,我注意到这也包括

logStreamName
所以开始在 API 中检查它。

例如,我可以看到一个日志流:

// log stream
lastEventTimestamp: Wed, 08 Mar 2023 21:50:45 GMT
lastIngestionTime:  Wed, 08 Mar 2023 21:50:46 GMT

// actual most recent event
timestamp:          Wed, 08 Mar 2023 21:52:09 GMT
ingestionTime:      Wed, 08 Mar 2023 21:52:10 GMT

上述这些陈旧值在实际事件发生后大约 30 分钟返回,但根据文档“最终一致”并最终更新。

每次直接调用 Lambda 函数都会创建一个具有最新“最后事件”时间戳的新日志流,这与通过上述别名调用提供陈旧的“最后事件”时间戳时的行为相比,加剧了混乱。

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