微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用一个 Lambda 函数处理 AWS 多条 SQS 消息

如何解决使用一个 Lambda 函数处理 AWS 多条 SQS 消息

我已经设置了一个 SQS 队列,只要有文件上传,就会在其中推送 S3 路径。

所以我有一个设置,我将接收 10 个小 csv 文件,我想将它们保存在 SQS 队列中,并仅在所有文件在特定时间到达时触发一次 lambda,比方说 5 分钟。

这是我的 CF 代码

  LambdaFunctionEventSourceMapping:
    Type: AWS::Lambda::EventSourceMapping
    Properties:
      BatchSize: 5000
      MaximumBatchingWindowInSeconds: 300
      Enabled: true
      EventSourceArn: !GetAtt EventQueue.Arn
      FunctionName: !GetAtt QueueConsumerLambdaFunction.Arn

  EventQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: Event-Queue
      DelaySeconds: 10
      VisibilityTimeout: 125
      ReceiveMessageWaitTimeSeconds: 10

  QueueConsumerLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: queue-consumer
      Runtime: python3.7
      Code: ./queue-consumer
      Handler: main.lambda_handler
      Role: !GetAtt QueueConsumerLambdaExecutionRole.Arn
      Timeout: 120
      MemorySize: 512
      ReservedConcurrentExecutions: 1

部署工作正常,但如果我将 3 个文件推送到 S3 存储桶,SQS 会异步触发 3 个我不想要的不同 lambda 函数。我需要一个 lambda 函数来包含队列中作为 S3 事件结果的所有消息并处理它们。我的 SQS 配置有问题吗?

解决方法

您所观察到的可能是由于 AWS 正在使用 five parallel threads 查询您的 SQS 队列。这些线程与 concurrency 设置分开,您无法控制这些线程。总是有 5 个。

因此每个线程都会从队列中获取一些消息,然后将依次使用这些消息调用您的函数。遗憾的是,您无法改变它的工作方式,因为这就是 AWS 端 sqs 和 lambda 的工作方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。