프로젝트/장기 프로젝트

MOTI #6. Github Actions 활용한 API 서버 헬스 체크

Chipmunks 2024. 7. 23. 07:45
728x90

지난 글에서 API 서버 접속이 한 달간 안되는 장애가 있었다.

 

 

[MOTI] 인증서 만료로 인한 API 서버 접속 장애 해결

한 달 전부터 MOTI 데이터가 안 쌓였다.꽤 최근에 신경을 썼었는데...잠깐 신경을 끈 새에 6/23 부터 한 달 동안 접속이 안됐다. 우선 RDS Public 엔드포인트로 설정되어 있어 과금이 되었다.이를 SSH Tu

itchipmunk.tistory.com

 

사용자가 적지만, 유저가 이탈하여 속상하다.

그래도 오랜 기간 안되도 유저가 다시 유입되더라(?!)

부디 이번까지 유효하기를 바란다.

 

Github Actions 으로 주기적으로 API 서버를 호출해 헬스 체크해주는 Cron 스크립트를 만들었다.

8시간 마다 체크해주고 실패하면 이메일로 워크플로우 실행 실패 알림이 날라온다.

도메인 인증서 만료 / 기타 이슈로 API 서버 접속에 실패하면 알림이 날라올 것 이다.

다행히 메일은 개인 메신저보다 자주 보는 편이라 빨리 눈치챌 수 있다.

 

워크 플로우 코드는 아래와같다.

작성은 별도 에디터 없이 깃허브 레포지토리 사이트에서 파일을 추가했다.

'.github/workflows/health-check.yml' 파일로 작성했다.

name: "API Health Check"

on:
  schedule:
    - cron: "0 */8 * * *"

jobs:
  healthcheck:
    runs-on: ubuntu-22.04
    steps:
      - name: Release API Health Check
        uses: jtalk/url-health-check-action@v3
        with:
          url: ${{ secrets.API_URL }}
          max-attempts: 3 # 시도 횟수
          retry-delay: 1s # 시도 간격

 

${{ secrets.API_URL }} 을 지정해주기 위해

Github 레포지토리의 Settings 에서 Secrets 환경 변수를 설정한다.

Settings > Security > Secrets and variables > Repository secrets 에서

'API_URL' 이름으로 추가한다.

 

API_URL 환경 변수 설정

 

API 서버에서 /health 엔드포인트로 단순 200 OK 를 내려준다.

해당 엔드포인트로 URL을 설정해줬다.

만약 nginx 를 사용하고 있다면 헬스 체크용으로 설정해줘도 괜찮을 것 같다.

 

테스트 용으로 cron 을 매 5분(Github Actions 최소 설정 시간)으로 설정했다.

또한 잘못된 API_URL 주소를 넣었다.

on:
  schedule:
    - cron: "*/5 * * * *"

 

그럼 5분 ~ 10분 후 아래와 같이 워크플로우 실패 메시지가 메일로 날라온다.

실패 메일

 

워크 플로우 실행 결과는 아래와 같다.

워크 플로우에서 실행한 세 번의 Retry 를 진행한 후

마지막까지 실패하면 오류를 내뿜는다.

워크 플로우가 오류로 마치면 메일로 알림이 날라오는 구조다.

 

참고로 Github Actions 의 cron 스케쥴은 정확하지 않다.

엄청난 유저 수의 cron 을 처리하다 보니 큐에 쌓여 딜레이가 생긴다.

cron 설정을 잘 했다면, 충분히 여유를 갖고 기다리면 워크플로우가 실행된다.

 

하루마다 오전 9시에 돌리는 워크플로우가 10시 22분에 실행되곤 한다.

cron 마다 달라지는 것으로 보인다.

한달마다 오전 9시에 돌리는 건 9시 52분에 실행된다.

남들이 안할 것 같은 cron 으로 돌리면 빠르게 실행된다. (그래도 느리겠지만)

 

테스트를 완료했다면 다시 'API_URL' 을 원래대로 되돌린다.

사전에 방지를 못하더라도 장애 복구 시간은 한 달 보단 월등히 빨라질 것으로 기대된다.