AWS Lambda 使用 SQS 报告批量项目失败

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

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
}
amazon-web-services go aws-lambda amazon-sqs
2个回答
1
投票

看来响应结构应该是这样的。

AWS-lambda-go

type SQSEventResponse struct {
    BatchItemFailures []SQSBatchItemFailure `json:"batchItemFailures"`
}

type SQSBatchItemFailure struct {
    ItemIdentifier string `json:"itemIdentifier"`
}

0
投票

这是一个完整的例子。关键点是您需要返回包含 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)
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.