是否可以在将项目添加到 SQS 队列时触发 AWS Fargate 任务?

Don*_*son 12 amazon-s3 amazon-sqs amazon-web-services amazon-ecs terraform

为了澄清起见,我想做的是当特定队列中有项目时触发 Fargate 任务。我已经使用本教程来了解我现在的情况。这工作正常,但我遇到的问题是每个文件上传(s3存储桶的结构是s3_bucket_name/{unknown_name}/known_file_names)都会导致任务被触发,我只希望/需要它每个{unknown_name}触发一次。此后,我更改了配置,以在检测到 test_file.txt 文件时将项目添加到队列中。是否可以在这样的队列上触发fargate任务?如果是这样,怎么办?

Mar*_*k B 15

SQS 不会触发或“推送”任何消息。正如评论中提到的,AWS Lambda 具有 SQS 集成,可以自动为您轮询 SQS 并使用新消息触发 Lambda 函数,您可以使用该函数来创建 Fargate 任务。

不过,我建议像这样重构您的 Fargate 任务:

  • 重新配置容器中运行的代码以轮询 SQS 队列中的消息。
  • 将您的任务作为 ECS 服务运行。
  • 配置 ECS 服务自动扩展以根据 SQS 队列的深度启动任务实例。

  • @Jo.TLV 我的回答根本不建议使用 AWS Lambda。 (8认同)

Shi*_*hur 7

  1. 首先,如果我从你的问题中理解正确的话,最初你想要:
  • Object="known_file_names" 被放入 's3_bucket_name/{unknown_name}' ---> 事件未触发

  • Object="unknown_name" 被放入 's3_bucket_name' --> 事件已触发

您希望当文件放入没有前缀的 S3 存储桶时触发事件,而如果有前缀则不触发事件。然而,S3 不允许这样做。你可以做完全相反的事情。您可以限制事件仅在与前缀匹配时触发。

  1. 其次,您无法通过 SQS 自动触发 Fargate 任务,但您可以触发 Lambda 函数,该函数将发送请求来运行 Fargate 任务。[参考]

这是发送运行任务请求的模板 python lambda 函数: https://github.com/shitijkarsolia/ecs-Fargate-tasks-fatlambda/blob/master/lambda/run_fat_lambda.py

注意: 但是这种架构有一个缺陷。消息到达 SQS 后,Lambda 函数运行(发送 Fargate 运行任务请求)并向 SQS 返回成功。结果,该消息将从队列中删除。因此,如果 Fargate 容器中的处理因任何原因失败,则消息将永远丢失,并且无法重试处理。

更好的架构是: S3Put 事件将消息发布到 SNS 主题。SQS 和单独的 Lambda 函数是该 SNS 的订阅者。Lambda 函数将运行任务请求发送到 Fargate。Fargate 容器轮询 SQS 队列并在成功处理时显式删除消息。