CodeBuild에서 Docker 이미지를 사용할 때 “이미지 구성 가져 오기 오류: toomanyrequests”오류를 해결하려면 어떻게 합니까?

최종 업데이트 날짜: 2020년 11월 19일

AWS CodeBuild에서 Docker 이미지를 사용할 때 발생하는 “이미지 구성 가져 오기 오류: toomanyrequests” 오류를 해결하고 싶습니다.

간략한 설명

CodeBuild에서 Docker 이미지를 사용하는 경우 퍼블릭 DockerHub 리포지토리에서 계층을 가져올 때 스로틀을 경험할 수 있습니다.

스로틀이 발생할 때 일어나는 오류를 해결하려면 DockerHub 계정 자격 증명을 사용하여 계층 풀링을 인증하도록 CodeBuild를 구성해야 합니다.

중요: 다음 단계를 완료하려면 DockerHub 계정과 계정의 사용자 이름 및 암호가 있어야 합니다.

해결 방법

AWS Secrets Manager를 사용하여 DockerHub 자격 증명 저장

1.    Secrets Manager 콘솔을 엽니다.

2.    [새로운 보안 정보 저장(Store a new secret)]을 선택합니다.

3.    [보안 정보 유형 선택(Select secret typ)] 섹션에서 [기타 보안 정보 유형(Other type of secrets)]을 선택합니다.

4.    [이 보안 정보에 저장할 키/값 페어 지정(Specify the key/value pairs to be stored in this secret)] 섹션에서 [보안 정보 키/값(Secret key/value)] 탭을 선택합니다.

5.    첫 번째 텍스트 상자에 사용자 이름을 입력합니다. 두 번째 텍스트 상자에 DockerHub 사용자 이름을 입력합니다. 그런 다음 [행 추가(Add row)]를 선택합니다.

6.    새 행의 첫 번째 텍스트 상자에 [암호(password)]를 입력합니다. 두 번째 텍스트 상자에 DockerHub 암호를 입력합니다. 그런 다음 [행 추가(Add rowr)]를 선택합니다.

7.    [다음]을 선택합니다.

8.    [보안 정보 이름(Secret name)]에 보안 정보의 이름을 입력합니다. 예: dockerhub

9.    [Next]를 선택합니다.

10.    [자동 교체 비활성화(Disable automatic rotation)]에 기본 설정이 선택되어 있는지 확인합니다.

11.    [다음]을 선택합니다.

12.    [스토어(Store)]를 선택합니다.

13.    [보안 정보 이름(Secret name)] 열에서 보안 정보를 선택합니다.

14.    [보안 정보 세부 정보(Secret details)] 섹션에서 [보안 정보 ARN(Secret ARN)]에 대한 Amazon 리소스 이름(ARN)을 기록합니다.

프로비저닝 단계에서 발생하는 스로틀 문제 해결

1.    CodeBuild 콘솔을 엽니다.

2.    탐색 창에서 [빌드(Build)]를 선택한 다음 [빌드 프로젝트(Build projects)]를 선택합니다.

3.    [빌드 프로젝트(build project)]를 선택합니다.

4.    [편집(Edit)]을 선택한 다음 [환경(Environment)]을 선택합니다.

5.    [이미지 재지정(Override image)]을 선택합니다.

6.    [새 환경 이미지(New environment image)]에 대해 [사용자 지정 이미지(Custom image)]를 선택합니다.

7.    [환경 유형(Environment type)]에서 사용자 지정 이미지를 선택합니다.

8.    [이미지 레지스트리(Image registry)]에 대해 [기타 레지스트리(Other registry)]를 선택합니다.

9.    [외부 레지스트리 URL(External registry URL)]에 Docker 이미지의 이름을 입력합니다.

10.    [레지스트리 자격 증명(Registry credential)]에 앞서 언급한 보안 정보 ARN을 입력합니다.

11.    [환경 업데이트(Update environment)]를 선택합니다.

다른 단계에서 발생하는 스로틀 문제 해결

보안 정보에 액세스하려면 CodeBuild 서비스 역할에 AWS Identity and Access Management(IAM) 권한을 부여해야 합니다.

1.    CodeBuild 콘솔을 엽니다.

2.    탐색 창에서 [빌드(Build)]를 선택한 다음 [빌드 프로젝트(Build projects)]를 선택합니다.

3.    [빌드 프로젝트(build project)]를 선택합니다.

4.    [빌드 세부 정보(Build details)] 탭을 선택합니다.

5.    [환경(Environment)] 섹션에서 [서비스 역할(Service role)]에 ARN의 서비스 역할을 선택합니다. 그러면 IAM 콘솔이 열립니다.

6.    [권한(Permissions)] 탭에서 [인라인 정책 추가(Add inline policy)]를 선택합니다.

7.    [JSON] 탭을 선택합니다.

8.    텍스트 편집기의 코드를 다음 IAM 정책으로 바꿉니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "YOUR_SECRET_ARN*"
            ]
        }
    ]
}

참고: 앞의 코드에서 YOUR_SECRET_ARN을 앞에서 설명한 보안 정보 ARN으로 바꿉니다.

9.    [정책 검토(Review policy)]를 선택합니다.

10.    [이름(Name)]에 정책 이름을 입력합니다. 예: dockerhub_secret_access

11.    [정책 생성(Create policy)]을 선택합니다.

보안 정보를 검색하도록 CodeBuild 구성

1.    CodeBuild 콘솔을 엽니다.

2.    탐색 창에서 [빌드(Build)]를 선택한 다음 [빌드 프로젝트(Build projects)]를 선택합니다.

3.    [빌드 프로젝트(build project)]를 선택합니다.

4.    [편집(Edit)]을 선택한 다음 [환경(Environment)]을 선택합니다.

5.    [추가 구성(Additional configuration)] 섹션을 확장합니다.

6.    환경 변수를 추가하려면 [환경(Environment)] 변수 섹션에서 [이름(Name)]에 dockerhub_username을 입력합니다.

7.    [값(Value)]에 보안 정보의 이름을 입력하고 그 다음에는 :username을 입력합니다. 예: dockerhub:username

8.    [유형(Type)]에 대해 [Secrets Manager]를 선택합니다.

9.    다음 환경 변수를 추가하려면 [환경 변수 추가(Add environment variable)]를 선택합니다.

10.    [이름(Name)]에 dockerhub_password를 입력합니다.

11.    [값(Value)]에 보안 정보의 이름을 입력하고 그 다음에는 :password를 입력합니다. 예: dockerhub:password

12.    [유형(Type)]에 대해 [Secrets Manager]를 선택합니다.

13.    [환경 업데이트(Update environment)]를 선택합니다.

14.    다른 Docker 작업을 수행하기 전에 buildspec을 수정하고 다음 명령을 추가합니다.

docker login -u $dockerhub_username -p $dockerhub_password

예를 들면 다음과 같습니다.

version: 0.2

phases:
  install:
    commands:
      - docker login -u $dockerhub_username -p $dockerhub_password
 
  build:
    commands:
      - docker pull docker:dind

이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?