【发布时间】:2020-12-30 03:46:55
【问题描述】:
将文件添加到我的 S3 存储桶时,会触发 S3PUT 事件,将消息放入 SQS。我已将 Lambda 配置为在消息可用时立即触发。
在 lambda 函数中,我发送 API 请求以在 ECS Fargate 容器上运行任务,其中环境变量包含从 SQS 接收的消息。在容器中,我使用消息从 S3 下载文件,进行处理,成功处理后我希望从 SQS 中删除消息。
但是,在我的 lambda 执行后,该消息会自动从 SQS 中删除。 有什么方法可以将 lambda 配置为不自动删除 SQS 消息(除了引发异常并故意使 lambda 失败),以便我可以以编程方式从容器中删除消息?
更新: 考虑一下我希望实现的这种情况。
- 消息进入 SQS 队列
- Lambda 获取消息并运行 ECS API 并在不从队列中删除消息的情况下完成。
- 消息正在进行中。
- ECS 容器运行任务并在成功处理后从队列中删除 msg。 如果容器失败,在可见性超时后,消息将重新进入队列并再次触发 lambda,循环将从第 1 步开始重复。
- 如果容器失败超过一定次数,那么消息才会从 in-flight 发送到 DLQ。
这一切目前只有在我故意在 lambda 上引发异常并且我正在寻找类似的解决方案而不这样做时才有效。
【问题讨论】:
-
将消息副本添加到正在进行的 SQS 队列(或 DynamoDB 表)中,稍后在相关任务完成时将其删除。
-
@jarmod 是的,我想到了,但万一我的容器任务失败,我也希望它用该消息重试任务。如果失败,则消息将仅位于 SQS 中。如果我引发异常并故意使 lambda 失败,所有这些都有效,但我认为这不是最佳实践
-
您可以添加一个计划的 Lambda,根据需要每天多次查询正在进行的队列(或 DB),确定给定的工作流是否已超过其最大 TTL,然后重新添加消息发送到原始 SQS 队列。
-
如果 Lambda 函数发回失败信号,它可能会将消息放回队列中。 (或者,更准确地说,消息会在隐身期到期后重新出现。)您可以将死信队列配置为在给定次数的尝试后激活。
标签: amazon-web-services amazon-s3 aws-lambda amazon-sqs aws-fargate