Lambda 响应是
{
"errorMessage": "handler returns a single value, but it does not implement error",
"errorType": "errorString"
}
参考 aws 文档
示例表明,只需要返回失败消息,没有错误即可。
我已启用 Lambda 触发器中的
Report batch item failure
选项。
我的 lambda 中的 golang 代码就像
type SQSBatchResponse struct {
BatchItemFailures []SQSMessage
}
type SQSMessage struct {
MessageId string
}
func Handler(_ context.Context, sqsEvent events.SQSEvent) (sqsResponse SQSBatchResponse) {
// code
return sqsResponse
}
看来响应结构应该是这样的。
type SQSEventResponse struct {
BatchItemFailures []SQSBatchItemFailure `json:"batchItemFailures"`
}
type SQSBatchItemFailure struct {
ItemIdentifier string `json:"itemIdentifier"`
}
这是一个完整的例子。关键点是您需要返回包含 SQSBatchItemFailure(s) 切片的 SQSEventResponse 并返回非零错误。以下将保留队列中失败的所有项目,同时删除成功的项目。
func sqsHandler(_ context.Context, event events.SQSEvent) (events.SQSEventResponse, error) {
batchItemFailures := []events.SQSBatchItemFailure{}
for _, record := range event.Records {
if !ProcessRecord(record) {
// Items in the batch that failed processing - these will be removed from queue
batchItemFailures = append(batchItemFailures, events.SQSBatchItemFailure{
ItemIdentifier: record.MessageId,
})
}
}
sqsBatchResponse := events.SQSEventResponse{
BatchItemFailures: batchItemFailures,
}
if len(batchItemFailures) > 0 {
err := fmt.Errorf("failed to process %d records", len(batchItemFailures))
return sqsBatchResponse, err
}
// All items successfully processed - all records will be removed from the queue
return sqsBatchResponse, nil
}
func main() {
lambda.Start(sqsHandler)
}