Amazon ECS에서 “CannotPullContainerError: 가져오기 속도 한계에 도달했습니다” 오류를 해결하려면 어떻게 해야 합니까?

5분 분량
0

Docker Hub에서 이미지를 가져오려고 하면 Amazon Elastic Container Service(Amazon ECS) 작업이 실패하고 다음 오류가 발생합니다. CannotPullContainerError: 이미지 검사가 5번 재시도됨: httpReaderSeeker: 열기 실패: 예기치 않은 상태 코드 https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 너무 많은 요청 - 서버 메시지: toomanyrequests: 가져오기 속도 한계에 도달했습니다. 인증 및 업그레이드를 통해 한계를 늘릴 수 있음: https://www.docker.com/increase-rate-limit

간략한 설명

Docker 가져오기 속도 한계에 도달한 후 퍼블릭 Docker Hub 리포지토리에서 이미지를 가져오려고 시도하면 오류가 발생하며 HTTP 상태 코드 429가 반환됩니다. Docker Hub는 IP 주소를 사용하여 사용자를 인증하며 가져오기 속도 한계는 개별 IP 주소를 기반으로 합니다. 익명 사용자의 경우, 속도 한계는 IP 주소당 6시간 동안 100번의 가져오기로 설정됩니다. Docker ID가 있는 인증된 사용자의 경우, 가져오기 속도는 6시간 동안 200번으로 설정됩니다. 이미지 가져오기 요청이 이러한 한계를 초과하면 6시간의 유예기간이 경과할 때까지 해당 요청이 거부됩니다. Amazon ECS/Amazon EKS 워크로드를 실행하는 경우, 대부분의 데이터는 고정 IP 주소가 있는 NAT 게이트웨이를 통해 가져옵니다. 이 경우 가져오기 한계를 초과하면 요청이 조절됩니다.

해결 방법

다음 해결 방법 중 하나를 사용하여 이 문제를 해결하십시오.

퍼블릭 이미지를 Amazon ECR 프라이빗 레지스트리에 복사

Amazon Elastic Container Registry (Amazon ECR) 리포지토리를 생성한 다음 이 새 리포지토리에 이미지를 푸시합니다. 이 방법을 사용하면 Amazon ECR 리포지토리에서 이미지를 가져와서 Docker Hub 가져오기 한계를 초과하지 않도록 할 수 있습니다.

1.    다음과 유사한 명령을 실행하여 Docker Hub에서 이미지를 가져옵니다.

docker pull example-image

2.    다음과 유사한 명령을 실행하여 Docker 클라이언트가 Amazon ECR 레지스트리에 액세스하도록 인증합니다.

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com

3.    다음과 유사한 명령을 실행하여 리포지토리에 푸시할 이미지에 태그를 지정합니다.

docker tag myrepository:latest 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

4.    다음과 유사한 명령을 실행하여 Docker 이미지를 Amazon ECR 레지스트리에 푸시합니다.

docker push 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

5.    다음과 유사한 명령을 실행하여 새로 푸시된 Amazon ECR 이미지를 기본 이미지로 사용하도록 Docker 파일을 업데이트합니다.

FROM 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag

앞의 명령을 다음과 같이 수정합니다.

  • example-image를 푸시하려는 퍼블릭 이미지의 이름으로 수정
  • 1111222233334444를 계정 ID로 수정
  • myrepository:latest를 Amazon ECR 레지스트리의 이름을 수정
  • eu-west-1을 사용자 선택 리전으로 수정

Docker Hub 가져오기 인증

Docker Hub로 인증하면 인증된 사용자는 속도 한계가 증가하며 Docker 사용자 이름에 따라 속도가 제한됩니다. AWS Secrets Manager에서 Docker Hub 사용자 이름과 암호를 보안 정보로 저장한 다음 이 보안 정보를 사용하여 Docker Hub에 대해 인증할 수 있습니다.

Docker Hub 자격 증명에 대한 Secrets Manager 보안 정보 생성

Docker Hub 자격 증명에 대한 보안 정보를 만들려면 프라이빗 레지스트리 인증 활성화기본 보안 정보 만들기 단원에 있는 지침을 사용하십시오.

작업 실행 AWS Identity and Access Management (AWS IAM) 역할 업데이트

생성한 보안 정보에 Amazon ECS 작업에 대한 액세스 권한을 부여하려면 작업 실행 역할에 인라인 정책으로 필요한 권한을 수동으로 추가해야 합니다.

1.    IAM 콘솔을 엽니다.

