장애 대응 AI 에이전트는 싼 사전 검사가 이상을 볼 때만 깨운다
5분마다 셸 스크립트가 지표·상태 점검·OOM 기록을 모으고 exit 0/1로만 판단한다. 이상할 때만 근거 파일을 남기고 에이전트를 깨운다. 에이전트 절차서와 시험 모드도 함께 둔다.
문제
장애가 나면 AI 에이전트가 알아서 살펴보고 대응하게 하고 싶습니다. 그런데 에이전트를 5분마다 깨워 「괜찮은지 봐」라고 하면, 거의 모든 실행이 「정상」을 확인하는 데 토큰과 시간을 씁니다. 판단도 실행마다 조금씩 달라집니다.
해법: 판단은 스크립트, 대응은 에이전트
- 사전 검사는 셸 스크립트로 만들고 결과는 종료 코드 하나로만 냅니다. exit 0은 「이상 → 깨운다」, exit 1은 「정상이거나 판단 불가 → 건너뛴다」입니다. 신호를 모으지 못했을 때도 깨우지 않습니다.
- 근거를 파일로 남깁니다. 깨운 이유(어떤 지표가 몇이었는지)를
state/reason에 적고, 에이전트는 그 파일부터 읽습니다. - 쿨다운을 둡니다. 대응 중에는 재부팅 같은 조치 때문에 신호가 계속 뜹니다. 한 번 깨웠으면 20분쯤은 다시 깨우지 않습니다.
- 신호 하나로는 깨우지 않습니다. 접속 실패 하나는 네트워크 순간 끊김일 수 있으니, 다른 신호가 같이 있을 때만 깨웁니다.
에이전트 절차서에 넣을 것
- 가장 먼저 사람에게 알림: 조사보다 앞에 둡니다.
- 되돌리기 어려운 행동의 조건을 숫자로 적습니다. 예: 「3분 동안 접속이 안 되고 상태 점검이 3개 이상 실패할 때만 재부팅, 한 번만」.
- 하지 않는 것 목록: 인스턴스 삭제, DB 멈추기, 코드 수정, 비밀값 출력 같은 것들입니다.
- 시험 모드: 근거 파일에 「[시험]」 표시가 있으면 위험한 단계는 「건너뜀」으로 보고하고 나머지는 끝까지 돕니다. 실제로 한 번 리허설해 보면 알림 명령의 형식 오류처럼 사고 때 처음 드러날 문제를 미리 찾습니다.
#!/usr/bin/env bash
# 5분마다 실행. exit 0 = 이상(에이전트 깨움), exit 1 = 정상·판단 불가(건너뜀)
STATE=./state; mkdir -p "$STATE"; now=$(date +%s)
last=$(cat "$STATE/last" 2>/dev/null || echo 0)
[ $((now - last)) -lt 1200 ] && exit 1 # 대응 중엔 다시 깨우지 않는다
if [ -f "$STATE/force" ]; then # 시험 모드: 한 번만 깨운다
rm -f "$STATE/force"; echo "[시험] 위험 단계 건너뛰기" > "$STATE/reason"
echo "$now" > "$STATE/last"; exit 0
fi
reasons=()
mem=$(memory_percent) || exit 1 # 신호를 못 모으면 판단 불가
[ "${mem%.*}" -ge 92 ] && reasons+=("메모리 ${mem}%")
fails=$(failing_health_checks | wc -w)
[ "$fails" -ge 5 ] && reasons+=("상태 점검 실패 ${fails}개")
[ "$(recent_oom_kills)" -gt 0 ] && reasons+=("최근 OOM 종료 기록")
[ ${#reasons[@]} -eq 0 ] && exit 1
{ date; printf -- '- %s\n' "${reasons[@]}"; } > "$STATE/reason"
echo "$now" > "$STATE/last"; exit 0
스케줄러에는 ./precheck.sh && <에이전트 실행 명령> RUNBOOK.md처럼 묶어 두면, 평소 실행은 스크립트 한 번으로 끝납니다.