![](/img/trans.png)
[英]What is the best way to run python scripts once per month in AWS?
[英]What is the best way to run python scripts in AWS?
我有三個 python 腳本, 1.py
、 2.py
和3.py
,每個腳本都有 3 個運行時參數要傳遞。
這三個 python 程序都是相互獨立的。 所有 3 個都可能以批處理的順序方式運行,或者可能發生任何兩個可能會根據某些配置運行。
手動方法:
自動化方式將通過 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.