6

我有三个 python 脚本 、1.py2.py3.py每个脚本都有 3 个要传递的运行时参数。

这三个 python 程序都是相互独立的。所有 3 个都可能以批处理的顺序方式运行,或者可能发生任何两个可能会根据某些配置运行。

手动方法:

  1. 创建 EC2 实例,运行 python 脚本,将其关闭。
  2. 对下一个 python 脚本重复上述步骤。

自动化方式将通过 lambda 触发上述过程,并使用某种服务组合复制上述过程。

在 AWS 中实现此功能的最佳方式是什么?

4

3 回答 3

5

AWS Batch 有一个 DAG 调度程序,从技术上讲,您可以定义 job1、job2、job3 并告诉 AWS Batch 按该顺序运行它们。但我不会推荐这条路线。

要使上述工作正常运行,您基本上需要创建 3 个 docker 映像。图像1,图像2,图像3。然后将它们放入 ECR(如果不使用 Fargate 启动类型,Docker Hub 也可以工作)。

我认为这是没有意义的,除非每个工作都很庞大,都有自己的运行时间,并且与其他工作不同。

相反,我会编写一个调用 1.py 2.py 和 3.py 的 Python 程序,将其放入 Docker 映像中并运行 AWS 批处理作业或仅运行 ECS Fargate 任务。

主要.py:

import subprocess

exit_code = subprocess.call("python3 /path/to/1.py", shell=True)

# decide if you want call 2.py and so on ...
# 1.py will see the same stdout, stderr as main.py
# with batch and fargate you can retrieve these form cloudwatch logs ...

现在你有了一个只需要在某个地方运行的 Docker 镜像。Fargate 启动速度快,价格昂贵,临时存储最大限制为 10GB。AWS Batch 在冷启动时启动缓慢,但可以在您的账户中使用 Spot 实例。您可能需要为 AWS 批处理创建自定义 AMI。即,如果您想要更多存储空间。

注意:对于任何想对 shell=True 大喊大叫的人来说,main.py 和 1.py 都来自同一个代码库。这是一个批处理作业,而不是从用户请求中获取的面向互联网的 API。

于 2019-05-21T14:48:06.100 回答
3

您可以使用 AWS boto3 库 ( https://aws.amazon.com/sdk-for-python/ ) 通过 Python 脚本运行您的 EC2 实例。因此,一种可能的解决方案是定期触发 Lambda 函数(您可以使用 Amazon Cloudwatch 进行定期事件),然后在该函数中使用 Python 脚本启动 EC2 实例。

在您的实例中,您可以将操作系统配置为每次启动时运行 Python 脚本,我建议您使用 Crontab(请参阅此链接https://www.instructables.com/id/Raspberry-Pi-Launch-Python-启动时脚本/ )

在脚本结束时,您可以将 Amazon SQS 事件触发到将关闭您的第一个实例的函数,然后调用将启动第二个脚本的另一个函数。

于 2019-05-06T13:46:24.530 回答
0

对于 2022 年,根据您的基础设施限制,我想说最简单的方法是在 Lambda 上设置脚本,然后使用所需参数从 CloudWatch 调用它们(创建规则):

https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html

这样,您可以将它们配置为独立运行或顺序运行,而不必担心设置和打开和关闭基础架构。

这适用于不太递归密集且一次运行不超过 15 分钟的脚本(Lambda 时间限制)

于 2022-01-27T17:00:22.853 回答