#!/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 완수] 모든 인프라 거버넌스 자산화가 완료되었습니다. ==="