适用于AWS Lambda或AWS Step Functions的长期运行任务的应用程序

时间:2017-06-05 12:08:58

标签: amazon-web-services aws-lambda aws-step-functions

我在每天运行一次的AWS EC2实例上有一个应用程序。应用程序从Web服务获取一些文件,逐行解析文件,更新数据库,根据数据库中的更改更新S3文件,向客户发送通知电子邮件以及其他一些任务。

这是必须按顺序执行的一系列逻辑任务,尽管某些任务可以被视为可以并行执行的子任务。所有任务都是Perl脚本和Java程序的组合,其中一个Perl脚本充当管理器,依次执行每个脚本。有些任务可能需要45分钟才能完成,整个过程总共需要3个小时。

我想让整个过程无服务器。我最初的想法是使用 AWS Lambda ,其中每个任务都将作为Lambda函数执行,直到我发现Lambda函数强加 5分钟执行超时。似乎 AWS Step Functions 服务实际上更适合我的用例,但我的理解是该服务由Lambda支持,因此任务仍将具有5分钟的执行限制。 / p>

(我也知道我必须将我的Perl脚本重写为Lambda支持的语言)。

我假设我可以通过将代码重构为较小的函数来解决执行时间限制,这些函数将保证在5分钟内完成。但在我的特殊情况下,这似乎效率低下。

目前,数据库更新任务一次处理一个文件中的行。为了使用Lambda,Lambda函数只需处理文件中的一行(或极少数行),以保证不会溢出超过5分钟的执行时间。这将涉及在每次调用Lambda函数时打开和关闭与数据库的连接。此外,处理的每一行应该导致写入文件的条目,以存储在S3中。现在,我只是在内存中保留一个文件句柄,并在处理完所有行时将文件写入S3,但是对于Lambda,我需要继续读取文件,更新文件并将其写回S3。

我要问的是:

  • 我的用例是否适合AWS Lambda和/或AWS Step Functions?
  • 我误解了这些服务的运作方式吗?
  • 是否有其他AWS服务更适合我的用例?

经过进一步研究,我认为AWS Batch可能是good idea

3 个答案:

答案 0 :(得分:1)

所以回答你的问题:

1)是的,如果你有一些可以运行约45分钟的东西,而你可以使用Lambda / Step功能来设计它,你可能最好还是获得一个EC2微实例。

2)你没有得到它。

3)如上所述,您希望使用EC2,这是一篇关于使用数据管道以这种方式启动/停止EC2实例here的好文章,只有在您需要它时才启动实例成本(如果有的话)可以忽略不计。

我有以这种方式运行的工作,通常你可以使用t2.micro实例免费获得免费资格。

您还可以在EC2实例上运行perl脚本,因此无需重写它们!

答案 1 :(得分:1)

你想要的是活动工人。 Tl;博士:您注册"活动"每个人都得到一个ARN。然后,您可以将该ARN放在任务状态的资源字段中,然后在某处(在Lambda中,在EC2上,在您的地下室,无论哪里)运行一些代码(" worker"),以轮询所识别的任务通过该ARN,然后回电报告成功或失败。活动工作者可以运行长达一年。

the AWS docs

的详细步骤详情

回应RTF的评论,这里有一个更深入的探讨:假设你有代码在color_turtles.pl中为海龟着色。所以你要做的就是调用CreateActivity API - 参见http://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateActivity.html - 给出名称" ColorTurtles"并且它会返回一个ARN,一个字符串开头arn:aws ...然后在你的状态机中你创建一个Task状态,该ARN作为资源字段的值。然后,您将代码添加到color_turtles.pl以使用http://docs.aws.amazon.com/step-functions/latest/apireference/API_GetActivityTask.html轮询服务 - 只要您正在运行的计算机进入该任务,它就会查找活动工作人员轮询。它将为您的轮询工作者提供任务的输入,然后处理输入并生成一些输出,并调用SendTaskSuccess或SendTaskFailure。所有这些只是REST HTTP调用,所以你可以在任何地方运行它们,我的意思是任何地方;在Lambda,EC2实例或Internet上的任何计算机上。

答案 2 :(得分:0)

首先,看来您正在AWS上寻找工作流程解决方案。 SWF和Step函数是两个最受欢迎的函数。步骤功能是最新的产品,并且比SWF更受AWS的鼓励。

SWF具有处理长时间运行任务的本机功能,缺点是您必须为决策者提供自己的执行环境(不能使用lambda)。

使用步进功能,您可以通过两种不同的方式执行此操作。 Tim在回答中提出了一种方法。 还有另一种方法可以实现此目的,那就是在步骤功能中使用作业轮询器。作业轮询器可以调用(轮询)您的资源,并确定任务是否完成,如果没有完成,您可以在指定的时间以等待模式发送执行。如上所述,当前任何工作流允许的最大执行时间为1年。如果您的任务可能需要一年以上的时间,则不能以当前形式使用步进功能。