EC2自动缩放Python脚本

时间:2015-05-10 19:27:11

标签: python amazon-web-services amazon-ec2

我想在EC2上运行python脚本。 python脚本需要加载.pickle文件。该脚本从Amazon队列(SQS)获取文档并处理它们。

我的问题: 自动缩放是如何工作的?这些单独的实例(或虚拟服务器)是否需要分别执行文件的版本?如果是这种情况,我该如何在该实例上执行该文件?创建一个AMI映像,在启动时自动执行脚本?我找到了一种方法来启动带有图像的实例并发送脚本以使用user_data参数运行,但是这如何在自动缩放上运行?就像我说的那样,那些单独的实例也是如此吗?或者这只是一个实例,它可以扩大更多的CPU功率和内存?

我正在创建一个Python脚本,它使用我在cronjob中运行的boto的自动缩放接口(http://boto.readthedocs.org/en/latest/autoscale_tut.html)。它需要每天多次检查SQS,并根据队列消息的数量向上或向下扩展实例。那是不是正确的方式?

1 个答案:

答案 0 :(得分:3)

埃里克,这听起来像是在正确的轨道上。我认为在EC2中加入内置自动缩放过程中的一些想法可能会对您有所帮助:

  • 是的,我会构建一个主AMI,其中包含您需要的所有内容。自动缩放通常通过缩放“out / in”(添加更多/更少实例)而不是缩放“up / down”(增大/缩小实例类型)来工作。这有助于为您提供更大的弹性,并且无需在重新调整大小后重新启动停机时间。
  • 当你完成用户数据字段时,你可以在AMI中构建一个在预热时运行特定更新或操作的引导脚本,或者只是构建一个可以下载脚本的检索脚本(也许来自S3)然后被执行。 [如果您使用内置IAM角色来确保S3存储桶的安全性,则无需在AMI中嵌入密钥以进行此下载。]
  • 如果自动扩展组中的所有内容都在负载均衡器后面运行,那么您应该在健康时将新实例附加到ELB(或您自己的HAproxy实例)。

所以你基本上只是模仿AWS自动缩放的工作流程,同时也注入你自己的bootstrapping:

向上扩展:

  • 产生新实例
  • 检查健康状况
  • 附加到ELB
  • 检查HTTP运行状况(或您设置的任何其他运行状况检查)并让流量传入其中。

缩小规模:

  • 从ELB中删除
  • 终止实例

启动引导的首选方法是使用user-data字段加载一个简单的脚本来下载第二个shell脚本。我通常用bash做到这一点,但世界上没有理由它不能成为python脚本。但是这种方式引导脚本是隔离的(并没有卡在AMI中),因此我可以自由更新或调整它,而无需重新执行AMI。

AMI /root/scripts/bootstrap-me.sh内置的脚本可能只包含:

#!/bin/bash 

/usr/bin/aws s3 cp s3://my.bucket/my-init-script.py ./  
/usr/bin/python my-init-script.py
/usr/bin/aws s3 cp s3://my.bucket/here-is-my.pickle ./

然后你的my-init-script.py可以包含你需要的任何基于python的逻辑,包括执行你刚刚抓到的.pickle文件。

无论何时手动或自动触发自动扩展(扩展),您都应该只传递用户数据来执行bootstrap-me.sh shell脚本,新实例应该能够加入服务器场。