不使用Python脚本实现AWS Sagemaker闲置实例自动关停方案咨询
AWS SageMaker实例离线闲置1小时自动关停实现方案
完全可以通过本地bash脚本结合cron任务实现,无需拉取任何外部代码,所有依赖均为SageMaker实例默认预装组件,适配无外网环境。
1. 编写本地闲置检测关停脚本
在实例中创建路径/home/ec2-user/auto_stop_idle.sh,写入以下内容:
#!/bin/bash # 闲置时间阈值,单位秒,此处配置为1小时 IDLE_THRESHOLD=3600 # 获取当前时间戳 CURRENT_TIME=$(date +%s) # 初始化最后活跃时间为当前时间,避免无会话时误判 LAST_ACTIVE=$CURRENT_TIME # 检测Jupyter Notebook/Kernel活跃会话的最后活跃时间 SESSIONS=$(curl -s http://localhost:8888/api/sessions) if [ -n "$SESSIONS" ]; then SESSION_TIMES=$(echo "$SESSIONS" | grep -o '"last_activity":"[^"]*"' | cut -d'"' -f4) for TIME in $SESSION_TIMES; do SESSION_TIMESTAMP=$(date -d "$TIME" +%s 2>/dev/null) if [ $SESSION_TIMESTAMP -gt $LAST_ACTIVE ]; then LAST_ACTIVE=$SESSION_TIMESTAMP fi done fi # 可选:检测终端活跃状态,避免后台运行终端任务时被误关停 WHO_OUTPUT=$(who -u) if [ -n "$WHO_OUTPUT" ]; then while read -r LINE; do IDLE_STR=$(echo "$LINE" | awk '{print $6}') # 终端闲置时间为.表示当前活跃,格式为m:s表示闲置不足1小时 if [[ "$IDLE_STR" == "." || "$IDLE_STR" == *:* ]]; then LAST_ACTIVE=$CURRENT_TIME break fi done <<< "$WHO_OUTPUT" fi # 计算总闲置时长 IDLE_DURATION=$((CURRENT_TIME - LAST_ACTIVE)) if [ $IDLE_DURATION -ge $IDLE_THRESHOLD ]; then # 从本地元数据获取当前实例名称和所属区域 INSTANCE_NAME=$(grep '"ResourceName"' /opt/ml/metadata/resource-metadata.json | cut -d'"' -f4) REGION=$(grep '"ResourceArn"' /opt/ml/metadata/resource-metadata.json | cut -d'"' -f4 | cut -d':' -f4) # 执行关停操作 aws sagemaker stop-notebook-instance --notebook-instance-name "$INSTANCE_NAME" --region "$REGION" fi
2. 配置执行权限与定时任务
- 给脚本添加可执行权限:
chmod +x /home/ec2-user/auto_stop_idle.sh
- 编辑cron任务,设置每10分钟执行一次检测(可按需调整执行频率):
执行crontab -e,在打开的编辑器末尾添加以下行:
*/10 * * * * /bin/bash /home/ec2-user/auto_stop_idle.sh >> /var/log/auto_stop_idle.log 2>&1
保存退出后cron会自动加载新任务,所有运行日志会写入/var/log/auto_stop_idle.log方便排查问题。
3. 配置IAM权限
你需要给当前SageMaker实例绑定的执行角色添加sagemaker:StopNotebookInstance权限,否则脚本无法执行关停操作。
内容的提问来源于stack exchange,提问作者Faisal Shani
相关产品推荐
相关产品推荐

