giip
SES 안건 등록
6분 읽기

Azure 비용 대시보드 가이드

서버(LSSN) 단위로 수집된 Azure 구독 비용을 서비스별·리소스 그룹별로 조회하고 월말 예상 비용까지 확인하는 방법을 안내합니다.

🚀 Azure 비용 페이지로 이동 →

📋 개요

Azure 비용 대시보드는 선택한 서버(LSSN)에 연결된 Azure 구독의 비용 현황을 보여줍니다. 비용 수집기가 주기적으로 수집해 KVS에 저장한 최신 스냅샷(kFactor=azure_cost)을 읽어와, 서비스별 또는 리소스 그룹별 비용 비중을 표와 막대 그래프로 시각화합니다. 조회 기간이 이번 달 누적(MonthToDate)일 경우 현재까지의 일평균을 기준으로 월말 예상 비용까지 산출합니다.

🤖 AI/API 퀵스타트

이 절은 사람이 아닌 AI 에이전트나 스크립트가 이 화면과 동일한 서버 계산 결과를 외부에서 직접 조회·분석하도록 돕습니다. 화면과 공개 API는 같은 공용 조회 서비스(정본 저장 프로시저)를 사용하므로 값이 일치합니다.

1. 준비물

  • CSN: 프로젝트 번호(예: 47).
  • LSSN: 서버 번호. 모르면 아래 서버 목록 API로 조회하며, 기본 서버(default_lssn)를 함께 돌려줍니다.
  • API Key: 발급받은 시크릿 키. 환경변수(GIIP_API_KEY)로만 보관합니다.

2. 인증 보안 경고 (x-api-key)

  • 인증은 x-api-key 요청 헤더로만 전달합니다. URL 쿼리스트링이나 본문에 키를 넣지 마세요(로그·프록시에 노출됩니다).
  • 아래 예제는 키를 하드코딩하지 않고 환경변수 GIIP_CSN / GIIP_LSSN / GIIP_API_KEY만 사용합니다.

3. 호출 순서 (azureCostServers → azureCost)

  1. azureCostServers로 해당 CSN의 서버 목록과 기본 서버(default_lssn)를 얻습니다.
  2. 원하는 lssn(또는 default_lssn)으로 azureCost를 호출해 비용 상세를 얻습니다.

4. Base URL / Method

APIMethodURL
서버 목록GEThttps://giipfaw.azurewebsites.net/api/azureCostServers?csn={csn}
비용 상세GEThttps://giipfaw.azurewebsites.net/api/azureCost?csn={csn}&lssn={lssn}

5. Query / Header

위치이름필수설명
querycsn필수프로젝트 번호(정수)
querylssnazureCost만 필수서버 번호(정수)
headerx-api-key필수발급받은 시크릿 키

6. 성공 응답 예시 + 필드 설명

공통 봉투: { "rstVal": 200, "message": "OK", "data": { ... } }

azureCostServersdata:

{
  "csn": 47,
  "default_lssn": 71197,
  "servers": [
    { "lssn": 71197, "hostname": "example-host", "has_azure_cost_snapshot": true, "latest_collected_at": "2026-09-02T22:26:36" }
  ]
}

azureCostdata:

{
  "csn": 47,
  "lssn": 71197,
  "source": { "kfactor": "azure_cost", "snapshot_id": 44344061, "collected_at": "2026-09-02T22:26:36" },
  "subscription": { "subscription_id": "<your-subscription-id>", "subscription_name": "<your-subscription>" },
  "period": { "type": "MonthToDate", "start_date": "2026-09-01", "end_date": "2026-09-02", "currency": "KRW", "is_month_to_date": true },
  "totals": { "pretax_cost": 87993.34, "forecast_month_end": 1319900.03 },
  "by_service": [
    { "name": "Azure App Service", "pretax_cost": 38703.06, "ratio_percent": 43.98, "forecast_month_end": 580545.83 }
  ],
  "by_resource_group": [
    { "name": "rg-example-prod", "pretax_cost": 54988.80, "ratio_percent": 62.49, "forecast_month_end": 824832.00, "mapped_csn": null }
  ]
}

