목록으로

Programming Notes

FinOps Hub + SRE 에이전트로 Azure 비용 이상 징후 탐지하기

서론

클라우드 환경에서 가장 큰 도전 과제 중 하나는 비용 가시성을 유지하는 것입니다. 예상치 못한 비용 급증은 며칠 동안 눈에 띄지 않게 지나갈 수 있으며, 고지서를 받았을 때는 이미 늦은 경우가 많습니다.

이 글에서는 Azure SRE 에이전트를 **FinOps Hub(Azure Data Explorer)**에 연결하여 자동 일일 비용 이상 징후 분석을 구성하고, 패턴을 벗어난 항목이 감지될 때 Microsoft Teams로 자동 알림을 보내는 방법을 소개합니다.

🏗️ 솔루션 아키텍처

FinOps Hub (ADX) → SRE 에이전트 (예약된 작업) → KQL 이상 징후 탐지

↓ 이상 징후 감지됨?

예 → 적응형 카드(Adaptive Card) → Teams 채널

아니오 → 로그 기록: '비용이 예상 범위 내에 있음'

필수 요구 사항

상태 요구 사항 세부 정보
FinOps Hub 배포 완료 Azure Data Explorer에 비용 데이터가 수집되고 있어야 함
Azure SRE 에이전트 설정 완료 FinOps Hub가 있는 구독에 대한 액세스 권한 필요
Microsoft Teams 채널 알림이 게시될 채널
적절한 권한 ADX의 Hub 데이터베이스에 대한 Viewer 권한을 가진 관리 ID(Managed Identity)

단계별 가이드

① FinOps Hub의 ADX 클러스터 식별

첫 번째 단계는 FinOps Hub가 비용 데이터를 저장하는 Azure Data Explorer 클러스터를 찾는 것입니다. Azure SRE 에이전트에서 Azure Resource Graph를 사용하여 검색합니다.

az graph query -q "Resources | where type =~ 'Microsoft.Kusto/clusters'" --first 10 --subscription <subscription-id>

제 예시의 경우 반환된 클러스터는 다음과 같습니다.

속성
이름 finopshubadx
URI https://finopshubadx.northcentralus.kusto.windows.net
데이터베이스 Hub
SKU Dev(No SLA)_Standard_D11_v2
지역 North Central US

② 권한 설정 (ADX의 RBAC)

SRE 에이전트의 관리 ID는 ADX의 Hub 데이터베이스에 대한 Viewer 권한이 필요합니다. 이 권한이 없으면 KQL 쿼리가 403 오류와 함께 실패합니다.

옵션 A — Azure CLI: az kusto database-principal-assignment create \ --cluster-name finopshubadx \ --database-name Hub \ --resource-group <resource-group> \ --subscription <subscription-id> \ --principal-assignment-name "sre-agent-viewer" \ --principal-id "<managed-identity-client-id>" \ --principal-type App --role Viewer

옵션 B — 포털: ADX → 클러스터 → Hub 데이터베이스 → 권한(Permissions) → 추가(Add) → Viewer → 관리 ID 선택

옵션 C — KQL (ADX 웹 UI): .add database Hub viewers ('aadapp=<client-id>') 'SRE Agent'

③ 이상 징후 탐지용 KQL 쿼리

이 쿼리는 Kusto의 series_decompose_anomalies 함수를 사용하여 지난 12개월 동안의 일일 비용에서 이상 패턴을 탐지합니다.

let numberOfMonths = 12;
let start = startofmonth(ago(numberOfMonths * 30d));
let end = now();
let interval = 1d;

Costs()
| where ChargePeriodStart between (start .. end)
| summarize DailyCost = sum(EffectiveCost)
    by bin(ChargePeriodStart, interval)
| make-series CostSeries = sum(DailyCost)
    on ChargePeriodStart from start to end step interval
| extend anomalies = series_decompose_anomalies(CostSeries)
| project ChargePeriodStart, CostSeries, anomalies

💡 쿼리 작동 원리

  • Costs(): 통합된 비용 데이터를 반환하는 FinOps Hub 함수
  • make-series: 공백 없는 연속적인 일일 시계열 생성
  • series_decompose_anomalies: 계절성 분해 + STL을 사용하여 스파이크 및 드롭을 탐지하는 Kusto 기본 ML 알고리즘
  • Score > 0: 예상보다 높은 비용 | Score < 0: 예상보다 낮은 비용
  • 절대값(|score|)이 클수록 더 유의미한 이상 징후임

④ Microsoft Teams 웹훅 설정

