代码之家  ›  专栏  ›  技术社区  ›  juanmirocks

如果在另一个计费小时之前处于空闲状态,则关闭EC2实例

  •  4
  • juanmirocks  · 技术社区  · 12 年前

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

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

    1 回复  |  直到 12 年前
        1
  •  3
  •   Steffen Opel Norm Johanson    12 年前

    对于这种细粒度优化,没有现成的AWS解决方案,但您可以使用现有的构建块来根据当前实例的启动时间构建自己的构建块(请参阅Dmitriy Samovskiy的智能解决方案进行推导 How Long Ago Was This EC2 Instance Started? ).

    玩“小鸡”

    Shlomo Swidler在他的文章中探讨了这种优化 Play “Chicken” with Spot Instances ,尽管在 Amazon EC2 Spot Instances :

    AWS Spot实例具有一个有趣的经济特征 使之有可能对系统进行一点博弈。像所有EC2实例一样, 当您启动终止点实例时,您将引发 即使你用了不到一个小时,也要充电一个小时。 但是,当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 ,最近为添加了一个选项 Use Amazon CloudWatch to Detect and Shut Down Unused Amazon EC2 Instances ,请参阅介绍性博客文章 Amazon CloudWatch - Alarm Actions 详细信息:

    今天,我们将为您提供 停止 或终止 您的EC2 触发CloudWatch警报的实例 。您可以将其用作 故障保护(检测异常情况,然后采取行动)或作为 您的应用程序的处理逻辑(等待预期的条件和 然后行动)。 [强调矿]

    您的用例在第节中列出 应用程序集成 明确地:

    您还可以基于 Custom Metrics 你 根据具体情况进行观察。例如,你可以, 测量对您自己的web服务API、页面请求或消息的调用 每分钟发布,并根据需要进行响应。

    因此,您可以通过以下方式利用此新功能 Publishing Custom Metrics 到CloudWatch以指示实例是否应终止( 闲置的 )基于和Dmitriy的发射时间检测,并再次重置度量 一份工作来了 并且一个实例应该继续运行( 不可用(_I) )-像这样,EC2将负责终止,3个自动化步骤中的2个将从实例转移到操作环境中,自动化过程的管理和可见性也相应提高。