필드 설명:

  • totals.pretax_cost: 기간 세전 총액. totals.forecast_month_end: 월말 예측(아래 8 참조).
  • by_service[] / by_resource_group[]: 비용이 큰 순으로 서버에서 이미 정렬됩니다. ratio_percent는 총액 대비 비율(%), forecast_month_end는 그 항목의 월말 예측입니다.
  • by_resource_group[].mapped_csn: 아래 9 참조.

7. 오류 표 (HTTP / rstVal)

HTTPrstValmessage 예원인
400400csn and lssn are required numeric query parameters필수 파라미터 누락/형식 오류
401401Missing x-api-key header키 누락 또는 무효
403403Access denied해당 CSN 접근 권한 없음
404404No cost data for this server서버가 CSN 소속이 아니거나 최근 30일 스냅샷 없음
429429Too Many Requests과다 호출로 레이트리밋(아래 10 참조)
500500(내부 오류 메시지)서버 오류 — 잠시 후 재시도

8. 값의 의미 (세전·통화·스냅샷·collected_at·MonthToDate·예측)

  • 모든 비용은 세전(Pre-tax) 기준이며, 통화는 period.currency입니다.
  • 항상 가장 최근 스냅샷 한 건 기준입니다(실시간 아님). 수집 시각은 source.collected_at입니다.
  • period.typeMonthToDate면 이번 달 1일부터 수집일까지의 누적입니다(is_month_to_date = true).
  • forecast_month_endMonthToDate일 때만 산출됩니다. 수식은 총비용 × (그 달 전체 일수 ÷ 수집일자)이며, 다른 기간이면 null입니다.
  • 스냅샷에 period.start_date / end_date 원본이 없어 collected_at 기준으로 파생합니다.

9. 서비스별 / RG별 분석과 mapped_csn

  • by_service는 Azure 서비스별, by_resource_group는 리소스 그룹별 비용입니다.
  • mapped_csn은 그 리소스 그룹을 소유(매핑)한 CSN으로, 요청한 CSN과 다를 수 있습니다(그 RG의 소유가 다른 프로젝트일 때). 격리 위반이 아니라 소유 관계 정보이며, 매핑이 없으면 null입니다.

10. 429 재시도

  • 공용 API 남용 방지를 위해 과다 호출 시 429 Too Many Requests가 반환될 수 있습니다. 응답에 Retry-After 헤더(초)가 있으면 그만큼 대기한 뒤 재시도하고, 없으면 지수 백오프(예: 1s → 2s → 4s)로 재시도하세요.

11. cURL 예제

# 키를 URL/본문에 넣지 않고 환경변수만 사용
export GIIP_CSN=47
export GIIP_LSSN=71197          # 모르면 생략하고 아래 default_lssn 사용
export GIIP_API_KEY=***your_key***

# 1) 서버 목록 + 기본 서버
curl -s "https://giipfaw.azurewebsites.net/api/azureCostServers?csn=${GIIP_CSN}" \
  -H "x-api-key: ${GIIP_API_KEY}"

# 2) 단일 서버 비용 상세
curl -s "https://giipfaw.azurewebsites.net/api/azureCost?csn=${GIIP_CSN}&lssn=${GIIP_LSSN}" \
  -H "x-api-key: ${GIIP_API_KEY}"

12. PowerShell 예제

$csn = $env:GIIP_CSN; $lssn = $env:GIIP_LSSN; $key = $env:GIIP_API_KEY
$h = @{ "x-api-key" = $key }
$base = "https://giipfaw.azurewebsites.net/api"

$servers = Invoke-RestMethod -Uri "$base/azureCostServers?csn=$csn" -Headers $h
$target = if ($lssn) { $lssn } else { $servers.data.default_lssn }

$cost = Invoke-RestMethod -Uri "$base/azureCost?csn=$csn&lssn=$target" -Headers $h
"총 세전비용: $($cost.data.totals.pretax_cost) $($cost.data.period.currency)"
$cost.data.by_service | Select-Object -First 5 name, pretax_cost, ratio_percent

13. Python 예제 (한 파일: 서버목록 → 기본 LSSN → 비용조회 → 상위 5)

import os, sys, time, json, urllib.request, urllib.error