2.    탐색 창에서 [Roles]를 선택합니다.

3.    ecsTaskExecutionRole에 대한 역할 목록을 검색하고 역할을 선택하여 연결된 정책을 확인합니다.

4.    권한(Permissions) 탭에서 **권한 추가(Add permissions)**를 선택한 다음 **인라인 정책 만들기(Create inline policy)**를 선택합니다.

5.    정책 만들기(Create policy) 페이지에서 JSON을 선택한 후 다음 정책을 복사하여 붙여 넣습니다.

{
 "Version": "2012-10-17",
 "Statement": [{
  "Effect": "Allow",
  "Action": [
   "secretsmanager:GetSecretValue",
   "kms:Decrypt"
  ],
  "Resource": [
   "arn:aws:secretsmanager:eu-west-1:1111222233334444:secret:dockerhub-0knT",
   "arn:aws:kms:eu-west-1:1111222233334444:key/mykey"
  ]
 }]
}

정책에서 다음 항목을 바꿔야 합니다.

  • 1111222233334444를 계정 ID로 수정
  • eu-west-1을 사용자의 리전으로 수정
  • mykey를 AWS KMS 키로 수정

참고: 키가 기본 키를 사용하지 않고 사용자 지정 AWS Key Management Service(AWS KMS) 키를 사용하는 경우에만 kms:Decrypt를 포함합니다. 사용자 지정 키의 ARN을 리소스로 추가합니다.

6.    정책 검토를 선택합니다.

7.    이름에 정책 이름(ECSSecrets)을 입력합니다.

8.    정책 생성을 선택합니다.

Docker 인증에 보안 정보를 사용하는 작업 정의를 만듭니다.

클래식 콘솔을 사용하여 작업 정의 생성의 지침에 따라 Amazon ECS 작업 정의를 생성합니다. 작업 실행 역할의 경우, 이전 섹션에서 업데이트한 작업 실행 IAM 역할을 선택해야 합니다.

컨테이너 정의 섹션에서 다음을 수행합니다.

  1. **컨테이너 추가(Add container)**를 선택합니다.
  2. **컨테이너 이름(Container name)**에 컨테이너 이름을 입력합니다.
  3. **이미지(Image)**에 이미지 이름을 입력하거나 프라이빗 이미지의 경로를 포함합니다(예: repository-url/image.tag).
  4. **프라이빗 리포지토리 인증(Private repository authentication)**을 선택합니다.
  5. **Secrets Manager ARN 또는 이름(name)**에 생성한 보안 정보의 ARN을 입력합니다.
  6. **추가(Add)**를 선택합니다.

Amazon ECS 클러스터를 생성하고 Amazon ECS 작업을 실행합니다.

Amazon ECS 클러스터를 생성합니다. 그런 다음 이전 섹션에서 만든 작업 정의를 사용하여 작업을 실행합니다.

퍼블릭 컨테이너 이미지에 Amazon ECR 퍼블릭 레지스트리 사용

Docker 파일에서 사용 중인 공개 이미지를 식별합니다. 적절한 검색 필터를 사용하여 Amazon ECR 퍼블릭 갤러리에서 이러한 이미지를 검색합니다. 퍼블릭 리포지토리를 탐색하고 이미지를 가져오기 위해 인증할 필요가 없습니다. Amazon ECR 퍼블릭 레지스트리에는 운영 체제, AWS 게시 이미지, Kubernetes 애드온 및 아티팩트를 비롯하여 인기 있는 기본 이미지가 포함되어 있습니다. Amazon ECR 퍼블릭 레지스트리에서 이미지를 가져와서 Docker Hub의 속도 한계에 도달하는 것을 방지할 수 있습니다.

작업 정의에서 이러한 이미지를 컨테이너 이미지의 소스로 사용할 수 있습니다.

ContainerDefinitions: [
 {
 ...
 Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest'
 ...
 }
 ]

이러한 이미지를 Docker 파일에서 기본 이미지로 사용하도록 선택할 수도 있습니다:

Docker File
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

Docker Pro 또는 Team 구독으로 업그레이드

플랜을 24시간 동안 50,000번의 가져오기를 제공하는 Docker Pro 또는 Team 구독으로 업그레이드할 수 있습니다. 요금에 대한 자세한 내용은 Docker Hub 요금을 참조하세요.


관련 정보

Amazon ECR 요금

Amazon ECR 퍼블릭 Service Quotas

AWS 공식
AWS 공식업데이트됨 3달 전