是否可以在将项目添加到 SQS 队列时触发 AWS Fargate 任务?
Is it possible to trigger an AWS Fargate task upon an item being added to an SQS queue?
为了澄清,我想要做的是在特定队列中有项目时触发 Fargate 任务。我已经使用 this tutorial 来了解我现在的位置。这工作正常,但我 运行 遇到的问题是每个文件上传(s3 存储桶的结构是 s3_bucket_name/{unknown_name}/known_file_names)都会导致任务被触发,我只 want/need 每个 {unknown_name} 触发一次。从那以后,我更改了我的配置,以便在检测到 test_file.txt 文件时将项目添加到队列中。是否可以在这样的队列上触发 fargate 任务?如果可以,怎么做?
SQS 不会触发或“推送”消息到任何地方。如评论中所述,AWS Lambda 具有 SQS 集成,可以自动为您轮询 SQS 并使用新消息触发 Lambda 函数,您可以使用它来创建 Fargate 任务。
但是我建议重构您的 Fargate 任务,如下所示:
- 重新配置容器中的代码 运行 以轮询 SQS 队列以获取消息。
- 运行 您作为 ECS 服务的任务。
- 配置 ECS 服务自动缩放以根据 SQS 队列的深度启动任务实例。
- 首先,如果我从你的问题中理解正确,最初你想要:
Object="known_file_names" 被放入 's3_bucket_name/{unknown_name}' ---> 事件未触发
Object="unknown_name" 被放入 's3_bucket_name' --> 事件触发
您希望在将文件放入没有前缀的 S3 存储桶时触发一个事件,如果有前缀则不触发该事件。但是,S3 不允许这样做。 你可以做完全相反的事情。可以限制事件只在匹配前缀时触发。
- 其次,您无法通过 SQS 自动触发 Fargate 任务,但您可以触发 Lambda 函数,该函数将向 运行 您的 Fargate 任务发送请求。 [Reference]
这是发送 运行 任务请求的模板 python lambda 函数:
https://github.com/shitijkarsolia/ecs-Fargate-tasks-fatlambda/blob/master/lambda/run_fat_lambda.py
注:
虽然这种架构存在一个缺陷。消息到达 SQS 时,Lambda 函数 运行s(发送 Fargate 运行 任务请求)并 returns 成功到 SQS。结果,消息将从队列中删除。因此,如果 Fargate 容器中的处理出于任何原因失败,则消息将永远丢失,并且无法重试处理它。
更好的架构应该是:
S3Put 事件向 SNS 主题发布消息。 SQS 和单独的 Lambda 函数是该 SNS 的订阅者。 Lambda 函数将 运行 任务请求发送到 Fargate。 Fargate 容器轮询 SQS 队列并在成功处理时显式删除消息。
为了澄清,我想要做的是在特定队列中有项目时触发 Fargate 任务。我已经使用 this tutorial 来了解我现在的位置。这工作正常,但我 运行 遇到的问题是每个文件上传(s3 存储桶的结构是 s3_bucket_name/{unknown_name}/known_file_names)都会导致任务被触发,我只 want/need 每个 {unknown_name} 触发一次。从那以后,我更改了我的配置,以便在检测到 test_file.txt 文件时将项目添加到队列中。是否可以在这样的队列上触发 fargate 任务?如果可以,怎么做?
SQS 不会触发或“推送”消息到任何地方。如评论中所述,AWS Lambda 具有 SQS 集成,可以自动为您轮询 SQS 并使用新消息触发 Lambda 函数,您可以使用它来创建 Fargate 任务。
但是我建议重构您的 Fargate 任务,如下所示:
- 重新配置容器中的代码 运行 以轮询 SQS 队列以获取消息。
- 运行 您作为 ECS 服务的任务。
- 配置 ECS 服务自动缩放以根据 SQS 队列的深度启动任务实例。
- 首先,如果我从你的问题中理解正确,最初你想要:
Object="known_file_names" 被放入 's3_bucket_name/{unknown_name}' ---> 事件未触发
Object="unknown_name" 被放入 's3_bucket_name' --> 事件触发
您希望在将文件放入没有前缀的 S3 存储桶时触发一个事件,如果有前缀则不触发该事件。但是,S3 不允许这样做。 你可以做完全相反的事情。可以限制事件只在匹配前缀时触发。
- 其次,您无法通过 SQS 自动触发 Fargate 任务,但您可以触发 Lambda 函数,该函数将向 运行 您的 Fargate 任务发送请求。 [Reference]
这是发送 运行 任务请求的模板 python lambda 函数: https://github.com/shitijkarsolia/ecs-Fargate-tasks-fatlambda/blob/master/lambda/run_fat_lambda.py
注: 虽然这种架构存在一个缺陷。消息到达 SQS 时,Lambda 函数 运行s(发送 Fargate 运行 任务请求)并 returns 成功到 SQS。结果,消息将从队列中删除。因此,如果 Fargate 容器中的处理出于任何原因失败,则消息将永远丢失,并且无法重试处理它。
更好的架构应该是: S3Put 事件向 SNS 主题发布消息。 SQS 和单独的 Lambda 函数是该 SNS 的订阅者。 Lambda 函数将 运行 任务请求发送到 Fargate。 Fargate 容器轮询 SQS 队列并在成功处理时显式删除消息。