Lambda SQS Terraform 并发

Lambda SQS Terraform Concurrency

我的 Lambda 执行次数与 SQS 消息的数量不匹配。我想对我的 SQS 队列中的 1 条消息执行 1 次 lambda。

我的SQS队列有83条消息需要处理,但是我的cloudwatch日志在全部处理完后日志组里只有44条日志。为什么我的一半消息似乎丢失了? lambda 不会超时,正在执行的 lambda 会在超时之前完成它们的处理方式,并且只处理一条消息。是否还有更多我需要弄清楚的设置?

我的地形代码:

resource "aws_lambda_event_source_mapping" "event_source_mapping" {
  batch_size        = 1
  event_source_arn  = aws_sqs_queue.my_queue.arn
  enabled           = true
  function_name     = aws_lambda_function.my_lambda.arn
}

我的 Lambda 中的 Python 代码(batch_messages 应该始终为 1):

    queue = sqs.get_queue_by_name(QueueName='my-queue')
    batch_messages = queue.receive_messages(MaxNumberOfMessages=1)

    #Once done processing
    receipt_handle = tickers.receipt_handle 
    sqs_client.delete_message(QueueUrl=queue_url,ReceiptHandle=receipt_handle)

您有一个事件源映射,因此 Lambda 将自动轮询 SQS 以获取消息并将它们发送到您的 Lambda 函数中,在处理程序的 event 对象内。

在您的 Lambda 函数代码中,您还调用了 queue.receive_messages(),它正在执行额外的轮询以从队列中检索另一条消息。您的代码完全忽略了通过事件源映射检索到的消息,并进行了手动消息检索。这意味着每次调用 Lambda 函数时,都会从您丢弃的队列中删除一条消息(通过事件源映射),并从队列中删除另一条消息(通过您的代码)并进行处理。