2013-10-18 72 views
3

我試圖在Amazon EC2上運行一組python腳本。此help guide建議使用Amazon SQS來管理隊列。在本指南中,我瞭解如何引導EC2實例並從我的計算機將作業發送到隊列,但我不知道如何設置EC2實例,以便在從其中獲取EC2實例後運行Python腳本排隊,然後將結果保存到Amazon S3。我如何獲取,在EC2服務器上運行,並將結果保存到Python腳本的S3中?Amazon SQS,Boto和Python:在Amazon EC2上獲取和運行腳本

回答

5

在上述指南中,您可以找到帶有示例代碼的github repository的鏈接。這是一個工作的例子,回答你的問題。它有據可查,易於閱讀。

也就是說,仔細看pdf/tasks.py的源代碼。總之,它使用ec2.run_instances來啓動EC2實例與自舉bash腳本:

    在一個循環中與 apt-get
  • 更新實例使用boto.connect_sqs連接到SQS和取任務
  • 執行任務
  • 使用boto.connect_s3()連接到S3並上載結果
  • 腳本結束時關閉實例。

UPDATE

此外,CheckResponseQueueTask與​​從SQS並處理它們pereodic出隊的消息的一個很好的例子。查看BOOTSTRAP_SCRIPT,源代碼行51-57,查看示例代碼,說明結果上傳到S3。並且CheckQueueLevelsTask說明在任務數量超過實例數的情況下,使用隊列處理器引導和引導新實例。 214-244行供參考。

+0

你的更新是非常有用的alko。我相信我現在可以理解你鏈接到的這個腳本如何引導實例,從隊列中檢索任務並保存到S3,但新引導的實例執行的任務在哪裏?它是160-173行,只是將文件傳輸到特定的S3存儲桶?如果我想在保存到S3之前添加一個額外的任務來執行,比如說從隊列中取出x並將f(x)的結果保存到S3中,我將如何將它添加到代碼中? – Michael

+0

您可能希望將鏈接中的代碼複製到您的答案中並添加註釋,以便在鏈接死亡後您的答案不會消失。再次感謝您的幫助。 – Michael

+0

在新實例上執行的所有代碼都以'BOOTSTRAP_SCRIPT'寫入。 **這是'bash'腳本!**魔法(數據處理)在'subprocess.Popen'上發生,位於第99-104行。看到這個腳本在循環(75)中用'python -c'語法(21)運行,並且當連續10次沒有數據被延遲10秒時獲取,它結束(81),系統關閉125)。參考制動器中的行數。 – alko

2

這樣做的一種方法是在您的EC2實例上運行Celery,該實例可以使用AWS SQS作爲開箱即用的任務代理。

使用芹菜和AWS SQS信息可以在這裏找到: http://docs.celeryproject.org/en/latest/getting-started/brokers/sqs.html

芹菜還支持併發和多工人。這意味着您可以讓多個運行Celery的EC2實例監聽一個AWS SQS隊列,並且這些任務將自動分配到您的實例中。

+0

芹菜似乎是一個巨大的幫助。然而,文檔分解成程序的每個小部分,我很難將它們拼湊在一起。您能否提供或指向我註釋從Amazon SQS獲取的示例代碼,使用來自SQS/S3的輸入運行函數,然後將輸出保存到S3。理想情況下,代碼也會啓動EC2實例。 – Michael

+0

查看上述代碼,芹菜用於運行異步任務,https://github.com/paltman/django-pdf/blob/master/pdf/tasks.py。實際上,'CheckResponseQueueTask'是週期消息出隊和處理的示例代碼。相應地更新我的答案 – alko