Teams에서 알림을 받기 위해 **Power Automate 워크플로를 통한 수신 웹훅(Incoming Webhook)**을 생성합니다(Microsoft 권장 방식).

  1. Teams 채널에서 더보기(...) → 워크플로(Workflows) 클릭
  2. "Post to a channel when a webhook request is received" 검색
  3. 원하는 팀과 채널 선택 → 워크플로 추가
  4. 생성된 URL 복사 (형식: https://prod-xx...logic.azure.com/...)
  5. Power Automate에서 워크플로 활성화 (내 흐름 → 켜기)

⚠️ 주의: 워크플로가 '일시 중단됨(Suspended)' 상태로 생성될 수 있습니다. Power Automate 포털에서 활성화 상태를 확인하세요.

⑤ SRE 에이전트에 예약된 작업 생성

이제 가장 중요한 부분인 Azure SRE 에이전트에 **예약된 작업(Scheduled Task)**을 생성합니다. 다음과 같이 자연어로 요청하면 됩니다.

"FinOps 허브에서 매일 비용 이상 징후를 분석하고, 이상 징후가 감지되면 Teams로 알려주는 일일 작업을 만들어줘."

SRE 에이전트는 다음과 같은 매개변수로 작업을 생성합니다.

매개변수
이름 Daily FinOps Cost Anomaly Analysis
일정 0 8 * * * (매일 08:00 UTC)
ADX 클러스터 https://finopshubadx.northcentralus.kusto.windows.net
데이터베이스 Hub
쿼리 series_decompose_anomalies가 포함된 KQL (12개월)
알림 웹훅을 통한 Teams 적응형 카드
에스컬레이션 3일 연속 이상 징후 발생 시 HIGH 등급
멱등성 이상 없음 시 '비용이 예상 범위 내에 있음' 로그

![작업 상세 이미지 placeholder]

작업 상세 내용 (예시): 참고: 환경에 맞게 필드를 수정하세요.

Autonomous Scheduled Run - Daily FinOps Cost Anomaly Analysis

## 범위
- 구독: xxxxxxx-xxxxxxx-xxxxxx-xxxx-xxxxx
- ADX 클러스터: https://finopshub.northcentralus.kusto.windows.net
- 데이터베이스: Hub
- 리소스 그룹: finopshub-rg

## 목표
FinOps Hub 데이터를 사용하여 Azure 지출의 비용 이상 징후를 탐지합니다. ADX 클러스터에 대해 KQL 쿼리를 실행하고 결과를 분석하며, 이상 징후가 발견되면 Teams를 통해 알립니다.

## 1단계: KQL 쿼리 실행
KustoQuery 하위 에이전트를 사용하여 ADX 클러스터에 대해 다음 쿼리를 실행합니다.

(쿼리 내용은 위와 동일...)

## 2단계: 결과 분석
- series_decompose_anomalies 출력에서 이상 징후 배열을 분석합니다.
- 이상 점수가 유의미하게 양수(비용 급증) 또는 음수(비용 급감)인 날짜를 식별합니다.
- 발견된 각 이상 징후에 대해 날짜, 실제 비용, 예상 기준치, 편차 백분율을 계산합니다.
- 조치가 필요한 이상 징후는 최근 7일 데이터에 집중하되, 전체 12개월 기록을 문맥 파악에 사용합니다.

## 3단계: 보고서 생성
다음을 포함하는 요약본을 작성합니다.
- 지난 7일간 탐지된 총 이상 징후 수
- 각 이상 징후별: 날짜, 비용 수치, 예상치와의 편차, 심각도 (높음/중간/낮음)
- 추세 분석: 비용이 상승, 하락 또는 안정적인지 여부
- 주요 권장 사항 (예: 특정 리소스 그룹 조사, 새 배포 확인, 예약 인스턴스 검토)

## 4단계: Teams 알림 (지난 7일 내 이상 징후가 있는 경우에만)
이상 징후가 발견되면 `executing_code` 기술(ExecutePythonCode)을 사용하여 지정된 웹훅 URL로 POST 요청을 보냅니다.

Teams 메시지용 적응형 카드 구성:
- 제목: "⚠️ Azure 비용 이상 징후 감지"
- 이상 징후 요약 (날짜, 수치, 편차)
- 심각도 표시기
- 상세 확인을 위한 SRE 에이전트 스레드 링크

(Python 코드 예시는 원문과 동일하게 유지...)

## 5단계: 스레드 보고
스레드에 항상 다음 요약을 게시합니다.
- 이상 징후 발견 여부
- 주요 지표 및 추세
- 이상 징후가 없는 경우: "중대한 비용 이상 징후가 감지되지 않았습니다. 일일 비용이 예상 범위 내에 있습니다."

## 제약 사항
- ADX에 대해 읽기 전용 작업만 수행
- 실행당 최대 5개의 KQL 쿼리
- Azure 리소스를 수정하지 마십시오.

## 에스컬레이션
3일 연속 이상 징후가 탐지되면 Teams 알림에서 HIGH 심각도로 표시하고 즉각적인 조사를 권장합니다.

⑥ Teams 알림 (적응형 카드)

이상 징후가 감지되면 SRE 에이전트는 다음과 같이 풍부한 정보를 담은 적응형 카드를 Teams로 보냅니다.

⚠️ AZURE COST ANOMALY DETECTED
🔴 HIGH — 2026-04-21
실제 비용 $1,847.32
예상 비용 $623.15
편차 +196.5% (↑ $1,224.17)
이상 점수 4.7 (임계값: 1.5)
🟡 MEDIUM — 2026-04-20
실제 비용 $987.44
편차 +59.5% (↑ $368.54)
📊 추세 (7일) $601 → $615 → $622 → $619 → $987 → $1,847

Teams 채널로 전송된 적응형 카드 예시

카드에는 'SRE 에이전트에서 상세 보기''FinOps Hub(ADX) 열기' 버튼이 포함되어 조사를 돕습니다.

⑦ 통합 테스트 (이상 징후 시뮬레이션)

예약된 작업을 신뢰하기 전에 SRE 에이전트에게 다음과 같이 요청하여 테스트해 보세요.

"Teams로 알림을 받을 수 있게 비용 이상 징후 하나를 시뮬레이션해줘."

에이전트는 웹훅이 제대로 작동하는지 확인하기 위해 시뮬레이션된 데이터가 담긴 적응형 카드를 보낼 것입니다.

팁: 웹훅이 400 - WorkflowTriggerIsNotEnabled 오류를 반환하면 Power Automate에서 흐름을 '켜기' 상태로 변경하세요.

![테스트 이미지 placeholder]

일상적인 운영 방식

시간 작업 결과
08:00 UTC SRE 에이전트가 ADX에서 KQL 쿼리 실행 12개월치 비용 데이터 확보
08:01 UTC 이상 징후 분석 (최근 7일) 스파이크 및 드롭 식별
08:02 UTC 이상 징후 발생 시 → Teams 알림 채널에 적응형 카드 게시
08:02 UTC 정상일 경우 → 스레드 로그 기록 "비용이 예상 범위 내에 있음"
지속적 3일 이상 연속 발생 시 → HIGH 에스컬레이션 조사 권장 알림

작업 관리

생성된 작업은 SRE 에이전트에게 대화로 관리할 수 있습니다.

  • 일시 중지: "비용 이상 징후 작업을 일시 중지해줘."
  • 재개: "작업을 다시 시작해줘."
  • 시간 변경: "실행 시간을 10h UTC로 바꿔줘."
  • 기록 확인: "실행 기록을 보여줘."
  • 취소: "이상 징후 작업을 삭제해줘."

결론

이 설정을 통해 여러분은 다음과 같은 지능형 비용 감시 시스템을 갖게 됩니다.

🔍 12개월의 기록을 분석하여 계절적 패턴 파악 🤖 추가 인프라 없이 Kusto 기본 ML 사용 📱 이상 징후가 있을 때만 Teams로 능동적 알림 📈 지속적인 이상 징후 발생 시 자동으로 심각도 격상 💬 SRE 에이전트 스레드에 전체 기록 유지 🔧 YAML이나 파이프라인 없이 자연어로 관리 가능

FinOps Hub + Azure SRE 에이전트 + Teams의 조합은 비용 거버넌스를 수동적(대시보드 확인)인 방식에서 능동적이고 자동화된 방식으로 혁신합니다.

🚀 조직에 도입하고 싶으신가요?

Azure SRE 에이전트는 현재 프리뷰로 제공됩니다. 구독에 에이전트를 구성하고 자연어로 대화를 시작해 보세요.

이미 FinOps Hub를 사용 중이신가요? 현재 비용 이상 징후를 어떻게 모니터링하고 있는지 댓글로 공유해 주세요!

#FinOps #Azure #SREAgent #CostManagement #AzureDataExplorer #CloudGovernance #DevOps #MicrosoftTeams #AIOps