4

在不可预测的时间(用户请求),我需要运行内存密集型作业。为此,我获得了一个现场或按需实例,并用标签将其标记为non_idle. 工作完成后(可能需要几个小时),我给它打上标签idle。由于 AWS 的按小时计费模型,我想保持该实例处于活动状态,直到另一个计费小时发生,以防另一个工作进入。如果有工作进入,则应重用该实例并将其标记为non_idle. 如果在此期间没有工作进入,则实例应终止。

AWS 是否为此提供现成的解决方案?据我所知,CloudWatch 无法设置应在特定时间运行的警报,更不用说使用 CPUUtilization 或实例的标签了。否则,也许我可以简单地为每个创建的实例设置一个 java 计时器或 scala actor,在实例创建后每小时运行一次并检查 tag idle

4

1 回答 1

3

对于这种细粒度优化,没有现成的 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

于 2013-04-09T10:38:24.493 回答