k8s(eks) deployment 상태 확인 스크립트

2024. 11. 19. 08:42기타/scripts

728x90
SMALL
  • 개요
k8s(eks) deployment 상태 확인 스크립트
- 세부기능
k8s(eks) context list, switch
namespace list
awslogs group list
결과를 파일로 저장

 

  • 스크립트
#!/usr/bin/env bash

# 사용법 함수
usage() {
    echo "에러: 입력값이 잘못 됐습니다."
    echo "사용법: $0 [로그스트림이름]"
    echo "로그스트림이름은 선택사항입니다."
    exit 1
}

# 로그 그룹 선택 함수
select_log_group() {
    echo "사용 가능한 로그 그룹 목록:"
    groups=($(awslogs groups))
    
    if [ ${#groups[@]} -eq 0 ]; then
        echo "사용 가능한 로그 그룹이 없습니다."
        exit 1
    fi

    echo "로그 그룹을 선택하세요:"
    select LOG_GROUP in "${groups[@]}"; do
        if [ -n "$LOG_GROUP" ]; then
            break
        else
            echo "올바른 번호를 선택하세요."
        fi
    done
    echo "선택된 로그 그룹: $LOG_GROUP"
}

# 시간 입력 함수
input_time() {
    while true; do
        echo "시간을 입력하세요 (형식: YYYY-MM-DD HH:MM:SS):"
        read TARGET_TIME
        
        # 형식 검사
        if ! [[ "$TARGET_TIME" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}[[:space:]][0-9]{2}:[0-9]{2}:[0-9]{2}$ ]]; then
            echo "올바른 시간 형식이 아닙니다."
            continue
        fi

        # 현재 시간과 비교
        current_ts=$(date +%s)
        if [ "$(uname)" = "Darwin" ]; then
            input_ts=$(date -j -f "%Y-%m-%d %H:%M:%S" "$TARGET_TIME" "+%s" 2>/dev/null)
        else
            input_ts=$(date -d "$TARGET_TIME" "+%s" 2>/dev/null)
        fi

        # 날짜 변환 실패 확인
        if [ $? -ne 0 ]; then
            echo "유효하지 않은 날짜입니다."
            continue
        fi

        # 미래 날짜 확인
        if [ "$input_ts" -gt "$current_ts" ]; then
            echo "미래 날짜는 입력할 수 없습니다."
            continue
        fi

        break
    done
}

# 시간 범위 입력 함수
input_time_range() {
    while true; do
        echo "조회할 시간 범위를 입력하세요 (분 단위, 기본값: 5):"
        read TIME_RANGE
        
        if [ -z "$TIME_RANGE" ]; then
            TIME_RANGE=5
            break
        elif [[ "$TIME_RANGE" =~ ^[0-9]+$ ]]; then
            break
        else
            echo "올바른 숫자를 입력해주세요."
        fi
    done
}

# grep 패턴 입력 함수 추가
input_grep_pattern() {
    echo "필터링할 패턴을 입력하세요 (선택사항):"
    read GREP_PATTERN
}

# 파일 저장 옵션 입력 함수
ask_save_to_file() {
    while true; do
        echo "파일로 저장하시겠습니까? (y/n):"
        read SAVE_TO_FILE
        case $SAVE_TO_FILE in
            [Yy]* ) 
                # 로그 그룹명의 '/' 를 '-' 로 변경하고 앞뒤 '-' 제거
                SAFE_LOG_GROUP=$(echo "$LOG_GROUP" | tr '/' '-' | sed 's/^-//;s/-$//')
                OUTPUT_FILE="${SAFE_LOG_GROUP}-$(date +%Y-%m-%d_%H-%M-%S).log"
                echo "$OUTPUT_FILE"
                return 0
                ;;
            [Nn]* ) return 1;;
            * ) echo "y 또는 n을 입력해주세요.";;
        esac
    done
}

# 메인 로직 시작
LOG_STREAM=$1

# 로그 그룹 선택
select_log_group

# 시간 입력
input_time

# 시간 범위 입력
input_time_range

# 시간 범위를 초 단위로 변환
SECONDS_RANGE=$((TIME_RANGE * 60))

# OS 확인 및 시간 계산
if [ "$(uname)" = "Darwin" ]; then
    # macOS
    center_ts=$(date -j -f "%Y-%m-%d %H:%M:%S" "$TARGET_TIME" "+%s" 2>/dev/null)
    start_time=$(date -j -f "%s" $((center_ts - SECONDS_RANGE/2)) "+%Y-%m-%d %H:%M:%S")
    end_time=$(date -j -f "%s" $((center_ts + SECONDS_RANGE/2)) "+%Y-%m-%d %H:%M:%S")
else
    # Linux
    center_ts=$(date -d "$TARGET_TIME" "+%s" 2>/dev/null)
    start_time=$(date -d "@$((center_ts - SECONDS_RANGE/2))" "+%Y-%m-%d %H:%M:%S")
    end_time=$(date -d "@$((center_ts + SECONDS_RANGE/2))" "+%Y-%m-%d %H:%M:%S")
fi

echo "조회 시간 범위: $start_time ~ $end_time (총 ${TIME_RANGE}분)"

# grep 패턴 입력
input_grep_pattern

# 파일 저장 옵션 입력
ask_save_to_file
SAVE_OPTION=$?

# awslogs 명령어 실행
execute_logs() {
    if [ -n "$LOG_STREAM" ]; then
        # 로그스트림이 지정된 경우
        if [ -n "$GREP_PATTERN" ]; then
            awslogs get "$LOG_GROUP" \
                --start="$start_time" \
                --end="$end_time" \
                --timestamp \
                --log-stream-name="$LOG_STREAM" | grep -i --color=auto "$GREP_PATTERN"
        else
            awslogs get "$LOG_GROUP" \
                --start="$start_time" \
                --end="$end_time" \
                --timestamp \
                --log-stream-name="$LOG_STREAM"
        fi
    else
        # 로그스트림이 지정되지 않은 경우
        if [ -n "$GREP_PATTERN" ]; then
            awslogs get "$LOG_GROUP" \
                --start="$start_time" \
                --end="$end_time" \
                --timestamp | grep -i --color=auto "$GREP_PATTERN"
        else
            awslogs get "$LOG_GROUP" \
                --start="$start_time" \
                --end="$end_time" \
                --timestamp
        fi
    fi
}

if [ $SAVE_OPTION -eq 0 ]; then
    # 파일로 저장
    execute_logs > "$OUTPUT_FILE"
else
    # 화면에 출력
    execute_logs
fi
728x90
LIST