BASE = "https://giipfaw.azurewebsites.net/api"
CSN = os.environ["GIIP_CSN"]
KEY = os.environ["GIIP_API_KEY"]
LSSN = os.environ.get("GIIP_LSSN")  # 없으면 default_lssn 사용

def call(path):
    req = urllib.request.Request(f"{BASE}/{path}", headers={"x-api-key": KEY})
    for attempt in range(4):
        try:
            with urllib.request.urlopen(req, timeout=30) as r:
                return json.load(r)
        except urllib.error.HTTPError as e:
            if e.code == 429:  # 레이트리밋 → Retry-After 만큼 대기 후 재시도
                time.sleep(int(e.headers.get("Retry-After", 2 ** attempt)))
                continue
            sys.exit(f"HTTP {e.code}: {e.read().decode()}")
    sys.exit("429 재시도 초과")

servers = call(f"azureCostServers?csn={CSN}")
lssn = LSSN or servers["data"]["default_lssn"]
cost = call(f"azureCost?csn={CSN}&lssn={lssn}")["data"]

cur = cost["period"]["currency"]
print(f"총 세전비용: {cost['totals']['pretax_cost']} {cur} "
      f"(월말예측 {cost['totals']['forecast_month_end']})")
print("상위 5 서비스:")
for s in cost["by_service"][:5]:
    print(f"  {s['name']}: {s['pretax_cost']} ({s['ratio_percent']:.1f}%)")
print("상위 5 리소스그룹:")
for g in cost["by_resource_group"][:5]:
    print(f"  {g['name']}: {g['pretax_cost']} ({g['ratio_percent']:.1f}%) mapped_csn={g['mapped_csn']}")

14. 실행 순서 (5단계)

  1. 환경변수 설정: GIIP_CSN, GIIP_API_KEY(선택 GIIP_LSSN).
  2. azureCostServers 호출 → default_lssn 확인.
  3. azureCost 호출 → data 획득.
  4. totals / by_service / by_resource_group로 총액·상위 항목 분석.
  5. 4xx/5xx는 오류표대로 처리하고, 429Retry-After로 재시도.

🔍 주요 구성 요소

1. 서비스 / 리소스 그룹 탭

페이지 상단의 두 탭으로 같은 데이터를 서비스별리소스 그룹별 두 관점으로 전환합니다. 탭을 누르면 페이지 전체를 다시 불러오지 않고 주소창의 ?view= 값(service 또는 rg)만 갱신되므로, 특정 관점의 링크를 그대로 공유할 수 있습니다.

2. 서버(LSSN) 선택

비용을 조회할 대상 서버를 지정합니다.

  • 드롭다운: 현재 프로젝트(csn)에 속한 서버 목록이 호스트명 (LSSN) 형태로 채워집니다.
  • 직접 입력: 목록에 없거나 LSSN을 알고 있으면 오른쪽 입력란에 번호를 직접 입력하고 [조회]를 누르거나 Enter로 조회합니다.

LSSN이 정해지면 자동으로 최신 비용 데이터를 조회합니다.

3. 요약 카드

조회 결과 상단에 핵심 지표를 카드로 보여줍니다.

  • 총 비용: 해당 기간의 세전 총액(total_pretax_cost)과 통화, 기간(period). 이번 달 누적이면 MonthToDate로 표시됩니다.
  • 월말 예상: MonthToDate 기간일 때만 나타나며, 현재까지의 일평균 × 그 달 전체 일수로 계산합니다.
  • 구독: 구독 이름(subscription_name)과 구독 ID(subscription_id).
  • 수집 시각: 데이터가 수집된 시각(collected_at)과 조회한 LSSN.

4. 항목별 비용 표

활성 탭에 따라 서비스별 또는 리소스 그룹별 비용을 비용이 큰 순서로 나열합니다.

  • #: 순위
  • 서비스 / 리소스 그룹: 항목 이름
  • 비용: 해당 항목의 세전 비용
  • 월말 예상: MonthToDate일 때만 표시되며, 전체 예상 비율을 항목에 적용한 값
  • 비중: 총 비용 대비 비율을 막대와 백분율로 표시

5. 리소스 그룹에 CSN(프로젝트) 지정 · 매핑 RG 필터

