如何触发 EC2 实例并在每个实例上上传/运行启动脚本?
Posted
技术标签:
【中文标题】如何触发 EC2 实例并在每个实例上上传/运行启动脚本?【英文标题】:How to fire EC2 instances and upload/run a startup script on each of them? 【发布时间】:2012-04-24 21:38:14 【问题描述】:我想自动启动一组 Linux EC2 实例。
基本上,我想编写一个脚本/程序:
实例化我的给定 AMI 的 N 次出现。 对于每个启动的实例,它会上传一个自定义脚本并让脚本运行到实例中。使用 VMWare,我通常会使用 vmrun 或 Vix SDK。
Amazon AWS/EC2 中有哪些选项?
【问题讨论】:
【参考方案1】:答案在一定程度上取决于您运行的 AMI,因为所提供的功能完全依赖于 AMI。
Amazon Linux AMIS 和官方 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,或
构建安装了 cloud-init 的自定义 AMI 版本,或
编写一个更复杂的包装脚本,记录所有实例启动后的 id,等待所有实例进入运行状态,等待 sshd 接受连接,上传您的启动脚本到每个实例,并在每个实例上运行启动脚本。
【讨论】:
SO 的好处之一是,当您开始寻找一些指针时,其名字开始出现在您的所有 google 查询中的人亲自回答了您的问题。太棒了:-) 我会避免上述答案的选项 3。这种方法我遇到了两个不同的陷阱。 1) 一个实例有一个您之前见过的 IP 地址,并且 known_hosts 条目不匹配。 2)上传和控制所有实例和启动脚本的机器超载,东西坏了 最佳引用 SO:“我最喜欢的,因为我发明了它” Hrishikesh Kale:这取决于您正在运行的 Debian AMI。官方 Debian AMI 正在改进中。他们目前支持用户数据脚本,并且最终应该拥有完整的 cloud-init 软件。 有什么办法可以通过现场请求做到这一点?【参考方案2】:我有 a tutorial to run the script in the "cloud-init",它在每次 AWS EC2 启动时运行。
设置配置文件(AWS CentOS6)和
在您启动 EC2 时运行脚本
要在 Linux 上设置配置文件,您可以参考configure cloud-init on AWS Linux。
我个人使用的是基于 Linux AMI 设置的AWS VPC/EBS,我没有在配置文件/etc/cloud/cloud.cfg
上进行任何操作,但我的boot script in the cloud-init 运行良好。
【讨论】:
以上是关于如何触发 EC2 实例并在每个实例上上传/运行启动脚本?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 CloudFormation 在现有 EC2 实例上启动容器?