答案1
截至 2013 年 1 月亚马逊云监控提供选项使用 Amazon CloudWatch 检测并关闭未使用的 Amazon EC2 实例请参阅介绍性博客文章Amazon CloudWatch - 警报操作有关此功能的详细信息:
今天我们让你能够停止或终止触发 CloudWatch 警报时您的 EC2 实例。您可以将其用作故障保护(检测异常情况然后采取行动)或作为应用程序处理逻辑的一部分(等待预期情况然后采取行动)。[重点是我的]
您的用例列于第节安全理念具体来说:
如果您(或您的开发人员)健忘,您可以检测未使用的 EC2 实例并将其关闭。您可以通过检测长时间内非常低的平均负载来做到这一点。这种故障保护可用于确保您不会为实际上未使用的资源付费,从而减少您的 AWS 账单。
如上所述,这取决于能否启发式地检测触发警报和停止实例的适当条件 - 您可以通过以下方式将其提升到一个新的水平发布自定义指标根据登录的 SSH 用户数、空闲时间等信息监控 CloudWatch,从而对所需的检测和关闭过程获得更多的控制/精度。
答案2
对于不需要设置其他服务且不依赖于使用情况指标的独立解决方案,请将此脚本设置为按计划运行:
#!/bin/bash
#
# Shuts down the host on inactivity.
#
# Designed to be executed as root from a cron job.
# It will power off on the 2nd consecutive run without an active ssh session.
# That prevents an undesirable shutdown when the machine was just started, or on a brief disconnect.
#
# To enable, add this entry to /etc/crontab:
# */5 * * * * root /home/ubuntu/dotfiles/bin/shutdown-if-inactive
#
set -o nounset -o errexit -o pipefail
MARKER_FILE="/tmp/ssh-inactivity-flag"
STATUS=$(netstat | grep ssh | grep ESTABLISHED &>/dev/null && echo active || echo inactive)
if [ "$STATUS" == "inactive" ]; then
if [ -f "$MARKER_FILE" ]; then
echo "Powering off due to ssh inactivity."
poweroff # See https://unix.stackexchange.com/a/196014/56711
else
# Create a marker file so that it will shut down if still inactive on the next time this script runs.
touch "$MARKER_FILE"
fi
else
# Delete marker file if it exists
rm --force "$MARKER_FILE"
fi
要每 5 分钟运行一次此脚本,并在 10 分钟不活动后关闭实例,请将此条目添加到/etc/crontab
:
*/5 * * * * root /home/ubuntu/bin/shutdown-if-inactive
更改/home/ubuntu/bin
为保存脚本的路径。
这是在运行 Ubuntu 20.04 的 EC2 实例上测试的。请参阅来源。
这扩展了@dmohr 的回答。
答案3
您可以在实例本身上创建一个 cron 作业脚本,使用如下命令
netstat | grep ssh | grep ESTABLISHED
如果没有返回结果,则将其写入文件,然后 cron 再次尝试,如果再次没有返回结果,则脚本运行该脚本。
/sbin/shutdown -h now
答案4
我还有一些仅偶尔使用的 EC2 实例。这是一个 systemd 服务当一段时间内没有 SSH 活动时,我会关闭实例。