CodeBuild에서 ECR만 Docker Download Rate Limit 회피

2860 단어 AWSCICDtech

Docker download rate limit


2021년 현재 코드빌드에서 도커 풀과 함께 처리(이미지 구축 등)를 진행하면 높은 확률로 다음과 같은 오류가 발생할 수 있다.
toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
2020년 말부터 Docker사는 Docker hub 계정을 사용하지 않는 사용자가 Docker pull을 할 때 제한을 설정했다.
이 제한은 IP 주소 단위로 요약된 것으로 조금씩 엄격하게 제한된 것 같으며 최종적으로 6시간 100개의 이미지 정도의pull이 상한선으로 예상된다.

이러면 금방 제한받지 않을까요?


사실 CodeBuild의 IP 주소는 상당히 유연한 디자인인 것 같고 다른 사용자의pull 부분도 상기 제한에 들어갈 것이다.
이 때문에 자신의 계정에 처음 풀을 올려도 처음부터rate limit에 자주 휘감긴다.

회피책


대체로 아래 두 개 중 하나일 것이다.
  • pull 전에 Docker hub 계정으로 로그인
  • 기본 이미지를 ECR에 대칭복사한 다음 재사용합니다.
  • 전자는 Docker hub 계정으로 로그인하면 계정 단위로 제한되기 때문에 피할 수 있다.
    나는 이 방법이 다른 사람들이 매우 많이 말할 것이라고 생각하기 때문에 생략한다.
    이번에는 ECR에 미리 인상을 보내는 방법을 말한다.
    Docker hub 계정으로 직접 로그인하는 게 빠를 것 같은데...

    ECR로만 이미지 구성


    rate limit을 피하려면 Docker hub 계정을 사용하는 것이 빠를 것 같아요.
    조직의 이유로 전용 Docker hub 계정을 만들 수 없는 경우 이 옵션을 선택합니다.
    또 Docker hub 계정 자체가 앞으로도 더 엄격해질 수 있다는 점을 고려하면 우리측 접근법도 후보가 될 수 있다고 생각한다.
    방법으로는 사용된 인상을 ECR에만 쓰는데 문제는 그것이 가져온 방법이다.Docker pull
  • 로컬 개체 이미지 찾기
  • Docker hub에 이미지가 있는지 찾기
  • 위에서 설명한 대로 ECR 창고를 직접 설정하면 완료됩니다.
    # FROM nginx:1.16 Dockerhubからpullする
    FROM {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/{イメージ名} # 直接ECRからpullする
    
    이 경우 개발자는 ECR에 액세스할 수 있는 권한이 있어야 기본 이미지를 가져올 수 있습니다.여러 사람이 개발할 때 장애가 생길 가능성이 높다.
    기존Docker file을 입수하는 것도 촌스럽다.
    인프라의 문제는 인프라에서 해결하려는 것이기 때문에 피해야 한다.

    기본 이미지를 ECR로 밀어냄


    우선 콘솔이든 terraform이든 상관없이 ECR 창고를 제작해 주십시오.
    resource "aws_ecr_repository" "nginx" {
      name                 = "nginx"
    }
    
    다음에 옆에 있는 로컬 터미널로 공식부터pull 기본 이미지를 시작합니다.
    docker pull nginx:1.16  
    
    제작된 ECR 창고에 방금 전 이미지를 보관합니다.
    docker tag  {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest  nginx:1.16
    docker push {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
    
    이렇게 ECR 이미지의 준비는 OK입니다.

    Docker로 기본 이미지 속이기


    CodeBuild의 yml은 다음과 같이 해결할 수 있습니다.
    version: 0.2
    phases:
      pre_build:
        commands:
          - $(aws ecr get-login --no-include-email)
          - docker pull {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest 
          - docker tag {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest nginx:1.16 
    
    중요한 것은 기본 이미지를 사용하기 전에 ECR에서 이미지를pull
    dockertag 명령을 사용하기로 예정된 기본 인상과 같은 이름을 부여했을 뿐입니다.
    이렇게 하면 기본 이미지가 로컬로 판정되므로 CodeBuild에서 Docker hub에 연결되지 않고 ECR에서 가져온 이미지가 사용됩니다.
    체감치로서 Codebuild은 다른 CICD 서비스에 비해rate limit에도 영향을 미치므로 피해야 합니다.특별한 이유가 없다면 dockerhub 계정을 만드세요.

    좋은 웹페이지 즐겨찾기