如何触发 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 实例并在每个实例上上传/运行启动脚本?的主要内容,如果未能解决你的问题,请参考以下文章

在自动扩展组中的 EC2 启动和关闭时运行命令

如何使用 CloudFormation 在现有 EC2 实例上启动容器?

Cloudformation 模板 - 如何确保 EC2 实例启动后特定服务正在运行

带有python脚本的ec2instance自动化[重复]

如何在 AWS EC2 实例上激活 GPU 的使用?

如何将 redshift 数据库连接到在 ec2 实例上运行的 bash 脚本