AWS SQS触发Step Functions

44

快速问题:在发送 SQS 消息后,是否可能触发 Step Function 的执行?如果可以,如何将其指定到 CloudFormation Yaml 文件中?

提前感谢。


1
嘿,最终答案对你有用吗?如果是的话,你应该接受它,这样其他Stack Overflow(SO)用户就知道它可以解决问题。如果你需要微调一些东西或者使用了不同的解决方案,请留下评论或添加自己的答案,与他人分享你的知识。 - Matthew Pope
2个回答

67
首先需要考虑的是:您是否真的需要使用SQS来启动Step Functions状态机?您可以使用API网关吗?或者您是否可以将消息写入S3存储桶并使用CloudWatch事件来启动状态机
如果必须使用SQS,则需要有一个Lambda函数作为代理。您需要将队列设置为Lambda触发器,并编写一个Lambda函数来解析SQS消息并对Step Functions StartExecution API进行适当调用。

我在移动设备上,暂时无法输入yaml文件,但如果需要,稍后可以尝试更新。现在,这里有一个详细的步骤说明,介绍如何从Lambda调用Step Functions状态机(包括示例yaml),以及如何使用CloudFormation设置SQS触发Lambda


4
采用这种方法,如何处理步骤函数中的错误?当消息在 Lambda 函数中接收时,该消息将从 SQS 中删除。如果步骤函数出现错误,既不会通知 SQS 也不会通知 Lambda 函数。我认为大多数情况下,错误将出现在调用它的 Lambda 函数中。 - Vladimir Venegas
2
SQS消息在Lambda函数成功处理(即Step Function启动)之前不会被删除。在您的Step Function中,您将使用与任何其他Step Function中错误处理相同的方法。https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html - Matthew Pope
1
@MatthewPope,为什么这会是一个反模式?如果你希望步进函数在成功/失败时确认/重试消息,这似乎是一个合理的方法,就像Lambda那样。在许多情况下,重试SFN中的单个步骤可能足够了,但我可以想象一些其他情况,在这些情况下,您会希望重试整个SFN。 - cahen
2
如果您的步骤函数在合理快速的时间内完成(<5分钟),您可以使用快速步骤函数,如此处所示:https://docs.aws.amazon.com/step-functions/latest/dg/sample-project-express-high-volume-sqs.html采用这种方法,只有当步骤函数成功时,作业才会从队列中删除。确保增加SQS VisibilityTimeout,如果步骤函数持续时间超过30秒:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html。这将帮助您避免反复触发相同的执行。 - Luciano Mammino
1
@MatthewPope 只有当消息从队列中显式删除时,才会从队列中删除该消息。我在这里发表评论,因为您的评论听起来好像 Lambda 的成功完成会自动删除消息。当您处理完消息后,必须显式地将其删除,否则它将再次出现在队列上。当从队列中检索到消息时,它仅对从队列中读取更多消息的任何人隐藏。如果在从队列中删除之前达到其可见性超时的值,则它将再次可见。 - Sinux1
显示剩余4条评论

19

现在这是正确的方式。我曾经担心它可能会很昂贵,但我查看了定价,发现它并不昂贵。如果使用Lambda作为中间件,我会感到惊讶它是否会比这更贵。 - trademark
2
对于任何正在寻找CDK实现的人,请访问https://github.com/aws/aws-cdk-rfcs/issues/473,该项目仍在进行中。 - Capan
除了@Capan的评论之外,您仍然可以使用L1构造。https://docs.aws.amazon.com/cdk/api/v1/docs/aws-pipes-readme.html - Rizxcviii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接