我正在试验 EC2 竞价实例,需要在终止之间保留一些数据。现在据我了解,当当前价格超过我的最高出价时,它将自动终止。我假设我拥有的任何初始化脚本都将在关机时运行,这样我就可以在卸载之前将数据推送到 EBS。
我的问题是,一旦价格下降,我怎样才能自动在新的现货实例上安装相同的 EBS 卷,因为它不会有我第一次加载到根卷上的任何初始化脚本?
我是否必须创建自定义 AMI,或者是否有其他方法可以实现这一点?
答案1
如果您只是希望实例每次运行时都从固定的起点开始,那么您可以:
创建自己的 AMI 并每次将其作为实例运行,或者
指定一个用户数据脚本,该脚本每次从标准基础 AMI 启动新实例时都会根据您的规范安装和配置软件。
如果您需要在实例运行之间保持状态,则需要将数据保存在实例/AMI 之外的某个位置。例如:
数据可以在 S3、SimpleDB、DynamoDB、RDS 等上保持更新。
您可以指定一个永久 EBS 卷,实例在启动时动态附加和挂载该卷。这可以通过用户数据脚本完成。
答案2
查看ec2-spotter 项目在 GitHub 上。它是为了解决您描述的问题而创建的。
@mcenzm 的回答中描述的问题(#1 至 #4)是真实存在的,并且在 ec2-spotter 中得到了正确处理。
答案3
我已经尝试了一段时间了,但 EC2 竞价实例和附加存储仍然存在许多问题。
- 您要附加的卷可能与实例不在同一区域?启动时无法指定区域。
- 使用初始化脚本进行内部连接是可行的,但是有点异步,所以您需要对其进行测试或
sleep 10
说。 我不明白为什么 AWS 控制台将“分区”显示为主块设备。也许是为了阻止我们在另一个分区上盗版 Windows 映像?(sda1 而不是 sda)。祝你好运找到分区表。
目前很难使用 CLI 从外部控制点进行连接,这使得使用快照进行版本控制变得困难。
因此,一般来说,我会将 ...tar.bz2 备份到另一个框中,然后在启动时填充“工作区”。这只适用于少量数据,因此使用两个卷对新 ami 进行基准测试是个好主意。无论如何,竞价实例对于“工作单元”或“可重新启动”工作非常有用,因此从服务器获取工作的概念已经确立。考虑到您正在等待 9 分钟才能启动,您可能不介意格式化(尽可能小的)磁盘。
EBS 仍然相当不稳定,您需要为“优化”支付额外费用。当实例“价格过高”时,它仍然比尝试在 90 秒左右上传完成的工作更快。
我认为这一切都会随着任何“弹性文件”的提供而改变。
答案4
可能的解决方案是使用 EBS 启动 EC2 Spot 实例,然后在不需要时停止 EC2 实例,然后重新启动,因为新功能 EBS 将重新连接。