亚马逊SQS、Boto和Python:从亚马逊EC2获取并运行脚本

3
我正在尝试在Amazon EC2上运行一组Python脚本。这篇帮助指南建议使用Amazon SQS来管理队列。从该指南中,我了解到如何启动EC2实例并从我的计算机向队列发送作业,但我不明白如何设置EC2实例,使其在从队列中获取Python脚本后运行该脚本,然后将结果保存到Amazon S3。如何获取、在EC2服务器上运行并将Python脚本的结果保存到S3?
2个回答

5
在提到的指南中,您可以找到一个链接到Github存储库的示例代码。这是一个可行的示例,回答了您的问题。它有很好的文档和易于阅读。
具体来说,请仔细查看pdf/tasks.py源代码。简而言之,它使用ec2.run_instances启动带有引导Bash脚本的EC2实例,该脚本执行以下操作:
  • 使用apt-get更新实例
  • 在循环中使用boto.connect_sqs连接SQS并获取任务
  • 执行任务
  • 使用boto.connect_s3()连接S3并上传结果
  • 当脚本完成时关闭实例。
更新 此外,CheckResponseQueueTask是使用Celery.PeriodicTaskSQS周期性出队消息并处理它们的好例子。请参阅BOOTSTRAP_SCRIPT,第51-57行源代码,以获取演示结果上传到S3的示例代码。而CheckQueueLevelsTask则说明了在任务数量超过实例数量的情况下,使用队列处理器启动新实例和引导。请参考第214-244行。

你的更新非常有帮助,alko。我相信我现在明白了这个脚本是如何引导实例、从队列中检索任务并保存到S3的,但新引导的实例执行的任务在哪里?它是160-173行,只是将文件传输到特定的S3存储桶吗?如果我想在保存到S3之前添加一个额外的任务,比如从队列中取出x并将f(x)的结果保存到S3,我应该在代码的哪里添加? - Michael
你可能想要将链接中的代码复制到你的答案中,并添加注释,这样即使链接失效,你的答案也不会失效。再次感谢你的所有帮助。 - Michael
所有在新实例上执行的代码都是用BOOTSTRAP_SCRIPT编写的。它是bash脚本!魔法(数据处理)发生在第99-104行的subprocess.Popen中。请注意,此脚本在循环中使用python -c语法(21)运行,并且当在10秒延迟后连续10次未获取到数据时,它将结束(81),并关闭系统(125)。参考括号中的行号。 - alko
有18个git分支,其中一个是我的 ;) 有很多代码,我觉得把它们全部复制到这里不太合适。 - alko
脚本是通过神奇的242行user_data=startup参数传递给boto.ec2.run_instances函数来运行的。事实上,我之前并不知道这个功能,但发现它非常有用 :) - alko
好的,所以在BOOTSTRAP_SCRIPT中之前定义的任何函数显然也可以在脚本中调用,该脚本在EC2实例上运行。仍需要逐步处理整个脚本并修改它以符合我的目的,但这终于有意义了!奖励已发放。 - Michael

2
一种方法是在您的 EC2 实例上运行 Celery,它可以直接使用 AWS SQS 作为任务代理。
有关如何使用 Celery 和 AWS SQS 的信息,请参见http://docs.celeryproject.org/en/latest/getting-started/brokers/sqs.html
Celery 还支持并发和多个工作进程。这意味着您可以在多个 EC2 实例上运行 Celery,监听同一个 AWS SQS 队列,任务将自动分配给不同实例。

Celery似乎会是一个巨大的帮助。然而,文档被分成了程序的每个小部分,我很难将它们拼凑在一起。你能提供或指向一个注释样本代码,从Amazon SQS获取数据,使用SQS/S3的输入运行函数,然后将输出保存到S3吗?理想情况下,代码还可以启动EC2实例。 - Michael
请查看以下代码,celery 用于运行异步任务,https://github.com/paltman/django-pdf/blob/master/pdf/tasks.py。实际上,“CheckResponseQueueTask” 是一个定期消息出队和处理的示例代码。我已相应地更新了我的答案。 - alko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接