Amazon ECS API에 대한 요청 스로틀링
Amazon Elastic Container Service는 각 AWS 계정에 대한 모든 API 요청을 지역별로 스로틀링합니다. 이는 모든 Amazon ECS 고객에게 일관된 성능과 공정한 서비스 사용을 보장하기 위한 것입니다. 스로틀링은 Amazon ECS API에 대한 직접 호출이 Amazon ECS 및 이와 통합되는 다른 AWS 서비스 모두에 대해 허용되는 최대 API 요청 할당량을 초과하지 않도록 합니다. API 직접 호출에는 다음에서 시작되었는지 여부에 관계없이 요청 할당량이 적용됩니다.
-
타사 애플리케이션
-
명령줄 도구
-
Amazon ECS 콘솔
API 제한 할당량을 초과하면 ThrottlingException 오류 코드가 표시됩니다.
An error occurred (ThrottlingException) when calling the DescribeClusters operation (reached max retries: 4): Rate exceeded.
com.amazonaws.services.ecs.model.AmazonECSException: Rate exceeded (Service: AmazonECS; Status Code: 400; Error
Code: ThrottlingException; Request ID: 5ed90669-e454-464d-9b2f-6523bc86f537; Proxy: null)
스로틀링 적용 방법
Amazon ECS는 토큰 버킷 알고리즘
Amazon ECS는 리전별로 계정의 모든 Amazon ECS API에 대한 API 요청 제출 속도를 검사하고 지속과 버스트라는 두 가지 유형의 API 스로틀링 할당량을 적용합니다. 지속 속도는 작업에 대해 시간 경과에 따라 초당 허용되는 평균 API 요청 수입니다. 버스트 속도는 1초 동안 허용되는 최대 API 요청 수입니다. 버스트를 사용하면 주기적으로 지속 속도보다 더 많은 수의 API 요청을 수행할 수 있습니다. 그런 다음 Amazon ECS는 시간 경과에 따라 허용되는 API 요청 속도가 지속 속도로 안정화될 때까지 후속 API 요청을 스로틀링합니다. 토큰 버킷 알고리즘에서 버킷 최대 용량은 버스트 속도를 나타내고 버킷 리필 속도는 지속 속도입니다. 다음 예제에서는 이러한 용어를 사용하여 Amazon ECS API 요청 스로틀링을 설명합니다.
API 요청 수에 스로틀링이 적용되며 요청을 할 때마다 토큰 버킷에서 토큰이 하나씩 차감됩니다. 예를 들어 DescribeClusters API와 같은 클러스터 읽기 작업의 버킷 크기는 토큰 50개이므로 1초에 최대 50개의 DescribeClusters 요청을 수행할 수 있습니다. 매초 요청이 50개를 초과하면 스로틀링이 발생하고 해당 초 내에 나머지 요청은 실패합니다.
버킷은 설정된 속도로 자동으로 다시 채워집니다. 버킷이 최대 용량 미만이면 최대 용량에 도달할 때까지 매초마다 정해진 수의 토큰이 버킷에 다시 추가됩니다. 다시 채우기 토큰이 도착했을 때 버킷이 다 차면 토큰은 폐기됩니다. 버킷은 최대 토큰 수를 초과하여 보관할 수 없습니다. 예를 들어 DescribeClusters API와 같은 클러스터 읽기 작업의 버킷 크기는 토큰 50개이며, 다시 채우기 속도는 초당 토큰 20개입니다. 1초에 50건의 DescribeClusters API 요청을 하면 버킷의 즉시 토큰이 0개로 줄어듭니다. 그러면 토큰이 최대 용량 50개에 도달할 때까지 매초마다 20개의 토큰이 버킷에 다시 채워집니다. 이는 이전에 비어 있던 버킷이 2.5초 후에 최대 용량에 도달함을 의미합니다.
API 요청을 하기 전에 버킷이 완전히 꽉 찰 때까지 기다릴 필요가 없습니다. 버킷에 추가된 토큰은 그대로 사용할 수 있습니다. 다시 채우기 토큰을 즉시 사용하는 경우 버킷이 최대 용량에 도달하지 않습니다. 예를 들어 DescribeClusters API와 같은 클러스터 읽기 작업의 버킷 크기는 토큰 50개이며, 다시 채우기 속도는 초당 토큰 20개입니다. 1초에 50개의 API 요청을 수행하여 버킷을 고갈시키는 경우 초당 20개의 API 요청을 계속 수행할 수 있습니다. 버킷은 초당 20개 미만의 API 요청을 할 경우에만 최대 용량으로 다시 채울 수 있습니다.
요청 토큰 버킷 크기 및 다시 채우기 속도
요청 속도 제한을 위해 API 작업은 범주로 그룹화됩니다. 범주의 모든 API 작업이 동일한 토큰 버킷을 공유합니다. 예를 들어, DescribeClusters 및 ListClusters API는 용량이 50이고 리필 속도가 20인 클러스터 읽기 작업 버킷을 공유합니다. 즉, 모든 클러스터 읽기 작업에 대한 누적 API 요청 수는 50개의 API 요청이라는 동일한 버스트 속도 할당량에 의해 스로틀링됩니다. 따라서 1초 동안 DescribeClusters API 요청 25개와 ListClusters API 요청 25개를 수행하거나, DescribeClusters API 요청 30개와 ListClusters API 요청 20개를 수행하거나, DescribeClusters API 요청 50개와 ListClusters API 요청 0개를 수행하거나, DescribeClusters API 요청 0개와 ListClusters API 요청 50개를 수행할 수는 있지만, DescribeClusters API 요청 50개와 ListClusters API 요청 50개를 동시에 수행할 수는 없습니다. 지속 속도 또한 버킷 내의 모든 API 요청에 누적 적용됩니다.
다음 표는 모든 AWS 리전의 버킷 또는 버스트 용량과 리필 또는 지속 속도를 보여줍니다. 모든 API 작업 범주는 리전별로 각 AWS 계정에 대해 비율 할당량을 적용합니다.
| API 작업 범주 | 작업 | 버킷 최대 용량(또는 버스트율) | 버킷 리필률(또는 지속률) |
|---|---|---|---|
| 클러스터 수정 작업 |
|
20 | 1 |
| 클러스터 읽기 작업 |
|
50 | 20 |
| 태스크 정의 수정 작업 |
|
20 | 1 |
| 태스크 정의 읽기 작업 |
|
50 | 20 |
| 태스크 정의 삭제 작업 |
|
5 | 1 |
| 용량 공급자 수정 작업 |
|
10 | 1 |
| 용량 공급자 읽기 작업 |
|
50 | 20 |
| 태그 수정 작업 |
|
20 | 10 |
| 태그 읽기 작업 |
|
50 | 20 |
| 수정 작업 설정 |
|
10 | 1 |
| 읽기 작업 설정 |
|
50 | 20 |
| 클러스터 리소스 수정 작업 |
|
100 | 40 |
| 클러스터 리소스 읽기 작업 |
|
100 | 20 |
| 에이전트 수정 작업 |
|
200 | 120 |
| 서비스 수정 작업 |
|
50 | 5 |
| 서비스 읽기 작업 |
|
100 | 20 |
| 서비스 배포 작업 |
|
50 | 20 |
| 서비스 개정 작업 |
|
50 | 20 |
|
태스크 보호 작업 |
|
200 | 80 |
| 클러스터 서비스 리소스 읽기 작업 |
|
10 | 1 |
1 또한 AWS Fargate는 Amazon ECS RunTask API를 Amazon ECS 개발자 안내서의 여기에 나열된 속도로 스로틀링합니다.
API 제한 할당량 조정
AWS 계정에 대한 API 스로틀링 할당량 증가를 요청할 수 있습니다. 할당량 조정을 요청하려면 AWS Support Center
API 스로틀링 처리
오류 재시도 및 지수 백오프 전략을 구현하여 워크로드에 대한 스로틀링 오류의 영향을 피할 수 있습니다. AWS SDK를 사용하는 경우 자동 재시도 로직이 이미 기본 제공되며 구성 가능합니다. 자세한 내용은 다음 리소스를 참조하세요.
-
AWS 일반 참조 안내서의 AWS의 오류 재시도 횟수 및 지수 백오프
-
지수 백오프 및 지터
블로그 게시물 -
Amazon Builders' Library의 시간 제한, 재시도 및 지터를 사용한 백오프