26Y06c

Young-Kyoo Kim·2026년 7월 6일
#!/bin/bash
# =========================================================================
# run_pipeline_analysis.sh — Environment Variable Driven FinOps Analyzer
# =========================================================================
set -e

echo "⚙️  [컨테이너 인젝션] 쿠버네티스 환경변수 로드 및 적합성 검증 개시..."
echo "• TARGET_CLUSTER : ${CLUSTER}"
echo "• RELATIVE_DAYS  : ${DAYS:-NOT_SET}"
echo "• ABSOLUTE_RANGE : ${START_DATE:-NOT_SET} ~ ${END_DATE:-NOT_SET}"

# 🛡️ 필수 환경변수 가드레일
if [ -z "$CLUSTER" ]; then
  echo "❌ [에러] CLUSTER 환경변수가 누락되었습니다. (COMPUTE 또는 STORAGE 필수)"
  exit 1
fi

if [ -z "$DAYS" ] && { [ -z "$START_DATE" ] || [ -z "$END_DATE" ]; }; then
  echo "❌ [에러] 기간 설정이 누락되었습니다. DAYS 또는 START_DATE & END_DATE 세트를 주입하세요."
  exit 1
fi

echo "📡 AIStor 스마트 캐시 엔진 연동 -> [${CLUSTER}] 마스터 테이블 가용성 head_object 스캔 중..."

# 🐍 인라인 파이썬을 이용한 AIStor 적재본 HIT / MISS 판정 레이어 (두 가지 기간 명세 완벽 지원)
CACHE_STATUS=$(python3 -c "
import os, sys, boto3
from datetime import datetime, timedelta, timezone

KST = timezone(timedelta(hours=9))
cluster = os.getenv('CLUSTER', '').upper()
days_str = os.getenv('DAYS', '')
start_date = os.getenv('START_DATE', '')
end_date = os.getenv('END_DATE', '')

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)

# 분석 대상 날짜 배열 동적 생성
target_dates = []
if start_date and end_date:
    try:
        s_dt = datetime.strptime(start_date, '%Y-%m-%d')
        e_dt = datetime.strptime(end_date, '%Y-%m-%d')
        curr = s_dt
        while curr <= e_dt:
            target_dates.append(curr.strftime('%Y%m%d'))
            curr += timedelta(days=1)
    except Exception as e:
        print('MISS')
        sys.exit(0)
elif days_str:
    days = int(days_str)
    for i in range(1, days + 1):
        target_dates.append((now_kst - timedelta(days=i)).strftime('%Y%m%d'))

all_cached = True
if not target_dates:
    all_cached = False

for d in target_dates:
    object_key = f'merged/{cluster}/daily_enriched_{cluster}_{d}.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] 요청한 기간의 정산 데이터가 AIStor에 영구 보존되어 있습니다."
  echo "🚀 1, 2단계를 스킵하고 [3단계 시각화 엔진]부터 패스트 트랙 가동합니다."
  echo "========================================================================="
  
  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] 정산 원부가 없거나 일부 유실되어 전체 파이프라인을 구동합니다."
  echo "========================================================================="
  
  # 인젝션된 환경변수 조합에 따른 가변 아규먼트 분기 바인딩
  if [ -n "$START_DATE" ] && [ -n "$END_DATE" ]; then
    python3 step1_prom_fetch.py --start-date "$START_DATE" --end-date "$END_DATE"
    python3 step2_pipeline_polars.py --cluster "$CLUSTER" --start-date "$START_DATE" --end-date "$END_DATE"
  else
    python3 step1_prom_fetch.py --days "$DAYS"
    python3 step2_pipeline_polars.py --cluster "$CLUSTER" --days "$DAYS"
  fi
  
  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개의 댓글