Azure Resource Manager가 요청을 제한하는 방법 이해

이 문서에서는 Azure Resource Manager가 요청을 제한하는 방법을 설명합니다. 제한에 도달하기 전에 다시 기본 요청 수를 추적하는 방법과 제한에 도달하면 응답하는 방법을 보여 줍니다.

제한은 두 수준에서 발생합니다. Azure Resource Manager가 구독 및 테넌트에 대한 요청을 제한합니다. 요청이 구독 및 테넌트의 제한 한도 하에 있는 경우 Resource Manager는 리소스 공급자에게 요청을 라우팅합니다. 리소스 공급자는 해당 작업에 맞게 조정된 제한을 적용합니다.

다음 이미지는 요청이 사용자에서 Azure Resource Manager 및 리소스 공급자로 전송될 때 제한이 적용되는 방법을 보여줍니다. 이미지는 요청을 보내는 사용자의 지역에서 주체 ID 및 Azure Resource Manager 인스턴스별로 요청이 처음에 제한됨을 보여 줍니다. 요청은 시간당 제한됩니다. 요청이 리소스 공급자에 전달되면 사용자 지역의 Azure Resource Manager 인스턴스가 아닌 리소스의 지역별로 요청이 제한됩니다. 리소스 공급자 요청은 주 사용자 ID 및 시간당 제한됩니다.

요청이 사용자로부터 Azure Resource Manager 및 리소스 공급자로 진행될 때 제한이 적용되는 방식을 보여 주는 다이어그램

구독 및 테넌트 제한

모든 구독 수준 및 테넌트 수준 작업에는 제한 제한이 적용됩니다. 구독 요청은 구독 내의 리소스 그룹 검색과 같이 구독 ID가 전달되는 요청입니다. 예를 들어 요청을 https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups?api-version=2022-01-01 보내는 것은 구독 수준 작업입니다. 테넌트 요청에는 유효한 Azure 위치 검색과 같은 구독 ID가 포함되지 않습니다. 예를 들어 요청을 https://management.azure.com/tenants?api-version=2022-01-01 보내는 것은 테넌트 수준 작업입니다.

시간당 기본 제한 한도는 다음 표에 나와 있습니다.

범위 작업 제한
Subscription reads 12000
구독 deletes 15000
구독 writes 1200
테넌트 reads 12000
테넌트 writes 1200

이러한 제한의 범위는 요청을 하는 보안 주체(사용자 또는 애플리케이션) 및 구독 ID나 테넌트 ID의 범위로 설정됩니다. 둘 이상의 보안 주체가 요청을 하는 경우 구독 또는 테넌트 전체에 적용되는 제한이 시간당 12,000개/1,200개보다 커집니다.

이러한 한도는 각 Azure Resource Manager 인스턴스에 적용됩니다. 모든 Azure 지역에는 여러 인스턴스가 있으며 Azure Resource Manager는 모든 Azure 지역에 배포됩니다. 따라서 실제로 제한은 이러한 제한보다 높습니다. 사용자의 요청은 일반적으로 Azure Resource Manager의 서로 다른 인스턴스에 의해 처리됩니다.

나머지 요청은 응답 헤더 값으로 반환됩니다.

지역별 제한 및 토큰 버킷 알고리즘으로 마이그레이션

2024년부터 Microsoft는 Azure 구독을 새 제한 아키텍처로 마이그레이션하고 있습니다. 이 변경으로 새로운 제한 제한이 발생합니다. 새 제한 제한은 Azure Resource Manager 인스턴스가 아닌 지역별로 적용됩니다. 새 아키텍처는 토큰 버킷 알고리즘사용하여 API 제한을 관리합니다.

토큰 버킷은 초당 보낼 수 있는 최대 요청 수를 나타냅니다. 최대 요청 수에 도달하면 리필 속도에 따라 버킷에서 토큰을 사용할 수 있는 속도가 결정됩니다.

이러한 업데이트된 제한을 사용하면 할당량을 더 쉽게 새로 고치고 관리할 수 있습니다.

새로운 제한은 다음과 같습니다.

