할당량 초과와 용량 부족 오류 (증상, 원인, 해결)
VM 이나 AKS 노드를 만들 때 나는 QuotaExceeded, OperationNotAllowed, SkuNotAvailable, AllocationFailed, ZonalAllocationFailed 와 Azure OpenAI 의 429 를 증상, 원인, 해결 순서로 정리합니다. 할당량(내 구독의 한도)과 용량(Azure 데이터센터의 재고)을 구분하는 법, 할당량 확인과 증설 요청, 용량 예약을 다룹니다.
증상
배포가 이런 메시지로 실패합니다.
(QuotaExceeded) Operation could not be completed as it results in exceeding approved
standardDSv5Family Cores quota. Location: koreacentral, Current Limit: 10, Current Usage: 8,
Additional Required: 4, (Minimum) New Limit Required: 12.
(SkuNotAvailable) The requested VM size for resource 'vm-batch-01' is currently not available
in location 'koreacentral' zones '3' for subscription '<sub>'.
(ZonalAllocationFailed) Allocation failed. We do not have sufficient capacity for the requested
VM size in this zone.이름은 비슷해 보이지만 누구의 한도인지가 다릅니다.
| 오류 | 무엇이 모자라나 | 내가 할 수 있는 것 |
|---|---|---|
QuotaExceeded, OperationNotAllowed (Cores quota) | 내 구독의 할당량 | 증설 요청 (원인 1) |
SkuNotAvailable | 그 리전, 영역에서 내 구독에 허용된 크기가 아님 | 다른 크기, 영역 또는 제한 해제 요청 (원인 2) |
AllocationFailed, ZonalAllocationFailed | Azure 의 실제 용량(재고) | 다른 크기, 영역, 리전, 용량 예약 (원인 3) |
OverconstrainedAllocationRequest | 조건이 너무 많음 (영역 + 근접 배치 그룹 + 가속 네트워킹 등) | 조건 줄이기 (원인 3) |
| HTTP 429 (Azure OpenAI, Foundry 모델) | 모델 배포의 분당 토큰, 요청 한도 | 재시도, 배포 분산, 할당량 조정 (원인 4) |
| HTTP 429 (ARM) | 관리 API 호출 속도 | 재시도 간격, 호출 줄이기 (원인 5) |
원인과 해결
원인 1. vCPU 할당량 (QuotaExceeded)
Azure 는 구독, 리전마다 vCPU 할당량을 둡니다. 두 단계로 걸립니다.
- Total Regional vCPUs: 그 리전의 모든 VM 합계.
- VM 계열별 vCPUs:
standardDSv5Family,standardNCADSA100v4Family처럼 크기 계열마다.
Spot VM 은 별도의 Spot(낮은 우선 순위) vCPU 할당량을 씁니다. 할당 해제(deallocated)된 VM 은 할당량에 세지 않지만, 중지만 한 VM 은 계속 셉니다. VM Scale Sets 와 AKS 노드 풀의 VM 도 같은 할당량을 씁니다. AKS 업그레이드는 서지 노드를 잠시 더 만들기 때문에, 여유가 없으면 업그레이드 도중 이 오류가 납니다 (AKS).
# 리전의 할당량과 현재 사용량
az vm list-usage --location koreacentral -o table \
--query "[?currentValue > \`0\`].{name:localName, used:currentValue, limit:limit}"해결:
- 포털의 할당량(Quotas) 페이지에서 Compute 공급자를 고르고, 계열을 찾아 새 한도를 입력합니다. 많은 요청이 몇 분 안에 자동 승인되고, 승인되지 않으면 지원 요청으로 넘어갑니다.
- 자동화가 필요하면
az quotaCLI 확장(Microsoft.Quota 공급자)을 씁니다. - 무료 체험, 학생 구독 같은 일부 구독 종류는 증설이 제한됩니다. 운영은 종량제나 계약 구독을 씁니다.
- 신청할 때는 오류 메시지의 "New Limit Required" 보다 넉넉하게, AKS 서지와 장애 시 영역 이동분까지 계산해 요청합니다.
원인 2. 크기를 쓸 수 없음 (SkuNotAvailable)
어떤 크기는 특정 리전, 특정 영역에만 있거나, 구독 종류에 따라 막혀 있습니다. GPU 와 최신 세대 크기에서 흔합니다.
# 리전의 크기 목록과 제한(Restrictions) 확인
az vm list-skus --location koreacentral --size Standard_D4s_v5 --all -o tableRestrictions 열에 NotAvailableForSubscription 이 보이면 구독에 대한 제한이고, 지원 요청으로 해제를 요청합니다. 영역 목록에서 빠져 있으면 그 영역에는 없는 크기입니다. 템플릿에 영역을 고정했다면 그 크기가 있는 영역으로 바꿉니다.
원인 3. 용량 부족 (AllocationFailed, ZonalAllocationFailed)
할당량은 충분한데 그 시점, 그 영역에 물리 용량이 모자란 경우입니다. 할당량 증설로는 해결되지 않습니다.
해결 순서:
- 같은 계열의 다른 크기나 다른 세대(v5 대신 v6)로 시도합니다.
- 다른 가용성 영역이나 영역 지정 없이 시도합니다.
- 할당 해제된 VM 을 다시 시작할 때 실패하면, 크기를 바꾸거나 잠시 뒤 다시 시도합니다. 가용성 집합의 VM 은 모두 할당 해제한 뒤 시작하면 다른 클러스터로 옮겨질 수 있습니다.
- 조건(근접 배치 그룹, 특정 영역, 가속 네트워킹, 전용 호스트)을 하나씩 빼 봅니다.
- 꼭 필요한 용량은 주문형 용량 예약(On-demand Capacity Reservation) 으로 미리 확보합니다. 예약한 용량은 VM 을 띄우지 않아도 종량제 요금이 나오지만, 예약(Reservations) 할인과 같이 쓸 수 있습니다.
- 큰 이벤트(세일, 배치)는 며칠 전에 미리 노드를 늘려 둡니다. 자동 크기 조정은 용량이 있다는 전제 위에서만 동작합니다.
Korea Central 은 가용성 영역이 3개이지만 GPU 같은 특수 크기는 영역마다 재고가 다를 수 있습니다 (리전과 가용성 영역).
원인 4. Azure OpenAI, Foundry 모델의 429
Foundry 의 Azure OpenAI 모델 할당량은 구독, 리전, 모델, 배포 종류마다 분당 토큰(TPM)으로 주어지고, 배포를 만들 때 그 할당량을 나눠 줍니다. 분당 요청 수(RPM)는 TPM 에 비례해 정해집니다.
| 배포 종류 | 429 의 뜻 | 해결 |
|---|---|---|
| Standard, Global Standard, Data Zone Standard | 배포에 준 TPM, RPM 초과 | Retry-After 를 지키는 재시도, 배포 TPM 늘리기, Global 배포로 바꾸기 |
| 프로비전(PTU) | 구매한 처리량을 다 씀 | 재시도, 처리량 추가, Standard 배포로 넘치는 요청 보내기 |
from openai import AzureOpenAI
client = AzureOpenAI(azure_endpoint="https://<resource>.openai.azure.com", api_version="2024-10-21",
azure_ad_token_provider=token_provider, max_retries=5) # SDK 가 429 를 지수 백오프로 재시도할당량 자체가 모자라면 Foundry 포털의 할당량 화면에서 증설을 요청합니다. 큰 서비스는 API Management 의 AI 게이트웨이로 여러 배포, 리전에 부하를 나누고 토큰 사용량을 앱별로 제한합니다 (Foundry 와 Azure OpenAI).
원인 5. ARM 요청 제한 (관리 API 429)
Terraform, 스크립트가 짧은 시간에 너무 많은 관리 API 를 부르면 Azure Resource Manager 가 429 와 Retry-After 를 돌려줍니다. 응답 헤더 x-ms-ratelimit-remaining-subscription-reads 같은 값으로 남은 요청 수를 볼 수 있습니다.
해결: 병렬 수(Terraform -parallelism)를 줄이고, 목록 조회를 반복하는 대신 Azure Resource Graph 로 한 번에 질의합니다. SDK 와 CLI 는 기본적으로 재시도하므로 직접 짠 루프에도 Retry-After 를 지키는 재시도를 넣습니다.
그 밖에 자주 닿는 한도
| 한도 | 값 (기본) | 메모 |
|---|---|---|
| 구독당 리소스 그룹 | 980 | 늘릴 수 없음. 구독을 나눔 |
| 범위당 배포 기록 | 800 | 가까워지면 오래된 기록이 자동 삭제 |
| 구독당 역할 할당 | 5,000 | AuthorizationFailed |
| Flex Consumption 리전 할당량 | 구독, 리전당 250 코어 | 모든 Flex 앱이 나눠 씀 (Functions) |
정확한 최신 값은 공식 "Azure subscription and service limits" 문서를 확인합니다. 서비스마다 늘릴 수 있는 한도와 고정 한도가 섞여 있습니다.
예방
- 새 리전, 새 크기 계열을 쓰기 전에 할당량을 미리 올려 둡니다. 출시 당일에 요청하지 않습니다.
- 할당량 사용률에 경고를 겁니다. 할당량 페이지에서 사용률 경고를 만들 수 있습니다.
- 크기를 하나만 고집하지 말고, 템플릿과 노드 풀에 대체 크기 목록을 둡니다.
- AI 모델은 배포를 하나로 몰지 말고 리전, 배포 종류를 나눠 재시도 경로를 만듭니다.