【发布时间】:2021-10-03 04:27:54
【问题描述】:
我已经设置了一个 SQS 队列,只要有文件上传,就会在其中推送 S3 路径。
所以我有一个设置,我将收到 10 个小 csv 文件,我想将它们保存在 SQS 队列中,并且仅在所有文件在特定时间(比如 5 分钟)到达时触发 lambda。
这是我的 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 配置有问题吗?
【问题讨论】:
-
您是否将 lambda 并发设置为 1?
-
@Marcin 是的,我做到了。实际上,SQS 的行为很奇怪。有时它会触发 3 个 lambda 函数,每个 lambda 有 3 条不同的消息。有时它会触发 2 个 lambda 函数,其中 1 个 lambda 有 2 条消息,另一个 lambda 有一条消息。
-
and trigger the lambda only once when all the files have arrived不,这不是 SQS 和 Lambda 的工作方式。是的,您可以批量接收消息,但您无法控制哪个批次和哪些消息。如果您需要这样的分组,您可以使用 DynamoDB 来识别和触发特定更新的 lambda。 (您也可以使用 Kinesis Analytics,但恕我直言,这太过分了) -
进展如何?仍然不清楚发生了什么?
-
感谢您的帮助和回答。实际上,我正在使用您和@gusto2(两者)的建议来使用 dynamoDB 和预定事件,即更易于实现。我正在使用 S3 通知来触发将记录写入 dynamoDB 的 lambda。然后在每个小时之后,我安排一个触发 lambda 并处理我的所有文件的事件,然后在处理后截断表格,以便其他新通知不会重复或重叠。
标签: amazon-web-services amazon-s3 aws-lambda message-queue amazon-sqs