Amazon ECS 서비스 할당량과 API 스로틀링 한도 처리하기

Amazon ECS 서비스 할당량과 API 스로틀링 한도 처리하기

Amazon ECS는 Elastic Load Balancing, AWS Cloud Map, Amazon EC2를 포함한 여러 AWS 서비스와 통합돼요. 이러한 밀접한 통합으로 Amazon ECS는 서비스 로드 밸런싱, Service Connect, 태스크 네트워킹, 클러스터 자동 확장 같은 여러 기능을 포함합니다. Amazon ECS와 통합된 다른 AWS 서비스는 모두 일관된 성능과 사용률을 유지하기 위해 서비스 할당량과 API 속도 제한을 유지해요.

출처: 문서

본문

이러한 서비스 할당량은 또한 필요한 것보다 더 많은 리소스를 우연히 프로비저닝하는 것을 방지하고, 청구서를 늘릴 수 있는 악의적인 행동을 보호합니다. 서비스 할당량과 AWS API 속도 제한을 숙지하면 예기치 않은 성능 저하를 걱정하지 않고 워크로드 확장을 계획할 수 있어요. 자세한 내용은 Amazon ECS API 요청 스로틀링(Request throttling for the Amazon ECS API)을 참고하세요.

Amazon ECS에서 워크로드를 확장할 때 다음 서비스 할당량을 고려할 것을 권장합니다.

  • AWS Fargate에는 각 AWS 리전에서 동시에 실행되는 태스크 수를 제한하는 할당량이 있어요. Amazon ECS에는 On-Demand와 Fargate Spot 태스크에 대한 할당량이 모두 있습니다. 각 서비스 할당량에는 Fargate에서 실행하는 Amazon EKS 포드도 포함됩니다.
  • Amazon EC2 인스턴스에서 실행되는 태스크의 경우, 각 클러스터에 등록할 수 있는 최대 Amazon EC2 인스턴스 수는 5,000이에요. Auto Scaling 그룹 용량 공급자와 함께 Amazon ECS 클러스터 자동 확장을 사용하거나 클러스터용 Amazon EC2 인스턴스를 직접 관리한다면, 이 할당량이 배포 병목 현상이 될 수 있습니다. 더 많은 용량이 필요하면 더 많은 클러스터를 만들거나 서비스 할당량 증가를 요청할 수 있어요.
  • Auto Scaling 그룹 용량 공급자와 함께 Amazon ECS 클러스터 자동 확장을 사용한다면, 서비스 확장 시 클러스터당 PROVISIONING 상태의 태스크(Tasks in the PROVISIONING state per cluster) 할당량을 고려하세요. 이 할당량은 용량 공급자가 용량을 늘릴 수 있는 각 클러스터의 PROVISIONING 상태 태스크의 최대 수입니다. 한 번에 대량의 태스크를 시작하면 이 할당량을 쉽게 충족할 수 있어요. 예를 들어 각각 수백 개의 태스크가 있는 수십 개의 서비스를 동시에 배포하는 경우가 있습니다. 이런 경우 클러스터 용량이 부족하면 용량 공급자는 태스크를 배치하기 위해 새 컨테이너 인스턴스를 시작해야 해요. 용량 공급자가 추가 Amazon EC2 인스턴스를 시작하는 동안 Amazon ECS 서비스 스케줄러는 병렬로 계속 태스크를 시작할 수 있습니다. 그러나 이 활동은 클러스터 용량이 부족해 스로틀될 수 있어요. Amazon ECS 서비스 스케줄러는 새 컨테이너 인스턴스가 시작될 때 태스크 배치를 재시도하는 데 백오프(back-off) 및 지수 스로틀링 전략을 구현합니다. 결과적으로 배포나 scale-out 시간이 더 느려질 수 있어요. 이 상황을 피하려면 서비스 배포를 다음 중 한 가지 방식으로 계획할 수 있습니다. 클러스터 용량 증가가 필요 없는 대량의 태스크를 배포하거나, 새 태스크 시작을 위한 여유 클러스터 용량을 유지하세요.

워크로드를 확장할 때 Amazon ECS 서비스 할당량 외에도 Amazon ECS와 통합된 다른 AWS 서비스의 서비스 할당량도 고려하세요.

Elastic Load Balancing

Amazon ECS 서비스를 구성해 Elastic Load Balancing으로 태스크 전체에 트래픽을 고르게 분산할 수 있어요. 로드 밸런서 선택에 대한 자세한 내용과 권장 모범 사례는 로드 밸런싱으로 Amazon ECS 서비스 트래픽 분산하기(Use load balancing to distribute Amazon ECS service traffic)를 참고하세요.

Elastic Load Balancing 서비스 할당량

워크로드를 확장할 때 다음 Elastic Load Balancing 서비스 할당량을 고려하세요. 대부분의 Elastic Load Balancing 서비스 할당량은 조정 가능하며 Service Quotas 콘솔에서 증가를 요청할 수 있어요.