범위 작업 버킷 크기 초당 리필 속도
구독 reads 250 25
구독 deletes 200 10
구독 writes 200 10
테넌트 reads 250 25
테넌트 deletes 200 10
테넌트 writes 200 10

구독 제한은 구독당, 서비스 주체별 및 작업 유형별로 적용됩니다. 각 작업 유형에 대한 개별 서비스 주체 제한의 15배에 해당하는 전역 구독 제한도 있습니다. 전역 제한은 모든 서비스 주체에 적용됩니다. 전역, 서비스 주체 또는 테넌트별 제한을 초과하면 요청이 제한됩니다.

무료 또는 평가판 고객의 경우 제한이 더 작을 수 있습니다.

예를 들어 읽기 요청에 대한 버킷 크기가 250개이고 초당 25개 토큰의 리필 속도가 있다고 가정해 보겠습니다. 초당 250개의 읽기 요청을 보내면 버킷이 비어 있고 요청이 제한됩니다. 버킷이 최대 250개의 토큰 용량에 도달할 때까지 매 초마다 25개의 토큰을 사용할 수 있게 됩니다. 토큰을 사용할 수 있게 되면 사용할 수 있습니다.

구독에서 새 제한 환경을 사용하는지 어떻게 할까요? 알 수 있나요?

구독을 새 제한 환경으로 마이그레이션한 후 응답 헤더는 시간당이 아닌 분당 다시 기본 요청을 표시합니다. 또한 값은 Retry-After 5분이 아닌 1분 이하를 표시합니다. 자세한 내용은 오류 코드를 참조 하세요.

제한은 인스턴스당이 아닌 지역별로 변경되는 이유는 무엇인가요?

다른 지역에는 Resource Manager 인스턴스 수가 다르기 때문에 인스턴스당 제한을 사용하면 일관되지 않은 제한 성능이 발생합니다. 지역당 제한을 사용하면 제한이 일관되고 예측 가능합니다.

새 제한 환경은 내 제한에 어떤 영향을 주나요?

더 많은 요청을 보낼 수 있습니다. 쓰기 요청은 30배 증가합니다. 삭제 요청은 2.4배 증가합니다. 읽기 요청이 7.5배 증가합니다.

구독이 새 제한 환경으로 마이그레이션되지 않도록 방지할 수 있나요?

아니요, 모든 구독은 결국 마이그레이션됩니다.

리소스 공급자 제한

리소스 공급자는 자체 제한 한도를 적용합니다. 각 구독 내에서 리소스 공급자는 요청에서 리소스의 지역별로 제한합니다. Resource Manager는 Resource Manager 인스턴스별로 제한되고 각 지역에 여러 Resource Manager 인스턴스가 있기 때문에 리소스 공급자는 이전 섹션의 기본 제한보다 더 많은 요청을 받을 수 있습니다.

이 섹션에서는 광범위하게 사용되는 일부 리소스 공급자의 제한 한도에 대해 설명합니다.

스토리지 제한

다음과 같은 제한은 Azure Storage와 Azure Resource Manager를 사용하여 관리 작업을 수행하는 경우에만 적용됩니다. 제한은 요청에서 리소스의 지역별로 적용됩니다.

리소스 제한
Storage 계정 관리 작업(읽기) 5분당 800
Storage 계정 관리 작업(쓰기) 초당 10/시간당 1200
Storage 계정 관리 작업(목록) 5분당 100

네트워크 제한

Microsoft. Network 리소스 공급자는 다음과 같은 제한 한도를 적용합니다.

작업(Operation) 제한
쓰기/삭제(PUT) 5분당 1000
읽기(GET) 5분당 10000

이러한 일반적인 제한 외에도 DNS 작업에 다음 제한이 적용됩니다.

DNS 영역 작업 제한(영역당)
만들기 또는 업데이트 분당 40
삭제 분당 40
Get 분당 1000
List 분당 60개
리소스 그룹별 목록 분당 60개
엽데이트 분당 40
DNS 레코드 집합 작업 제한(영역당)
만들기 또는 업데이트 분당 200개
삭제 분당 200개
Get 분당 2000
DNS 영역별 목록 분당 60개
유형별 목록 분당 60개
엽데이트 분당 200개

