[WhaTap] RDS Failover/Reboot 관제 2 – RDS Failover

안녕하세요 오늘은 BESPIN GLOBAL SRE실 지봉근님이 작성해주신 ‘[WhaTap] RDS Failover/Reboot 관제 2 – RDS Failover’에 대해 소개해드리도록 하겠습니다.

목차

  1. 개요
  2. 세부 내용
  3. 마치며

1. 개요

  • 목적: 본 문서는 WhaTap Failover / Reboot 관제를 위해 2

2. 세부 내용:

    2-1. 적용 배경:

    • WhaTap에서는 RDS Failover / Reboot을 감지할 수 있는 지표(Metric)이 별도로 존재하지 않습니다.
      • Failover / Reboot은 정확히는 지표(Metric)가 아닌 이벤트(Event)로 분류됩니다.
    • Failover / Reboot을 감지할 수 있도록 자동화 Script를 작성했으며, 대상 자동화를 통해 신규 RDS의 생성 혹은 삭제 등이 발생할 경우에도 자동으로 관제 가능하도록 구성했습니다.

    2-2. 주의 사항:

    • IAM Role / Access Key를 혼용해서 사용하는 경우에는 ‘권한’ 충돌이 발생하지 않도록 ‘Profile’ 등을 통해 구분해야 합니다. (RDS Describe 권한이 필요)
    • 해당 Script들은 AWS CLI를 통해 Query하는 부분이 있어 리소스를 과점유할 수 있으니, Crontab에는 ‘5분’ 정도의 여유 시간을 할애하는 것을 권장합니다.
    • 해당 Script는 ‘describe RDS’ Script가 선 실행되어 List 파일이 존재해야 합니다.
    • Script의 결과값을 WhaTap에 ‘json’ 형식으로 보낼 ‘focus’라는 WhaTap에서 제공하는 툴 다운로드가 필요합니다

    2-3. 코드 내용:

    • RDS_Failover_v2.0.sh:
    #!/bin/bash
    # Amazon Linux 1 / Amazon Linux 2 / CentOS / Redhat
    # Aurora RDS(Cluster) / RDS(Instance) - Failover Monitoring
    # License Key of the project to be installed
    # Type: String
    WHATAP_LICENSE=''
    # Project Code of the project to be installed
    # Type: Integer
    WHATAP_PCODE=
    # If it is a 'Proxy' configuration, the proxy server IP.
    # If it is a WhaTap collection server, the collection server IP listed in the WhaTap pr
    # Type: String
    WHATAP_HOST=''
    # Collect/save results with the 'Category' name specified below.
    # Type: String
    CATEGORY=''
    # Enter the 'Full Path' where 'Focus' file is located.
    # Type: String
    FOCUS_PATH=''
    # Enter the path where 'Script' will be located/operated.
    LOCATE_PATH=""
    # AWS CLI Output Type
    OUTPUT="text"
    # AWS CLI Target Region
    REGION="ap-northeast-2"
    EVENT="failover"
    # for Aurora RDS
    CLUSTER_KEYWORD="Completed"
    # for RDS(Instance)
    INSTANCE_KEYWORD="completed"
    # === Do not change the variables below. ===
    K_DATE='"Date"'
    K_TIME='"Time"'
    K_TZ='"Time Zone"'
    K_TARGET1='"DB Cluster"'
    K_TARGET2='"DB Identifier"'
    K_FAILOVER='"Failover"'
    V_DATE='"-"'
    V_TIME='"-"'
    V_TZ='"UTC"'
    V_TARGET1='"-"'
    V_TARGET2='"-"'
    V_FAILOVER=0
    # === Do not change the variables over. ===
    ##### Run Command #####
    echo `aws rds describe-events --output ${OUTPUT} --region ${REGION} --duration 5 --even
    echo `aws rds describe-events --output ${OUTPUT} --region ${REGION} --duration 5 --even
    sleep 5;
    SIZE_CHECK1=`ls -la ${LOCATE_PATH} | grep Cluster_Failover_Event | awk '{ print $5 }'`
    if [ "${SIZE_CHECK1}" != 0 ]; then
     for LINES in $(cat ${LOCATE_PATH}RDS_Cluster_List);
     do
     EVENT_READ1=`cat ${LOCATE_PATH}Cluster_Failover_Event | grep ${LINES}`
     if [ -n "${EVENT_READ1}" ]
    then
     V_DATE=`cat ${LOCATE_PATH}Cluster_Failover_Event | grep ${LINES
     V_DATE='"'${V_DATE}'"'
     V_TIME=`cat ${LOCATE_PATH}Cluster_Failover_Event | grep ${LINES
     V_TIME='"'${V_TIME}'"'
     V_TARGET1=${LINES}
     V_TARGET1='"'${V_TARGET1}'"'
     #V_TARGET2=${LINES}
     V_FAILOVER=1
     echo "{"${K_DATE}":"${V_DATE}","${K_TIME}":"${V_TIME}","${K_TZ}
     fi
    done
    else echo "{"${K_DATE}":"${V_DATE}","${K_TIME}":"${V_TIME}","${K_TZ}":"
    fi
    SIZE_CHECK2=`ls -la ${LOCATE_PATH} | grep Instance_Failover_Event | awk '{ print $5 }'`
    if [ "${SIZE_CHECK2}" != 0 ]; then
     for LINES in $(cat ${LOCATE_PATH}RDS_Instance_List);
     do
     EVENT_READ2=`cat ${LOCATE_PATH}Instance_Failover_Event | grep ${LINES}`
     if [ -n "${EVENT_READ2}" ]
     then
     V_DATE=`cat ${LOCATE_PATH}Instance_Failover_Event | grep ${LINE
     V_DATE='"'${V_DATE}'"'
     V_TIME=`cat ${LOCATE_PATH}Instance_Failover_Event | grep ${LINE
     V_TIME='"'${V_TIME}'"'
     V_TARGET1='"-"'
     V_TARGET2=${LINES}
     V_TARGET2='"'${V_TARGET2}'"'
     V_FAILOVER=1
     echo "{"${K_DATE}":"${V_DATE}","${K_TIME}":"${V_TIME}","${K_TZ}
     fi
     done
    else echo "{"${K_DATE}":"${V_DATE}","${K_TIME}":"${V_TIME}","${K_TZ}":"${V_TZ}","${K_TA
    fi
    • WHATAP_LICENSE:
      • WhaTap을 설치할 고객사 프로젝트의 ‘에이전트 설치’ 항목으로 이동하면 License Key 값을 확인할 수 있습니다
      • 해당 License Key 값을 변수로 할당합니다.
      • String 타입으로 ‘ ‘로 감싸야 합니다.

    String 타입으로 ‘ ‘로 감싸야 합니다.

    • WHATAP_PCODE:
      • WhaTap을 설치할 고객사의 프로젝트 코드(Project CODE)입니다.
      • 설치할 고객사 프로젝트 선택 시, ‘주소표시줄’에서 확인 가능합니다.

    설치할 고객사 프로젝트 선택 시, ‘주소표시줄’에서 확인 가능합니다.

    • 혹은 [ 관리 ] – [ 프로젝트 관리 ] 항목으로 이동해도 확인 가능합니다.

    혹은 [ 관리 ] - [ 프로젝트 관리 ] 항목으로 이동해도 확인 가능합니다.

    • 해당 pcode 값을 변수로 할당합니다.
    • Integer 타입으로 숫자만 기입합니다.
    • WHATAP_HOST:
      • 각 WhaTap Infra Agent 지표(Metric)을 수집할 WhaTap 서버의 공인 IP 입니다.

    각 WhaTap Infra Agent 지표(Metric)을 수집할 WhaTap 서버의 공인 IP 입니다

    • 해당 공인 IP 주소값을 변수로 할당합니다.
    • String 타입으로 ‘ ‘로 감싸야 합니다.
    • CATEGORY
      • ‘메트릭스 조회’, ‘알람 설정’을 진행하기에 지표(Metric)가 수집/분류되는 네임 스페이스입니다. (입력하는 이름으로 Custom하게 저장 가능)
      • String 타입으로 ‘ ‘로 감싸야 합니다

    ‘메트릭스 조회’, ‘알람 설정’을 진행하기에 지표(Metric)가 수집/분류되는 네임 스페이스 입니다. (입력하는 이름으로 Custom하게 저장 가능)

    • FOCUS_PATH
      • Script 결과값(Customized)을 ‘focus’를 통해 전송이 필요합니다.
      • 주석과 같이 ‘focus’를 포함한 ‘Full Path’ 정보를 기입합니다.
        • 해당 Script와 ‘focus’는 동일한 디렉토리에 있는 것을 권장합니다
    • LOCATE_PATH: 해당 Script가 위치할 Path를 변수로 할당합니다. (마지막에 ‘/’ 포함 필수)
    • OUTPUT: ‘text’ 형식으로 AWS CLI 결과를 출력합니다. (변경 X)
    • REGION: AWS CLI로 검색할 리전 코드를 변수로 할당합니다.
    • 36 ~ 59번 줄까지의 내용은 수정할 필요가 없습니다.
    • ‘Run Command’ 이하 내용은 수정할 필요가 없습니다.
      • ‘Profile’을 이용하여 모니터링 할 경우에는 62, 63번 줄의 AWS CLI 명령어 중간에 ‘–profile=[Profile User]’ 가 추가되어야 합니다

    2-4. Script 실행(Test):

    • Script가 위치한 디렉토리로 이동하여 해당 Script를 실행합니다.
    • 다음 2가지 내용으로 Script 정상 동작 여부를 확인합니다.
      • Script 수행 시, Terminal에 별도 Error 메세지 없이 WhaTap Logo와 Session Closed 확인 여부
        • Error 발생 시에는 Script 혹은 AWS CLI 수행을 위한 권한 확인 필요
      • WhaTap Browser에서 [ 메트릭스 조회 ]를 통해 Script에 지정한 ‘CATEGORY’ 항목이 ‘카테고리’에서 보이는지 확인

    2-5. Script 등록:

    • Crontab에 해당 Script를 실행할 User로 ‘5분’ 간격으로 실행될 수 있도록 등록합니다.

    3. 마치며

    • 동작 관련:
      • 정상적으로 Script가 동작하여 지표가 수집된다면, ‘Failover’ 컬럼에 ‘0’으로만 집계되고 나머지 컬럼은 ‘-’ 지표만 수집합니다.
      • 실제 Failover Event 발생 시, ‘Failover’ 컬럼이 ‘1’로 기입되며, 나머지 컬럼에 자동적으로 Event 발생한 대상 리소스 정보가 표시됩니다.
    • 알람 설정을 위해서는 해당 ‘카테고리’를 선택 후, ‘Failover > 0’로만 선택해도 전체 RDS의 Failover 감지가 가능합니다
    • 타 모니터링 솔루션과 다르게 WhaTap에서는 RDS Failover / Reboot을 Integration으로 관제할 수 있는 방안이 없어 해당 Script를 구현하여 고객사에 적용했습니다.
    • 해당 Script는 describe RDS Script와 하나의 세트입니다.
      • 대상 자동화를 위한 세트 구성이기에 각 Script별로 올바른 설정이 필요합니다.

    여기까지 ‘[WhaTap] RDS Failover/Reboot 관제 2 – RDS Failover’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다. 

    Written by 지 봉근 / SRE실

    BESPIN GLOBAL