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

时间:2019-05-06 13:39:15

标签: 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中实现此目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

要使以上各项正常工作,您基本上需要创建3个docker映像。 image1,image2,image3。然后将它们放在ECR中(如果不使用Fargate启动类型,Docker Hub也可以工作)。

除非每个工作都很庞大,否则我认为这没有道理。

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

main.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在冷启动时启动缓慢,但是可以在您的账户中使用竞价型实例。您可能需要针对AWS批次进行自定义AMI才能工作。也就是说,如果您想要更多存储空间。

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