계산 제한

컴퓨팅 작업에 대한 제한 제한에 대한 자세한 내용은 API 제한 오류 문제 해결 - Compute를 참조 하세요.

Virtual Machine Scale Set 내에서 가상 머신 인스턴스를 검사 경우 Virtual Machine Scale Sets 작업을 사용합니다. 예를 들어 가상 머신 확장 집합 VM - 매개 변수와 함께 목록을 사용하여 가상 머신 인스턴스의 전원 상태를 검사. 이 API는 요청 수를 줄입니다.

Azure Resource Graph 제한

Azure Resource Graph 는 요청 수를 해당 작업으로 제한합니다. 다시 기본 요청을 결정하는 이 문서의 단계와 제한에 도달할 때 응답하는 방법도 Resource Graph에도 적용됩니다. 그러나 Resource Graph는 자체 한도 및 재설정 속도를 설정합니다. 자세한 내용은 Resource Graph 제한 헤더를 참조하세요.

기타 리소스 공급자

다른 리소스 공급자의 제한에 대한 자세한 내용은 다음을 참조하세요.

오류 코드

한도에 도달하면 HTTP 상태 코드 429 너무 많은 요청이 표시됩니다. 응답에는 Retry-After 값이 포함되며 이는 애플리케이션이 다음 요청을 보낼 때까지 대기(또는 절전)하는 시간(초)을 지정합니다. 다시 시도 값이 경과하기 전에 요청을 보내면 요청이 처리되지 않고 새 다시 시도 값이 반환됩니다.

Azure SDK를 사용하는 경우 SDK에 자동 다시 시도 구성이 있을 수 있습니다. 자세한 내용은 Azure 서비스에 대한 다시 시도 지침을 참조하세요.

일부 리소스 공급자는 429를 반환하여 임시 문제를 보고합니다. 이 문제는 요청에 의해 직접 발생하지 않는 오버로드 조건일 수 있습니다. 또는 대상 리소스 또는 종속 리소스의 상태에 대한 일시적인 오류를 나타낼 수 있습니다. 예를 들어 네트워크 리소스 공급자는 대상 리소스가 다른 작업에 의해 잠겨 있을 때 RetryableErrorDueToAnotherOperation 오류 코드와 함께 429를 반환합니다. 오류가 제한 또는 임시 조건에서 발생하는지 확인하려면 응답에서 오류 세부 정보를 확인합니다.

요청 다시 기본

응답 헤더를 검사하여 다시 기본 요청 수를 확인할 수 있습니다. 읽기 요청은 읽기 요청을 다시 기본 수에 대한 헤더의 값을 반환합니다. 쓰기 요청에는 나머지 쓰기 요청 수에 대한 값이 포함됩니다. 다음 표에서는 이러한 값을 검사할 수 있는 응답 헤더에 대해 설명합니다.

응답 헤더 설명
x-ms-ratelimit-remaining-subscription-deletes 구독 범위 삭제가 남아 있습니다. 이 값은 삭제 작업에서 반환됩니다.
x-ms-ratelimit-remaining-subscription-reads 구독 범위 읽기를 다시 기본. 이 값은 읽기 작업에 반환됩니다.
x-ms-ratelimit-re기본ing-subscription-writes 구독 범위 쓰기를 다시 기본. 이 값은 쓰기 작업에서 반환됩니다.
x-ms-ratelimit-re기본ing-tenant-reads 테넌트에 범위가 지정된 나머지 읽기
x-ms-ratelimit-remaining-tenant-writes 테넌트 범위 쓰기 다시 기본
x-ms-ratelimit-re기본ing-subscription-resource-requests 구독 범위 리소스 종류 요청이 다시 기본.

이 헤더 값은 서비스가 기본 제한을 재정의하는 경우에만 반환됩니다. Resource Manager는 구독 읽기 또는 쓰기 대신 이 값을 추가합니다.
x-ms-ratelimit-re기본ing-subscription-resource-entities-read 구독 범위 리소스 종류 컬렉션 요청이 다시 기본.

