如何安排python脚本在aws中按预定时间间隔运行

Posted

技术标签:

【中文标题】如何安排python脚本在aws中按预定时间间隔运行【英文标题】:How to schedule a python script to run at scheduled intervals in aws 【发布时间】:2020-06-10 08:09:43 【问题描述】:

当前场景:我们正在使用一些 java 代码处理 40M 记录并将它们作为 csv 文件上传到 s3 存储桶。

未来:我们希望将此代码移动到 AWS,为此我们希望有一个 python 脚本来处理记录并将它们作为 csv 文件加载到 aws-s3 存储桶中。 你能建议最好的方法,它可以触发脚本和处理数据吗? 我们希望避免在服务器中使用 EC2 和托管 python 脚本。我们希望将其作为无服务器服务。

我的方法: 我想用 AWS-Glue 来做这件事,使用触发器(自动/基于时间)来启动作业,并将我的代码放在作业内的脚本中。

这是一个好方法吗?

【问题讨论】:

【参考方案1】:

您可以使用 AWS Fargate,它可以与 Lambda 集成 考虑到 Lambda 的最大执行时间是 15 分钟,所以你 应该使用 Fargate

更多细节 https://serverless.com/blog/serverless-application-for-long-running-process-fargate-lambda/

你也可以使用AWS Event Rule来安排它

寻找解决方案总是存在的。但是有好的做法和坏的做法。

如果我告诉你,你可以只使用 AWS lambda 和 AWS EventRule, 和 SQS 听起来如何。有趣吗?

简而言之,您可以做到这一点。跟踪 lambda 中消耗的时间,当达到 14 分钟时,向 SQS 发送一条消息,指示您处理的行号,将处理后的文件上传到 s3,然后退出。使用该 SQS 再次触发 lambda,将一些消息保留为 30 秒以再次调用相同的 lambda 并从该行号开始。一旦所有处理完成,您将在 S3 中处理多个文件,使用另一个 lambda 和 SQS 将它们合并为一个。 这不是一个坏习惯,但在我看来不太好,Happy?

【讨论】:

感谢 Asfar 的回答,那么您是希望我使用 fargate 将代码作为包放入容器中并与 lamda 函数集成,还是我们可以直接使用 AWS 事件规则来安排 Fargate 打包代码? 它是你的选择,但理想情况下,Fargate 可以直接从事件规则中调用,所以为什么要使用 lambda(那将是额外的) 我们可以用 lamda 阶跃函数做到这一点吗?或任何其他创建容器的方法? 已编辑答案,请参阅 感谢您提供详细信息...所以简而言之.. 与 fargate 一起去很好:-)【参考方案2】:

您可以使用Cloudwatch Event rule 定期调用您定义的时间表并将您的 lambda 函数作为它的目标。这是 AWS Docs 中的 tutorial 说明如何操作。

【讨论】:

我的 python 代码必须获取 40+ 百万条数据记录并将其清理并作为 csv 文件上传到 s3 存储桶,那么 lamda 函数会直接处理该卷吗? 您的问题是关于按计划触发脚本。为了处理这样的数量,我认为 Lambda 不会以 15 分钟的执行时间限制来做到这一点。您的脚本使用服务器处理记录需要多长时间? 您的 java 代码是否部署到 lambda?如果是这样,那么您可以编写一个 Python 脚本,使用 CloudWatch 事件规则定期调用此 lambda。您的 python 脚本可以继续调用 lambda 来缓存数据。我在我的项目中做同样的事情。我已经计算了增量更改,即,如果我要缓存的总记录是 100k,并且在 lambda 保持不变的 15 分钟时间内缓存了 10k 条记录,那么我计算差异(总 - 缓存)和下一个当我的 python 脚本触发 lambda 时,它只会缓存差异。 @WalidK,目前我们的 java 代码正在使用 mule 服务器和 java 流概念来处理记录并将输出文件准备为 csv 并上传到 aws s3 存储桶。现在我们想将此处理迁移到 aws @nrai,我当前的代码不在 aws 中。它只是使用 aws s3 存储桶来存储输出的 csv 文件。

以上是关于如何安排python脚本在aws中按预定时间间隔运行的主要内容,如果未能解决你的问题,请参考以下文章

在python中按半小时间隔对文件列表进行分组

如何在 PostgreSQL 中按时间间隔聚合行数?

如何安排生产python脚本以触发函数在每天的指定时间运行

如何在 BigQuery 中安排脚本?

如何在 aws AppSync 中按 createdAt 和 updatedAt 排序和过滤?

Shell编程及自动化运维预定义变量