具有长 运行 任务的应用程序对 AWS Lambda 或 AWS Step Functions 的适用性

Suitability of app with long running tasks for AWS Lambda or AWS Step Functions

我在 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 Batch might be a good idea

所以回答你的问题:

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

2)不,你已经差不多明白了。

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

我的工作 运行 通常情况下,您可以使用符合免费套餐条件的 t2.micro 实例。

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

你要的叫Activity工人。 Tl;dr:您注册 "activities",每个人都会获得一个 ARN。然后您可以将该 ARN 放在任务状态的资源字段中,然后您 运行 一些代码("worker")在某处(在 Lambda 中,在 EC2 上,在您的地下室中,任何地方)轮询任务由该 ARN 识别,然后回调以报告成功或失败。 Activity 工人最多可以 运行 一年。

the AWS docs

中的分步详细信息

为了回应 RTF 的评论,这里有更深入的探讨:假设您有代码为 color_turtles.pl 中的海龟着色。因此,您要做的是调用 CreateActivity API - 请参阅 http://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateActivity.html - giving the name "ColorTurtles" and it'll give you back an ARN, a string beginning arn:aws... Then in your state machine you make a Task state with that ARN as the value of the resource field. Then you add code to color_turtles.pl to poll the service with http://docs.aws.amazon.com/step-functions/latest/apireference/API_GetActivityTask.html - 每当您 运行ning 的机器执行该任务时,它就会去寻找 activity工人投票。它将为您的轮询工作人员提供任务的输入,然后您处理输入并生成一些输出,然后调用 SendTaskSuccess 或 SendTaskFailure。所有这些都只是 REST HTTP 调用,因此您可以 运行 它们在任何地方,我的意思是任何地方;在 Lambda 中、在 EC2 实例中或在 Internet 上任何地方的某台计算机上。

首先我要说的是,您似乎正在 AWS 上寻找工作流解决方案。 SWF 和 Step 函数是两个最流行的函数。 Steps 功能比 SWF 更受 AWS 的更新和鼓励。

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

使用步进函数,您可以通过两种不同的方式执行此操作。蒂姆在他的回答中建议了其中一种方法。 有另一种方法可以实现同样的效果,即在步骤函数中使用作业轮询器。作业轮询器能够调用(轮询)您的资源并确定任务是否完成,如果没有完成,您可以在指定时间内以等待模式发送执行。如上所述,目前任何工作流允许的最长执行时间为 1 年。如果您的任务可能需要超过 1 年的时间,则不能使用当前形式的步进函数。