리소스 그룹 탭에서는 각 리소스 그룹 행에서 바로 프로젝트(CSN)를 지정할 수 있습니다.

  • 지정 방법: 행의 [지정 CSN] 드롭다운에서 프로젝트를 고르고 **[적용]**을 누르면 그 리소스 그룹이 선택한 CSN에 매핑됩니다(내부적으로 tCsnAzureRg에 저장). 이후 해당 CSN 관점의 Azure 비용 조회(매핑 RG 필터·소계)에 이 RG가 반영됩니다.
  • 재지정 / 해제: 이미 다른 CSN에 매핑된 RG를 다른 프로젝트로 바꾸면 이전 매핑은 자동으로 정리되어 1 RG = 1 CSN으로 유지됩니다. (지정 안 함)을 선택해 적용하면 매핑이 해제됩니다.
  • 매핑 RG만 보기: 현재 프로젝트(CSN)에 매핑된 RG가 1건 이상이면 "CSN 매핑 RG만 보기" 토글이 나타납니다. 켜면 조회 중인 서버의 리소스 그룹을 매핑된 RG로만 필터링하고 매핑 소계를 함께 보여줍니다. 매핑이 없으면 전체 RG가 그대로 표시됩니다(비파괴 폴백).
  • 이 인라인 지정은 별도 관리 화면인 Azure 리소스 그룹 관리같은 매핑 데이터를 공유합니다. 구독 ID·메모까지 포함한 정밀 관리는 관리 화면을 이용하세요.

🛠️ 활용 팁

  • 관점 전환: 서비스 탭으로 어떤 Azure 서비스가 비용을 많이 쓰는지, 리소스 그룹 탭으로 어떤 그룹이 큰지 나눠서 볼 수 있습니다.
  • 링크 공유: ?view=?lssn= 값이 주소창에 반영되므로 특정 서버·관점을 그대로 공유할 수 있습니다.
  • 월말 예상 활용: 예상 비용은 이번 달 누적 데이터가 있을 때만 산출됩니다. 급증 여부를 조기에 파악하는 데 활용하세요.

💡 유의 사항

  • 표시되는 비용은 모두 세전(Pre-tax) 기준입니다.
  • 항상 가장 최근에 수집된 한 건의 스냅샷을 보여줍니다. 실시간 값이 아니라 수집 시각 기준입니다.
  • 데이터가 없으면 안내 메시지가 표시됩니다. 대개 해당 서버에 대한 비용 수집기가 아직 실행되지 않았거나 저장된 스냅샷이 없는 경우입니다.

문제 해결

증상원인해결
"데이터 없음"으로 표시됨해당 LSSN에 대해 수집된 azure_cost 스냅샷이 없음대상 서버에서 Azure 비용 수집기가 실행·저장되었는지 확인합니다.
서버 드롭다운이 비어 있음프로젝트(csn)가 선택되지 않았거나 목록 로딩에 실패함프로젝트를 선택한 뒤 다시 접속하거나, LSSN을 오른쪽 입력란에 직접 입력합니다.
월말 예상 카드/열이 보이지 않음조회 기간이 MonthToDate가 아님월말 예상은 이번 달 누적 데이터에서만 산출됩니다. 기간이 다르면 정상 동작입니다.
리소스 그룹 탭이 비어 있음스냅샷에 by_resource_group 데이터가 없음수집기가 리소스 그룹 단위 비용까지 수집하는지 확인합니다.
[지정 CSN] 드롭다운이 보이지 않음선택 가능한 프로젝트 목록 로딩 실패(소속 없음/네트워크)프로젝트에 소속돼 있는지 확인 후 다시 접속합니다. 매핑 RG 필터·조회는 정상 동작합니다.
[적용]해도 매핑이 반영되지 않음대상 프로젝트(CSN) 권한 없음 또는 API 실패해당 CSN 권한을 확인하고, 반복되면 관리자에게 문의합니다.
조회 중 오류 메시지가 표시됨네트워크 오류 또는 API 응답 실패잠시 후 다시 [조회]하고, 반복되면 관리자에게 문의합니다.

버전: 1.1 최종 업데이트: 2026-07-24 소스 파일: giipv3/public/help/azure-cost.ko.md