对于这种细粒度优化,没有现成的 AWS 解决方案,但您可以使用现有的构建块根据当前实例的启动时间构建您自己的(请参阅 Dmitriy Samovskiy 的智能解决方案,用于推断此 EC2 实例多久以前开始了?)。
玩“鸡”
Shlomo Swidler 在他的文章Play “Chicken” with Spot Instances中探讨了这种优化,尽管在Amazon EC2 Spot 实例的背景下动机略有不同:
AWS Spot 实例有一个有趣的经济特性,可以让系统玩一些游戏。与所有 EC2 实例一样,当您开始终止 Spot 实例时,即使您使用的时间不到一小时,您也会产生一小时的费用。但是,当 AWS 因现货价格超过投标价格而终止实例时,您无需为当前小时付费。
当然,机制是相同的,因此您可以简单地重用他组装的脚本,即执行此脚本而不是将实例标记为idle
:
#! /bin/bash
t=/tmp/ec2.running.seconds.$$
if wget -q -O $t http://169.254.169.254/latest/meta-data/local-ipv4 ; then
# add 60 seconds artificially as a safety margin
let runningSecs=$(( `date +%s` - `date -r $t +%s` ))+60
rm -f $t
let runningSecsThisHour=$runningSecs%3600
let runningMinsThisHour=$runningSecsThisHour/60
let leftMins=60-$runningMinsThisHour
# start shutdown one minute earlier than actually required
let shutdownDelayMins=$leftMins-1
if [[ $shutdownDelayMins > 1 && $shutdownDelayMins < 60 ]]; then
echo "Shutting down in $shutdownDelayMins mins."
# TODO: Notify off-instance listener that the game of chicken has begun
sudo shutdown -h +$shutdownDelayMins
else
echo "Shutting down now."
sudo shutdown -h now
fi
exit 0
fi
echo "Failed to determine remaining minutes in this billable hour. Terminating now."
sudo shutdown -h now
exit 1
一旦有工作进入,您就可以取消预定的终止,而不是或除了标记实例,non_idle
如下所示:
sudo shutdown -c
这也是测试/操作期间的“红色按钮”紧急命令,参见例如 Shlomo 的警告:
在使用它之前,请确保您真正了解此脚本的作用。如果您错误地安排了要关闭的实例,您可以使用此命令取消它,在实例上运行:sudo shutdown -c
将 CloudWatch 添加到游戏中
您可以通过与Amazon CloudWatch集成来进一步采用 Shlomo 的自包含方法,该方法最近添加了使用 Amazon CloudWatch 检测和关闭未使用的 Amazon EC2 实例的选项,有关详细信息,请参阅介绍性博客文章Amazon CloudWatch - 警报操作:
今天,我们让您能够在触发 CloudWatch 警报时停止或终止您的 EC2 实例。您可以将其用作故障保护(检测异常情况然后采取行动)或作为应用程序处理逻辑的一部分(等待预期条件然后采取行动)。[强调我的]
您的用例具体列在应用程序集成部分中:
您还可以根据您逐个实例观察到的自定义指标创建 CloudWatch 警报。例如,您可以衡量每分钟对您自己的 Web 服务 API 的调用、页面请求或消息发布,并根据需要进行响应。
因此,您可以通过向 CloudWatch发布自定义指标来利用这一新功能,以指示实例是否应根据 Dmitriy 的启动时间检测终止 (is ),并在有作业进入且实例应继续运行 (is )idle
后再次重置指标-就像 EC2 将负责终止一样,3 个自动化步骤中的 2 个将从实例转移到操作环境中,并且自动化过程的管理和可见性相应得到改善。non_idle