我为我的 AWS Lambda 函数设置了部分批量响应,该函数将 Amazon Simple Queue Service(Amazon SQS)配置为事件源。现在,我的 Lambda 函数返回“ReportBatchItemFailures”列表,并出现以下其中一种情况:在没有函数错误时,Lambda 重试整个消息批处理,或者 Lambda 不重试任何部分消息批处理。我该如何解决此问题?
解决方法
**注意:**您必须在 Lambda 函数上手动配置部分批量响应,以编程方式处理部分 Amazon SQS 批处理。有关更多信息,请参阅《AWS Lambda 开发人员指南》中的报告批处理项目故障。
用于激活 Lambda 函数的部分批量响应的 AWS Command Line Interface(AWS CLI)命令示例
**重要提示:**将 <esm_UUID> 替换为您的 Amazon SQS 事件源映射的通用唯一标识符(UUID)。要检索事件源映射的 UUID,请运行 list-event-source-mappings AWS CLI 命令。如果在运行 AWS CLI 命令时收到错误,请确保您使用的 AWS CLI 为最新版本。
aws lambda update-event-source-mapping --uuid <esm_UUID> --function-response-types "ReportBatchItemFailures"
对没有函数错误时 Lambda 重试整个 SQS 消息批处理的 ReportBatchItemFailures 进行问题排查
查看 Lambda 函数代码中的部分批量响应,检查是否存在以下响应。然后,根据记录的响应修复问题。
**注意:**如果您的函数返回以下任一响应,Lambda 会将批处理视为完全失败。
对非有效 JSON 的 EventResponse 的响应
return "Hello world"
return ""
对空的 itemIdentifier 值的响应
return {"batchItemFailures":[{"itemIdentifier": ""}]}
对空 itemIdentifier 值的响应
return {"batchItemFailures":[{"itemIdentifier": None}]}
对键名称不正确的 itemIdentifier 值的响应
return {"batchItemFailures":[{"bad_key": messageID}]}
对具有不存在的消息 ID 的 itemIdentifier 值的响应
return {"batchItemFailures":[{"itemIdentifier": "random_ID"}]}
**重要提示:**您的 Lambda 函数必须返回有效的 itemIdentifier JSON 值。
对 Lambda 不重试任何部分消息批处理的 ReportBatchItemFailures 进行问题排查
查看 Lambda 函数代码中的部分批量响应,检查是否存在以下响应。然后,根据记录的响应修复问题。
**注意:**当您的函数返回以下任一响应时,Lambda 会将批处理视为完全成功。
对空的 batchItemFailures 列表的响应
return {"batchItemFailures":[]}
对空 batchItemFailures 列表的响应
return {"batchItemFailures": None}
对具有空的或意外 JSON 值的 EventResponse 的响应
return {}
return {"Key1":"Value1"}
对空 EventResponse 的响应
return
return None
**重要提示:您的 Lambda 函数必须返回一个含有“batchItemFailures”**JSON 值的响应,该响应包括有效消息 ID 列表。
相关信息
如何防止 Amazon SQS 消息多次调用我的 Lambda 函数?