1

我创建了一个 dynamodb 表并将一个 lambda 函数与要触发的相同。最初它工作正常,对于每次插入,我都注意到cloudwatch中的 lambda 执行,但经过几次测试(例如频繁从表中添加和删除记录)后,它会自动停止触发 lambda。我无法找出其背后的真正原因。

请在这里帮我...

4

2 回答 2

0

CloudWatch 日志和指标有助于确定问题的确切原因。

同时,我建议使用On-failure destinationSQS 队列或 SNS 主题配置 DynamoDB 事件源,以处理无法处理的记录。当 Lambda 因一批记录太旧或已用尽所有重试而丢弃该批记录时,它会将有关该批的详细信息发送到队列或主题。此配置是DestinationConfig 数据类型的一部分。

您还应该检查 Lambda 函数的状态。很多事情,比如 VPC 连接,都会影响函数的状态。您可以通过 cli 检查状态:

$ aws lambda get-function-configuration --function-name my-function

{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
    "Runtime": "nodejs12.x",
    "VpcConfig": {
        "SubnetIds": [
            "subnet-071f712345678e7c8",
            "subnet-07fd123456788a036",
            "subnet-0804f77612345cacf"
        ],
        "SecurityGroupIds": [
            "sg-085912345678492fb"
        ],
        "VpcId": "vpc-08e1234569e011e83"
    },
    "State": "Active",
    "LastUpdateStatus": "InProgress",
    ...
}

如果您的状态为 Inactive 或 Pending,请检查LastUpdateStatusReasonCode- 这将告诉您是否存在权限错误、缺少该功能的 VPC IP 地址等。

其他常见错误是执行角色发生变化。确保有人没有更改它并删除AWSLambdaBasicExecutionRoleAWSLambdaDynamoDBExecutionRole权限。特别是,对于 DynamoDB Streams 处理,您需要以下内容:

  • dynamodb:DescribeStream
  • dynamodb:GetRecords
  • dynamodb:GetShardIterator
  • dynamodb:ListStreams

请注意,如果您添加一个故障时目标,我强烈建议您将其用于调试和错误处理,您还需要一个权限,具体取决于您选择的目标服务:

  • Amazon SQS – sqs:SendMessage
  • Amazon SNS – sns:发布

从 DynamoDB 流中读取记录的事件源映射会同步调用您的函数并重试错误。如果函数受到限制或 Lambda 服务在未调用函数的情况下返回错误,则 Lambda 会重试,直到记录过期或超过您在事件源映射上配置的最长期限。

如果函数接收到记录但返回错误,则 Lambda 会重试,直到批次中的记录过期、超过最长期限或达到配置的重试限制。使用默认设置,这意味着不良记录最多可以阻止受影响分片上的处理一天。

我建议使用用例适当的重试和最大记录年龄来配置函数的事件源映射。此外,启用Split batch on error在重试之前将流中的多批记录拆分为两个,可能会隔离不良记录解决超时问题

于 2020-06-30T13:48:52.310 回答
0

我相信您的 Lambda 代码无法处理异常。当您从 DynamoDB 中删除一个项目时,该操作也会向下游发送到 Lambda - 可能 Lambda 不知道如何处理它。但它会继续努力。如果你继续添加项目,那么你很好,但是当你删除项目时,你会得到一个例外。

于 2020-06-30T12:04:34.303 回答