如何终止EC2实例并在每个实例上上传/运行启动脚本?

55

我想自动化启动一组Linux EC2实例。

基本上,我想编写一个脚本/程序来:

  • 实例化我的给定AMI的N个副本。
  • 对于每个已启动的实例,它会上传一个定制的脚本并让脚本运行到该实例中。

在VMWare中,我通常会使用vmrun或Vix SDK来完成此操作。

在Amazon AWS / EC2中有哪些选项?

2个回答

86
答案有点依赖于您正在运行的AMI,因为所提供的功能完全取决于AMI。Amazon Linux AMI和官方Ubuntu AMI已安装cloud-init包。这有许多方法可以触发启动操作,但最符合您要求的(也是我最喜欢的,因为我发明了它)是user-data script的概念。您只需在启动EC2实例时传递任何脚本(以#!两个字符开头),它将在实例的第一次引导时作为root运行。关于如何使用此方法的具体示例,请参见我的最新文章:Uploading Known ssh Host Key in EC2 user-data Script。您还想使用相同脚本运行多个EC2实例。ec2-run-instances命令及其相关API和Web控制台允许您指定任意数量的实例以相同的用户数据启动。例如:
ec2-run-instances            \
  --instance-count 10        \
  --user-data-file $MYSCRIPT \
  --key $USER                \
  $SOMEAMI

如果你当前运行的AMI没有安装cloud-init,你可以选择以下其中一种方法:
  • 切换到已安装cloud-init的AMI,或者

  • 构建一个定制版本的AMI并安装cloud-init,或者

  • 编写一个更复杂的包装脚本,记录所有实例ID,等待所有实例进入运行状态,等待sshd接受连接,将启动脚本上传到每个实例,并在每个实例上运行启动脚本。


21
在SO上的一件好事是,当你开始找到一些提示时,那个在所有谷歌查询中名字开始出现并亲自回答你问题的人已经出现了。太棒了 :-) - Serge Wautier
我会避免上面答案中的第三个选项。我曾经遇到过两个不同的问题。1)一个实例有一个你之前见过的IP地址,但是known_hosts条目不匹配。2)上传和控制所有实例和启动脚本的机器负载过重,导致一些东西出现故障。 - Nate
10
SO最好的名言:“因为我创造了它,所以它是我的最爱。” - Mr. T
1
Hrishikesh Kale:这取决于您正在运行哪个Debian AMI。官方的Debian AMI正在不断改进。它们目前支持用户数据脚本,并最终应该具有完整的cloud-init软件。 - Eric Hammond
有没有使用Spot请求的方法来完成这个任务? - Sam Stoelinga
显示剩余2条评论

2

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