簡體   English   中英

在 AWS 中運行 python 腳本的最佳方式是什么?

[英]What is the best way to run python scripts in AWS?

我有三個 python 腳本, 1.py2.py3.py ,每個腳本都有 3 個運行時參數要傳遞。

這三個 python 程序都是相互獨立的。 所有 3 個都可能以批處理的順序方式運行,或者可能發生任何兩個可能會根據某些配置運行。

手動方法:

  1. 創建 EC2 實例,運行 python 腳本,將其關閉。
  2. 對下一個 python 腳本重復上述步驟。

自動化方式將通過 lambda 觸發上述過程,並使用某種服務組合復制上述過程。

在 AWS 中實現此功能的最佳方式是什么?

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。

您可以使用 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 事件觸發到將關閉您的第一個實例的函數,然后調用將啟動第二個腳本的另一個函數。

您可以使用meadowrun - 免責聲明我是維護者之一,顯然有偏見。

Meadowrun 是一個 Python 庫/工具,可以為您管理 EC2 實例,將 Python 代碼 + 環境依賴項移至它們,並輕松運行函數。

例如,您可以將腳本放在 Git 存儲庫中並像這樣運行它們:

import asyncio
from meadowrun import AllocCloudInstance, Deployment, run_function
from script_1 import run_1

async def main():
    results = await run_function(
        # the function to run on the EC2 instance
        lambda: run_1(arguments), 
        # properties of the VM that runs the function
        AllocCloudInstance( 
            logical_cpu_required=2,
            memory_gb_required=16,
            interruption_probability_threshold=15,
            cloud_provider="EC2"),
        # code+env to deploy on the VM, there's other options here
        Deployment.git_repo(
            "https://github.com/someuser/somerepo",
            conda_yml_file="env.yml",
        )
    )

然后它將為您創建一個具有給定要求的 EC2 實例(或者如果它已經存在,則重用一個實例 - 這對於按順序運行您的腳本可能很有用),在那里創建 python 代碼 + 環境,運行該函數並返回任何結果和輸出。

對於 2022 年,根據您的基礎設施限制,我想說最簡單的方法是在 Lambda 上設置腳本,然后使用所需參數從 CloudWatch 調用它們(創建規則):

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

這樣,您可以將它們配置為獨立運行或順序運行,而不必擔心設置和打開和關閉基礎架構。

這適用於不太遞歸密集且一次運行不超過 15 分鍾的腳本(Lambda 時間限制)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM