面对AWS dynamo数据库触发器

时间:2016-06-24 16:50:57

标签: amazon-dynamodb aws-lambda amazon-dynamodb-streams

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

请帮帮我......

2 个答案:

答案 0 :(得分:0)

我相信您的Lambda代码无法处理异常。当您从DynamoDB删除项目时,该操作也会发送到下游Lambda-可能Lambda不知道如何处理它。但是它将继续尝试。如果您继续添加项目,那很好,但是删除项目时会出现异常。

答案 1 :(得分:0)

CloudWatch Logs and Metrics将有助于确定问题的确切原因。

同时,我建议为DynamoDB事件源配置On-failure destination-SQS队列或SNS主题,用于无法处理的记录。当Lambda由于太旧或已用尽所有重试而丢弃一批记录时,它将有关该批的详细信息发送到队列或主题。此配置是DestinationConfig data type的一部分。

您还应该检查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",
    ...
}

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

其他常见错误可能是execution role中的更改。确保没有人更改它,并删除AWSLambdaBasicExecutionRoleAWSLambdaDynamoDBExecutionRole权限。特别是,对于DynamoDB流处理,您需要以下内容:

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

请注意,如果您添加了一个失败的目标,我强烈建议您将该目标用于调试和错误处理,则根据选择的目标服务,您还将需要它的权限:

  • Amazon SQS – sqs:SendMessage
  • Amazon SNS – sns:Publish

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

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

我建议使用用例适当的重试和最大记录寿命来配置函数的事件源映射。另外,启用Split batch on error,它将在重试之前将流中的记录分成两部分,然后重试,可能隔离不良记录解决超时问题