[서버 헬스체크] Github Actions를 활용한 서버 헬스체크

이정진·2023년 11월 16일
1

개발

목록 보기
1/8
post-thumbnail

서버 헬스체크

헬스체크의 필요성

  • 시스템 장애 방지
  • 비정상적인 동작에 대한 조기탐지
  • 성능 향상
  • 고가용성 보장

Passive Health Check

실제 API 요청에서 문제가 발생함을 인지하는 경우

서버에서 API 요청에 대해서 정상적인 응답이 되는지를 확인하는 방식으로 실제 API 요청이 없는 상황에서는 서버가 다운되었는지 확인할 수 없음.

Sentry

  • API 요청에 대하여 오류가 발생할 경우, Issue로 자동 등록
  • Slack과 연동 가능
  • 공식 문서

Active Health Check

주기적으로 서버에 요청을 보내 서버 헬스체크

요청을 보내는 Endpoint가 서버를 얼마나 대표하는지에 따라 달라질 수 있다는 특징을 가짐.

Github Actions

  • Github Actions의 schedule 트리거를 이용해 주기적으로 HTTP 요청을 보내는 방식으로 구현
  • Slack과 연동 가능

AWS LoadBalancer

  • 로드 밸런서에 Interval(주기), Path(경로), Timeout(응답 대기 시간), Threshold(임계치) 등을 설정하여 설정한 조건에 해당되지 않는 경우 서버가 다운된 상태로 간주
  • 공식 문서

BetterStack

  • 주기적으로 HTTP 요청을 보내 2XX로 응답이 오는지 검사하는 방식으로 동작
  • Slack과 연동 가능
  • 2달 무료 사용 후 유료 사용 필요
  • 공식 문서

Agent-based Health Check

서버에 설치된 에이전트가 서버 내부 상태 정보를 수집하여 체크하는 방식으로, 세밀한 서버 정보를 수집 가능

대규모 서버에서 주로 사용

Promethus

  • 주기적으로 모니터링 대상 시스템으로부터 데이터를 땡겨오는 방식으로 메트릭을 읽어서 수집
  • 쿠버네티스 환경의 모니터링 시스템으로 주로 활용
  • Grafana를 활용해 대시보드로 시각화 가능
  • 공식 문서

Datadog

  • 인프라, 어플리케이션 등의 상태 관찰 및 데이터 수집하는 모니터링 솔루션
  • 대시보드를 활용한 시각화 가능
  • 공식 문서

Github Actions 서버 헬스체크

워크 플로우 작성하기

name: "Release Health Check"

on:
  # 매 3시간마다 수행
  schedule:
    - cron: "0 */3 * * *"

jobs:
  healthcheck:
    # ubuntu 버전 지정
    runs-on: ubuntu-22.04
    steps:
      # 릴리즈 서버 헬스 체크 진행
      - name: Release API Health Check
        uses: jtalk/url-health-check-action@v3
        with:
          url: ${{ secrets.RELEASE_URI }}
          max-attempts: 3 # 시도 횟수
          retry-delay: 1s # 시도 간격

Github Marketplace에 올라와있는 스크립트를 기반으로 작성했다.
${{ secrets.BASEURI }}는 Github Actions의 secrets에 서버 주소를 등록해놓으면 된다.

Slack으로 연동하기

# 헬스 체크 결과 슬랙으로 연동
- name: action-slack
	uses: 8398a7/action-slack@v3
    with:
      status: ${{ job.status }}
      author_name: Github Action Health Check
      fields: repo,message,commit,action,eventName,ref,workflow,job,took # 보낼 정보들
    env:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEB_HOOK_URL }} # required
    if: always() # 스크립트 성공/실패 여부에 상관없이 항상 수행되도록 설정

위 코드를 헬스 체크 워크 플로우 마지막에 추가하면 된다.

위의 이미지와 같이 동작한다. (출처: 스크립트, 2023-11-17)

Slack의 알림을 받을 WEBHOOK_URL은 아래와 같은 방법으로 확인하면 된다.

  1. 받고자 하는 채널의 Apps에 들어가 App Directory로 접속한다.
  2. 아래의 화면에서 Incoming Webhook을 검색한다.
  3. Add to Slack 버튼을 클릭한다.
  4. 연결하고자 하는 채널을 선택한다.
  5. 발급된 Webohook URL을 Github Actions secrets로 등록한다.

Github Marketplace에는 다양한 Slack 알림 관련 스크립트들가 많으니, 입맛에 맞게 활용하면 될 것 같다.

최초 실행법

workflow_dispatch: 를 schedule 하단에 선언해서 적용하면 첫 workflow의 실행을 진행시킬 수 있다.

관련 오류


위와 같이 계속 오류가 발생했었다.
Scripts 내에 자동으로 잡힌 Github Token이 권한이 없어서 발생한 문제였다.
권한이 있는 Github Token 생성하여 Secrets로 포함시켜서 전달할 수 있도록 변경하였다.
아래의 코드를 slack과 관련된 step에서 with의 하위 항목에 추가하면 된다.

github_token: ${{ secrets.ACCESS_TOKEN_GIT }}

성공

레퍼런스

0개의 댓글