26Y06b

Young-Kyoo Kim·2026년 7월 6일
#!/bin/bash
# =========================================================================
# run_pipeline_analysis.sh — Adaptive FinOps Fast-Track Analysis Runner
# =========================================================================
set -e

# 기본 변수 초기화
CLUSTER=""
DAYS=""

# 아규먼트 파싱 (--cluster 및 --days 수용)
while [[ $# -gt 0 ]]; do
  case $1 in
    --cluster)
      CLUSTER="$2"
      shift 2
      ;;
    --days)
      DAYS="$2"
      shift 2
      ;;
    *)
      echo "❌ 알 수 없는 인자입니다: $1"
      echo "사용법: ./run_pipeline_analysis.sh --cluster [COMPUTE|STORAGE] --days [N]"
      exit 1
      ;;
  esac
done

# 필수 인자 검증 가드레일
if [ -z "$CLUSTER" ] || [ -z "$DAYS" ]; then
  echo "❌ 필수 파라미터가 누락되었습니다."
  echo "사용법: ./run_pipeline_analysis.sh --cluster [COMPUTE|STORAGE] --days [개수]"
  exit 1
fi

echo "🔍 AIStor(MinIO) 오브젝트 스토리지 내 [${CLUSTER}] 클러스터의 ${DAYS}일치 정산 원부 가용성 검증 중..."

# 📡 [AIStor 캐시 검색 레이어] 
# boto3를 이용해 대상 기간의 모든 daily_enriched 파일이 스리지에 존재하는지 head_object 검증
CACHE_STATUS=$(python3 -c "
import os, sys, boto3
from datetime import datetime, timedelta, timezone

KST = timezone(timedelta(hours=9))
cluster = '$CLUSTER'
days = int('$DAYS')

s3_client = boto3.client(
    's3', 
    endpoint_url=os.getenv('MINIO_ENDPOINT'),
    aws_access_key_id=os.getenv('MINIO_ACCESS_KEY'),
    aws_secret_access_key=os.getenv('MINIO_SECRET_KEY')
)
bucket_name = os.getenv('MINIO_RAW_BUCKET', 'devops-test')
now_kst = datetime.now(KST)

all_cached = True
for i in range(1, days + 1):
    target_date = (now_kst - timedelta(days=i)).strftime('%Y%m%d')
    object_key = f'merged/{cluster}/daily_enriched_{cluster}_{target_date}.parquet'
    try:
        s3_client.head_object(Bucket=bucket_name, Key=object_key)
    except Exception:
        all_cached = False
        break

print('HIT' if all_cached else 'MISS')
")

# ─── 🔀 분할 정복 조건부 실행 제어 ───
if [ "$CACHE_STATUS" == "HIT" ]; then
  echo "========================================================================="
  echo "⚡ [Cache Hit] 요청하신 ${DAYS}일치 정산 데이터가 AIStor에 모두 완벽하게 보존되어 있습니다."
  echo "🚀 1단계(수집) 및 2단계(정산)를 건너뛰고, [3단계 시각화]부터 패스트 트랙 가동합니다."
  echo "========================================================================="
  
  # 💡 스마트 패스트 트랙: 3단계 차트 빌드부터 직접 다이렉트 픽업 가동
  python3 step3_analytics.py --cluster "$CLUSTER"
  python3 step4_governance_analyzer.py --cluster "$CLUSTER"
  python3 step6_excel_builder.py --cluster "$CLUSTER"

else
  echo "========================================================================="
  echo "💨 [Cache Miss] AIStor에 정산 원부가 없거나 일부 유실된 상태가 감지되었습니다."
  echo "🔄 무결성 확보를 위해 1단계 원천 징수부터 전 과정 풀 파이프라인(Full Recovery)을 집행합니다."
  echo "========================================================================="
  
  # 캐시 미스 시: 전체 파이프라인 정상 순차 구동
  python3 step1_prom_fetch.py --days "$DAYS"
  python3 step2_pipeline_polars.py --cluster "$CLUSTER" --days "$DAYS"
  python3 step3_analytics.py --cluster "$CLUSTER"
  python3 step4_governance_analyzer.py --cluster "$CLUSTER"
  python3 step6_excel_builder.py --cluster "$CLUSTER"
fi

echo "🏁 === [Analysis Pipeline 완수] 모든 격리 분석 리포트가 자산화되었습니다. ==="

0개의 댓글