在 AWS 中运行 python 脚本的最佳方式是什么?

Par*_*ose 12 python amazon-web-services aws-lambda aws-step-functions aws-batch

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

所有三个 python 程序都是相互独立的。所有 3 个可能会以批量方式按顺序运行,或者可能会发生任意两个运行,具体取决于某些配置。

手动方法:

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

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

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

小智 7

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 ...
Run Code Online (Sandbox Code Playgroud)

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

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


小智 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 事件,该函数将关闭第一个实例,然后调用另一个函数来启动第二个脚本。