이 헤더 값은 서비스가 기본 제한을 재정의하는 경우에만 반환됩니다. 이 값은 컬렉션 요청(목록 리소스)기본 수를 제공합니다.
x-ms-ratelimit-re기본ing-tenant-resource-requests 테넌트 범위 리소스 종류 요청이 다시 기본.

이 헤더는 테넌트 수준의 요청에 대해서만 추가되며 서비스가 기본 제한을 재정의하는 경우에만 추가됩니다. Resource Manager는 테넌트 읽기 또는 쓰기 대신 이 값을 추가합니다.
x-ms-ratelimit-re기본ing-tenant-resource-entities-read 테넌트 범위 리소스 종류 컬렉션 요청이 다시 기본.

이 헤더는 테넌트 수준의 요청에 대해서만 추가되며 서비스가 기본 제한을 재정의하는 경우에만 추가됩니다.

리소스 공급자는 다시 기본 요청에 대한 정보가 포함된 응답 헤더를 반환할 수도 있습니다. 계산 리소스 공급자에서 반환하는 응답 헤더에 대한 자세한 내용은 통화 요금 정보 응답 헤더를 참조하세요.

헤더 값 검색

코드 또는 스크립트에서 이러한 헤더 값을 검색하는 것은 임의의 헤더 값을 검색하는 것과 같습니다.

예를 들어 C#에서 다음 코드를 사용하여 응답이라는 HttpWebResponse 개체에서 헤더 값을 검색합니다.

response.Headers.GetValues("x-ms-ratelimit-remaining-subscription-reads").GetValue(0)

PowerShell에서는 Invoke-WebRequest 작업에서 헤더 값을 검색합니다.

$r = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/{guid}/resourcegroups?api-version=2016-09-01 -Method GET -Headers $authHeaders
$r.Headers["x-ms-ratelimit-remaining-subscription-reads"]

전체 PowerShell 예제는 구독에 대한 Resource Manager 제한 확인을 참조 하세요.

디버깅에 대한 다시 기본 요청을 보려면 PowerShell cmdlet에 -Debug 매개 변수를 제공할 수 있습니다.

Get-AzResourceGroup -Debug

다음 응답 값을 포함하여 많은 값을 반환합니다.

DEBUG: ============================ HTTP RESPONSE ============================

Status Code:
OK

Headers:
Pragma                        : no-cache
x-ms-ratelimit-remaining-subscription-reads: 11999

쓰기 제한을 얻으려면 쓰기 작업을 사용합니다.

New-AzResourceGroup -Name myresourcegroup -Location westus -Debug

다음 값을 포함하여 많은 값을 반환합니다.

DEBUG: ============================ HTTP RESPONSE ============================

Status Code:
Created

Headers:
Pragma                        : no-cache
x-ms-ratelimit-remaining-subscription-writes: 1199

Azure CLI에서는 자세한 정보 표시 옵션을 사용하여 헤더 값을 검색합니다.

az group list --verbose --debug

다음 값을 포함하여 많은 값을 반환합니다.

msrest.http_logger : Response status: 200
msrest.http_logger : Response headers:
msrest.http_logger :     'Cache-Control': 'no-cache'
msrest.http_logger :     'Pragma': 'no-cache'
msrest.http_logger :     'Content-Type': 'application/json; charset=utf-8'
msrest.http_logger :     'Content-Encoding': 'gzip'
msrest.http_logger :     'Expires': '-1'
msrest.http_logger :     'Vary': 'Accept-Encoding'
msrest.http_logger :     'x-ms-ratelimit-remaining-subscription-reads': '11998'

쓰기 제한을 얻으려면 쓰기 작업을 사용합니다.

az group create -n myresourcegroup --location westus --verbose --debug

다음 값을 포함하여 많은 값을 반환합니다.

msrest.http_logger : Response status: 201
msrest.http_logger : Response headers:
msrest.http_logger :     'Cache-Control': 'no-cache'
msrest.http_logger :     'Pragma': 'no-cache'
msrest.http_logger :     'Content-Length': '163'
msrest.http_logger :     'Content-Type': 'application/json; charset=utf-8'
msrest.http_logger :     'Expires': '-1'
msrest.http_logger :     'x-ms-ratelimit-remaining-subscription-writes': '1199'

다음 단계