Application Load Balancer — Application Load Balancer를 사용할 때 사용 사례에 따라 다음에 대한 할당량 증가를 요청해야 할 수 있어요:

  • Application Load Balancer당 대상 수(Targets per Application Load Balancer) 할당량: Application Load Balancer 뒤의 대상 수.
  • 리전당 대상 그룹당 대상 수(Targets per Target Group per Region) 할당량: 대상 그룹 뒤의 대상 수.

자세한 내용은 Application Load Balancers 사용자 가이드의 Application Load Balancer에 대한 할당량(Quotas for your Application Load Balancers)을 참고하세요.

Network Load Balancer — Network Load Balancer에 등록할 수 있는 대상 수에는 더 엄격한 제한이 있어요. Network Load Balancer를 사용할 때는 종종 교차 영역 지원(cross-zone support)을 활성화하고 싶을 텐데, 이는 Network Load Balancer당 가용 영역별 대상 수(Targets per Availability Zone Per Network Load Balancer)에 추가 확장 제한이 따릅니다. 자세한 내용은 Network Load Balancers 사용자 가이드의 Network Load Balancer에 대한 할당량(Quotas for your Network Load Balancers)을 참고하세요.

Elastic Load Balancing API 스로틀링

Amazon ECS 서비스를 로드 밸런서를 사용하도록 구성하면 서비스가 정상으로 간주되기 전에 대상 그룹 상태 확인이 통과해야 해요. 이 상태 확인을 수행하기 위해 Amazon ECS는 사용자를 대신해 Elastic Load Balancing API 작업을 호출합니다. 계정에 로드 밸런서로 구성된 서비스가 많다면, 특히 RegisterTarget, DeregisterTarget, DescribeTargetHealth Elastic Load Balancing API 작업의 잠재적 스로틀링 때문에 서비스 배포가 더 느려질 수 있어요. 스로틀링이 발생하면 Amazon ECS 서비스 이벤트 메시지에 스로틀링 오류가 나타납니다.

AWS Cloud Map API 스로틀링을 경험한다면 Support에 연락해 AWS Cloud Map API 스로틀링 한도를 늘리는 방법에 대한 지침을 받을 수 있어요. 이러한 스로틀링 오류 모니터링·트러블슈팅에 대한 자세한 내용은 Amazon ECS 스로틀링 문제 처리(Handle Amazon ECS throttling issues)를 참고하세요.

탄력적 네트워크 인터페이스

태스크가 awsvpc 네트워크 모드를 사용하면 Amazon ECS는 각 태스크에 고유한 탄력적 네트워크 인터페이스(ENI)를 프로비저닝해요. Amazon ECS 서비스가 Elastic Load Balancing 로드 밸런서를 사용하면 이러한 네트워크 인터페이스도 서비스에 정의된 적절한 대상 그룹의 대상으로 등록됩니다.

탄력적 네트워크 인터페이스 서비스 할당량

awsvpc 네트워크 모드를 사용하는 태스크를 실행하면 각 태스크에 고유한 탄력적 네트워크 인터페이스가 연결돼요. 그 태스크들을 인터넷을 통해 연결해야 한다면 그 태스크의 탄력적 네트워크 인터페이스에 퍼블릭 IP 주소를 할당하세요. Amazon ECS 워크로드를 확장할 때 다음 두 가지 중요한 할당량을 고려하세요:

  • 리전당 네트워크 인터페이스(Network interfaces per Region) 할당량: AWS 계정의 한 AWS 리전에서 사용할 수 있는 최대 네트워크 인터페이스 수.
  • 리전당 탄력적 IP 주소(Elastic IP addresses per Region) 할당량: 한 AWS 리전의 최대 탄력적 IP 주소 수.

이 두 서비스 할당량은 모두 조정 가능하며 Service Quotas 콘솔에서 이에 대한 증가를 요청할 수 있어요. 자세한 내용은 Amazon Virtual Private Cloud 사용자 가이드의 Amazon VPC 서비스 할당량(Amazon VPC service quotas)을 참고하세요.

Amazon EC2 인스턴스에 호스팅된 Amazon ECS 워크로드의 경우, awsvpc 네트워크 모드를 사용하는 태스크를 실행할 때 최대 네트워크 인터페이스(Maximum network interfaces) 서비스 할당량, 즉 각 Amazon EC2 인스턴스의 최대 네트워크 인터페이스 수를 고려하세요. 이 할당량은 인스턴스에 배치할 수 있는 태스크 수를 제한해요. 이 할당량은 조정할 수 없으며 Service Quotas 콘솔에서 사용할 수 없습니다. 자세한 내용은 Amazon EC2 사용자 가이드의 인스턴스 유형별 네트워크 인터페이스당 IP 주소(IP addresses per network interface per instance type)를 참고하세요.

