Azure 비용 대시보드 가이드
서버(LSSN) 단위로 수집된 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)
azureCostServers로 해당 CSN의 서버 목록과 기본 서버(default_lssn)를 얻습니다.- 원하는
lssn(또는default_lssn)으로azureCost를 호출해 비용 상세를 얻습니다.
4. Base URL / Method
| API | Method | URL |
|---|---|---|
| 서버 목록 | GET | https://giipfaw.azurewebsites.net/api/azureCostServers?csn={csn} |
| 비용 상세 | GET | https://giipfaw.azurewebsites.net/api/azureCost?csn={csn}&lssn={lssn} |
5. Query / Header
| 위치 | 이름 | 필수 | 설명 |
|---|---|---|---|
| query | csn | 필수 | 프로젝트 번호(정수) |
| query | lssn | azureCost만 필수 | 서버 번호(정수) |
| header | x-api-key | 필수 | 발급받은 시크릿 키 |
6. 성공 응답 예시 + 필드 설명
공통 봉투: { "rstVal": 200, "message": "OK", "data": { ... } }
azureCostServers의 data:
{
"csn": 47,
"default_lssn": 71197,
"servers": [
{ "lssn": 71197, "hostname": "example-host", "has_azure_cost_snapshot": true, "latest_collected_at": "2026-09-02T22:26:36" }
]
}
azureCost의 data:
{
"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)
| HTTP | rstVal | message 예 | 원인 |
|---|---|---|---|
| 400 | 400 | csn and lssn are required numeric query parameters | 필수 파라미터 누락/형식 오류 |
| 401 | 401 | Missing x-api-key header | 키 누락 또는 무효 |
| 403 | 403 | Access denied | 해당 CSN 접근 권한 없음 |
| 404 | 404 | No cost data for this server | 서버가 CSN 소속이 아니거나 최근 30일 스냅샷 없음 |
| 429 | 429 | Too Many Requests | 과다 호출로 레이트리밋(아래 10 참조) |
| 500 | 500 | (내부 오류 메시지) | 서버 오류 — 잠시 후 재시도 |
8. 값의 의미 (세전·통화·스냅샷·collected_at·MonthToDate·예측)
- 모든 비용은 세전(Pre-tax) 기준이며, 통화는
period.currency입니다. - 항상 가장 최근 스냅샷 한 건 기준입니다(실시간 아님). 수집 시각은
source.collected_at입니다. period.type이MonthToDate면 이번 달 1일부터 수집일까지의 누적입니다(is_month_to_date = true).forecast_month_end는MonthToDate일 때만 산출됩니다. 수식은총비용 × (그 달 전체 일수 ÷ 수집일자)이며, 다른 기간이면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단계)
- 환경변수 설정:
GIIP_CSN,GIIP_API_KEY(선택GIIP_LSSN). azureCostServers호출 →default_lssn확인.azureCost호출 →data획득.totals/by_service/by_resource_group로 총액·상위 항목 분석.- 4xx/5xx는 오류표대로 처리하고,
429는Retry-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