LOADING
Daily
자동 포스팅이 조용히 멈춘 이유 — pg_cron은 성공인데 글은 안 올라온 이유
2026.09.02· 1분 읽기· 1· 0
이 블로그의 자동 포스팅이 몇 달째 멈춰있었는데, cron 로그는 전부 성공이었다. 원인을 추적한 기록.
증상
이 블로그는 Supabase Edge Functions(Deno) + Gemini API로 주 2회(월·목) 새 글을 자동으로 쓰고, 일요일마다 다음 글감을 미리 생성해두는 구조로 운영했다. 그런데 최근 글 목록을 보니 발행일이 7월 중순에서 멈춰 있었다.
첫 번째 함정 — cron 로그는 다 "성공"이었다
cron.job_run_details를 조회하면 매주 월·목·일 실행 기록이 전부 succeeded로 찍혀 있었다.
1select jobid, jobname, status, start_time 2from cron.job_run_details 3order by start_time desc 4limit 10;
여기서 착각하기 쉬운 지점이 있다. pg_cron이 실행하는 명령은 실제 로직이 아니라 net.http_post() 한 줄이다.
1select net.http_post( 2 url := '.../functions/v1/auto-blog-post', 3 headers := '{"Content-Type": "application/json"}'::jsonb, 4 body := '{}'::jsonb 5);
net.http_post는 HTTP 요청을 큐에 넣는 것까지만 pg_cron의 책임이고, 그 요청이 실제로 어떤 응답을 받았는지는 별개다. 그래서 "cron 성공"과 "함수 성공"은 완전히 다른 이야기였다.
실제 원인 — Edge Function 레벨의 500
Edge Function 호출 로그(function_edge_logs)를 따로 확인하니 그제야 보였다.
POST | 500 | .../functions/v1/auto-generate-topics
직접 함수를 호출해서 응답 바디를 받아보니 원인이 명확했다.
1{"error":"GEMINI_API_KEY env missing"}
프로젝트를 옮기는 과정에서 Edge Function 시크릿에 GEMINI_API_KEY가 등록되지 않은 상태였다. 토픽 생성 함수도, 글 작성 함수도 둘 다 이 키를 함수 맨 앞에서 확인하기 때문에, 키가 없으면 아무 것도 못 하고 바로 에러를 반환한다 — 그리고 그 에러는 cron 로그에는 전혀 드러나지 않는다.
배운 것
- "스케줄러가 실행됐다"와 "작업이 성공했다"는 다른 레이어다.
net.http_post기반 cron은 요청 발사 성공 여부만 기록하지, 응답 코드는 별도로 확인해야 한다. - Edge Function처럼 완전 서버리스인 자동화는 실패해도 알림이 오지 않는다. 실패 시 상태 코드를 별도로 기록하거나, 4xx/5xx일 때 알림을 보내는 장치가 필요했다.
- 원인은 결국 단순했다 — 환경 변수 하나. 그런데 그걸 확인하기까지 "cron 로그 확인 → 응답 코드 확인 → 함수 직접 호출" 세 단계를 거쳐야 했다. 다음엔 함수 자체에 헬스체크용 엔드포인트를 하나 더 추가해둘 생각이다.
0
이 글이 도움이 되셨나요?