Amazon EC2 인스턴스에 연결할 수 있는 네트워크 인터페이스 수는 변경할 수 없지만, 탄력적 네트워크 인터페이스 트렁킹(elastic network interface trunking) 기능을 사용해 사용 가능한 네트워크 인터페이스 수를 늘릴 수 있어요. 예를 들어 기본적으로 c5.large 인스턴스는 최대 3개의 네트워크 인터페이스를 가질 수 있어요. 인스턴스의 기본 네트워크 인터페이스가 하나로 계산됩니다. 따라서 인스턴스에 추가 네트워크 인터페이스 2개를 더 연결할 수 있어요. awsvpc 네트워크 모드를 사용하는 각 태스크는 네트워크 인터페이스를 필요로 하므로, 이 인스턴스 유형에서는 일반적으로 두 개의 태스크만 실행할 수 있습니다. 이는 클러스터 용량을 충분히 활용하지 못하게 할 수 있어요. 탄력적 네트워크 인터페이스 트렁킹을 활성화하면 네트워크 인터페이스 밀도를 높여 각 인스턴스에 더 많은 태스크를 배치할 수 있습니다. 트렁킹을 켜면 c5.large 인스턴스는 최대 12개의 네트워크 인터페이스를 가질 수 있어요. 인스턴스는 기본 네트워크 인터페이스를 갖고, Amazon ECS가 인스턴스에 "트렁크(trunk)" 네트워크 인터페이스를 만들어 연결합니다. 결과적으로 이 구성을 사용하면 기본 두 개의 태스크 대신 인스턴스에서 10개의 태스크를 실행할 수 있어요. 자세한 내용은 Amazon ECS Linux 컨테이너 인스턴스 네트워크 인터페이스 늘리기(Increasing Amazon ECS Linux container instance network interfaces)를 참고하세요.

탄력적 네트워크 인터페이스 API 스로틀링

awsvpc 네트워크 모드를 사용하는 태스크를 실행할 때 Amazon ECS는 다음 Amazon EC2 API에 의존해요. 이 API 각각은 서로 다른 API 스로틀 한도를 가집니다. 자세한 내용은 Amazon EC2 API Reference의 Amazon EC2 API 요청 스로틀링(Request throttling for the Amazon EC2 API)을 참고하세요.

  • CreateNetworkInterface
  • AttachNetworkInterface
  • DetachNetworkInterface
  • DeleteNetworkInterface
  • DescribeNetworkInterfaces
  • DescribeVpcs
  • DescribeSubnets
  • DescribeSecurityGroups
  • DescribeInstances

탄력적 네트워크 인터페이스 프로비저닝 워크플로 중 Amazon EC2 API 호출이 스로틀되면 Amazon ECS 서비스 스케줄러는 지수 백오프로 자동 재시도해요. 이러한 자동 재시도는 때때로 태스크 시작이 지연되어 배포 속도가 느려질 수 있습니다. API 스로틀링이 발생하면 서비스 이벤트 메시지에 Operations are being throttled. Will try again later. 메시지가 표시됩니다. Amazon EC2 API 스로틀 한도를 지속적으로 충족한다면 Support에 연락해 API 스로틀링 한도 증가에 대한 지침을 받을 수 있어요. 스로틀링 오류 모니터링·트러블슈팅에 대한 자세한 내용은 스로틀링 문제 처리(Handling throttling issues)를 참고하세요.

AWS Cloud Map

Amazon ECS 서비스 검색(service discovery)과 Service Connect는 AWS Cloud Map API를 사용해 Amazon ECS 서비스의 네임스페이스를 관리해요. 서비스에 태스크 수가 많다면 다음 권장 사항을 고려하세요.

AWS Cloud Map 서비스 할당량

Amazon ECS 서비스가 서비스 검색이나 Service Connect를 사용하도록 구성되면, 서비스의 최대 태스크 수인 서비스당 태스크(Tasks per service) 할당량은 서비스의 최대 인스턴스 수인 AWS Cloud Map 서비스당 인스턴스(Instances per service) 서비스 할당량의 영향을 받아요. 특히 AWS Cloud Map 서비스 할당량은 실행할 수 있는 인스턴스 수를 서비스당 최대 1,000개 인스턴스로 줄입니다. 이 AWS Cloud Map 할당량은 변경할 수 없어요. 자세한 내용은 AWS Cloud Map 서비스 할당량(AWS Cloud Map service quotas)을 참고하세요.

AWS Cloud Map API 스로틀링

Amazon ECS는 사용자를 대신해 ListInstances, GetInstancesHealthStatus, RegisterInstance, DeregisterInstance AWS Cloud Map API를 호출해요. 이 API는 태스크를 시작할 때 서비스 검색을 돕고 상태 확인을 수행합니다. 태스크 수가 많은 서비스 검색을 사용하는 여러 서비스가 동시에 배포되면 AWS Cloud Map API 스로틀링 한도를 초과할 수 있어요. 이 경우 Amazon ECS 서비스 이벤트 메시지에 Operations are being throttled. Will try again later. 메시지가 나타나고 배포와 태스크 시작 속도가 느려질 수 있습니다. AWS Cloud Map은 이러한 API에 대한 스로틀링 한도를 문서화하지 않습니다. 이들에서 스로틀링이 발생하면 Support에 연락해 API 스로틀링 한도 증가에 대한 지침을 받을 수 있어요. 이러한 스로틀링 오류 모니터링·트러블슈팅에 대한 추가 권장 사항은 Amazon ECS 스로틀링 문제 처리(Handle Amazon ECS throttling issues)를 참고하세요.