EC2 自动缩放 Python 脚本

EC2 Autoscale Python script

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

我的问题: 自动缩放到底是如何工作的?那些需要分别执行文件版本的单独实例(或虚拟服务器)?如果是这样,我该如何在那个实例上执行文件?创建一个在启动时自动执行脚本的 AMI 映像?我找到了一种方法,只需使用图像启动实例,然后使用 user_data 参数将脚本发送到 运行,但这在自动缩放中如何工作?就像我说的,那些也是独立的实例吗?还是这只是一个例子,它可以在扩展时提供更多 cpu 功能和内存?

我正在创建一个 Python 脚本,它使用我在 cronjob 中 运行 的 boto 的自动缩放界面 (http://boto.readthedocs.org/en/latest/autoscale_tut.html)。它需要每天多次检查 SQS,并根据队列消息的数量增加或减少实例。那是正确的方法吗?

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

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

因此,您基本上只是在模拟 AWS 自动缩放的工作流程,同时还注入了您自己的引导程序:

放大:

  • 生成新实例
  • 检查健康状况
  • 附加到 ELB
  • 检查 HTTP 健康状况(或您设置的任何其他健康状况检查)并让流量通过。

缩小:

  • 从 ELB 中移除
  • 终止实例

我启动引导程序的首选方法是加载一个简单的脚本来下载第二个 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脚本,新实例应该能够加入农场。