Amazon web services 应用程序对AWS Lambda或AWS Step功能的长时间运行任务的适用性

Amazon web services 应用程序对AWS Lambda或AWS Step功能的长时间运行任务的适用性,amazon-web-services,aws-lambda,aws-step-functions,Amazon Web Services,Aws Lambda,Aws Step Functions,我在AWS EC2实例上有一个每天运行一次的应用程序。该应用程序从web服务获取一些文件,逐行解析文件,更新数据库,根据数据库中的更改更新S3文件,向客户发送通知电子邮件以及其他一些任务 这是一系列必须按顺序执行的逻辑任务,尽管有些任务可以被认为是可以并行执行的子任务。所有任务都是Perl脚本和Java程序的组合,单个Perl脚本充当管理器,依次执行每个任务。有些任务可能需要45分钟才能完成,整个过程总共可能需要3小时 我想让整个过程无服务器化。我最初的想法是使用AWS Lambda,每个任务都

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

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

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

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

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

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

我想问的是:

  • 我的用例是否不适合AWS Lambda和/或AWS Step函数
  • 我是否误解了这些服务的工作原理
  • 还有其他更适合我的用例的AWS服务吗


经过进一步的研究,我认为可能是一个。

所以要回答您的问题:

1) 是的,如果你有一个可以运行大约45分钟的东西,同时你可以用Lambda/Step函数来设计它,那么你最好使用一个EC2微实例

2) 不,你差不多明白了

3) 如上所述,您希望使用EC2实现此目的,有一篇很好的文章介绍了如何使用数据管道来启动/停止EC2实例,即仅在需要时启动实例—成本(如果有的话)可以忽略不计

我有以这种方式运行的作业,通常您可以使用免费的t2.micro实例


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

您需要的称为活动工作者。Tl;dr:你注册“活动”,每个活动都会得到一个ARN。然后,您可以将该ARN放在任务状态的资源字段中,然后在某个地方(在Lambda中、在EC2上、在您的地下室中、在任何地方)运行一些代码(“worker”),这些代码轮询该ARN标识的任务,然后回调以报告成功或失败。活动工人最多可以参加一年

有关详细信息,请访问


作为对RTF评论的回应,这里有一个更深层次的问题:假设您有在color_turtles.pl中为海龟着色的代码。因此,您要做的是调用CreateActivity API-请参阅-命名为“ColorTurtles”,它将返回一个ARN,一个以ARN:aws开头的字符串。。。然后在状态机中创建一个任务状态,将该ARN作为资源字段的值。然后,将代码添加到color_turtles.pl以轮询服务-无论您运行的机器何时到达该任务,它都会查找活动工作人员轮询。它将为轮询工作者提供任务的输入,然后处理输入并生成一些输出,并调用SendTaskSuccess或SendTaskFailure。所有这些都只是RESTHTTP调用,所以您可以在任何地方运行它们,我的意思是在任何地方;在Lambda中,在EC2实例上,或在Internet上的任何计算机上。

我将从这一点开始,您似乎正在AWS上寻找工作流解决方案。SWF和Step函数是两种最流行的函数。Steps功能是AWS比SWF更鼓励的最新产品

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


使用step函数,您可以通过两种不同的方式完成此操作。其中一种方法是蒂姆在他的回答中提出的有另一种方法可以达到同样的效果,即在step函数中使用作业轮询器。作业轮询器能够调用(轮询)您的资源,并查明任务是否完成,如果未完成,您可以在指定时间内以等待模式发送执行。如上所述,任何工作流当前允许的最大执行时间为1年。如果您的任务可能需要1年以上的时间,则不能使用当前形式的step函数。

数据管道解决方案听起来很有趣。如何从管道中在EC2实例上启动应用程序?当实例通过管道启动时,您是否必须配置实例以运行代码?我想您可以这样做,或者只是在实例上设置一个cron作业,但在cron开始之前使用数据管道启动它。是的,我必须配置一个用户数据脚本或cloud init等。becau