CI / CD 파이프 라인에서 Docker Hub 속도 제한 오류 수정

Docker Hub 자격 증명 및 Prosper를 추가합니다. AWS CodeBuild 지침이 포함되어 있습니다.

Unsplash에 Matthew Cooksey의 사진

최근어려움을 뒤로하고 도커는 지난 한 해 동안 비즈니스 모델크게 개편했습니다 . 이 혁신의 일환으로 8 월에 회사는 Docker Hub 서비스에 대한 큰 변경 사항도 발표했습니다. 2020 년 11 월 1 일부터 :

  • Docker Hub의 오래된 (6 개월 이상 비활성) 이미지제거됩니다.
  • 익명 사용자무료 계정에 대해 요금이 제한 됩니다.

그래서 나는 물론 Docker의 변화를 완전히 이해합니다. 또한 명확하고 예측 가능한 사용 제한을 처리하는 것이 불확실성을 처리하는 것보다 쉽습니다.

Docker 팀 의 보장 에도 불구하고 특히 SaaS / PaaS 솔루션을 기반으로 구축 된 경우 많은 CI / CD 파이프 라인이 영향을받습니다 . 또한 11 월 1 일 마감일 훨씬 전에 일부 제한이 시행되고있는 것으로 보입니다. 작성 시점은 9 월 30 일이며 오늘은 내 CodePipeline의 일부 CodeBuild가 다음 오류로 인해 실패했습니다.

FROM ubuntu:18.04 AS baseimage
18.04: Pulling from library/ubuntu
171857c49d0f: Pulling fs layer
419640447d26: Pulling fs layer
61e52f862619: Pulling fs layer
error pulling image configuration: toomanyrequests: Too Many Requests. Please see https://docs.docker.com/docker-hub/download-rate-limit/

업데이트 —이 게시물 에서 Docker 팀은 소수의 "무거운 익명 사용자"가 인프라에 미치는 영향을 더욱 명확히했습니다. 이것은 다음 단락에서 내 고려 사항을 확인하는 것 같습니다.

문제 이해

이 프로젝트에서는 표준 Ubuntu 18.04 기본 이미지를 사용하여 애플리케이션을 빌드하고 있습니다. Docker Hub 인증에서 공개, 공식 참조 이미지를 가져 오지 않아도됩니다. 익명 사용자 로서 나는 파이프 라인에서 하나의 애플리케이션 을 빌드하기에 충분한 양보다 많은 6 시간 *마다 100 개의 풀을 부여 받아야합니다 .

내 애플리케이션의 파이프 라인은 AWS CodePipeline을 기반으로합니다. 다른 많은 타사 파이프 라인이 이러한 서비스를 기반으로 구축되며 동일한 호스트 및 IP 주소 풀을 공유합니다. 이로 인해이 CircleCI 스레드에 보고 된대로 소모가 제한되고 다른 많은 관리 CI / CD 서비스에 영향을 미칠 수 있습니다.

(*) 작성 당시 Docker Hub에서 익명 가져 오기에 대한 제한

솔루션 설계

이를 해결하는 간단한 방법은 파이프 라인에 개별 제한을 적용하는 것입니다. 이는 가져 오기 전에 Docker Hub에 로그인 하는 것을 의미 합니다. 무료 계정에 가입하는 것만 으로 6 시간 *에 200 개의 풀을 얻을 수 있습니다 . 또는 월 $ 5 *에 "무제한"풀을받을 수 있습니다.

(*) 작성 당시 사용 가능한 계획

계정을 사용하여 Docker Hub에 대한 요청을 인증 $ docker login하는 것은 빌드 스크립트에 명령을 추가하는 것만 큼 간단 합니다. 자격 증명을 보호 하는 것은 까다 롭지 만 절대적으로 필요한 부분입니다.

첫째, 자격 증명을해야 런타임에 적용 A로부터 안전한 저장 . 빌드 스크립트에 하드 코딩하지 마십시오. 이러한 스크립트는 일반적으로 저장소에 커밋됩니다. 사용중인 CI / CD 서비스에 따라 더 나은 옵션을 사용할 수 있습니다. 저는 AWS CodeBuild를 사용 하고 있으며 Parameter Store 또는 Secrets Manager 에서 런타임에 환경 변수를 설정할 수 있습니다 . Travis CI를 사용하면 환경 변수암호화 할 수 있습니다 . CircleCI 는 HashiCorp Vault사용 하여 환경 변수를 보호합니다. Jenkins기본적으로 자격 증명을 지원합니다 . 원하는 CI / CD 서비스 또는 자동화 도구의 문서를 검색하여 빌드시 자격 증명을 안전하게 삽입하는 가장 좋은 방법을 찾으십시오.

둘째, 명령 줄에서 --password플래그 와 함께 암호를 전달하는 것은 확실히 나쁜 생각 입니다. 출력에 표시되거나 어딘가에 기록 될 수 있습니다. 일부 CI / CD 서비스는 출력 및 로그에서 비밀을 필터링 할 수있을만큼 똑똑하지만 당연한 것으로 여기지 마십시오. $ docker login에서 비밀번호를 읽을 수 STDIN있지만 파이프 라인이 자동화되어 있으므로 직접 비밀번호를 입력 할 수 없습니다. 환경 변수를 통해 자격 증명을 전달하면 플래그를 사용하여 암호를 명령에 안전하게 파이프 할 수 있습니다 --password-stdin. DOCKERHUB_USERNAMEDOCKERHUB_PASSWORD환경 변수가 런타임에 설정 되었다고 가정하고 "pull"또는 다음 명령 앞에이 명령을 추가합니다 $ docker build.

echo $DOCKERHUB_PASSWORD | docker login --username $DOCKERHUB_USERNAME --password-stdin

위에 표시된 솔루션은 AWS CodeBuild에서 쉽게 구현할 수 있습니다. 이 연습에서는 Parameter Store 를 자격 증명의 원본으로 사용합니다. Secrets Manager를 사용하는 것은 거의 동일합니다. 하지만 Parameter Store에는 넉넉한 프리 티어가 있으며 KMS 를 통한 암호화도 지원합니다 .

  • 로 이동 도커 허브가입 계정이없는 경우 새 계정을.
  • AWS KMS로 이동하여 새 키를 생성합니다. 이미있는 경우 기존 키를 사용할 수 있습니다. 계정의 모든 항목에 동일한 키를 사용하지 마세요. ;)
    아래 스크린 샷과 같이 대칭 KMS 키를 만들고 3 단계와 4 단계에서 사용자 계정을 선택 하지 마십시오 .
KMS 자료에서 "대칭"키 생성
키 이름 지정
5 단계에서 생성 된 정책이 다음과 같이 표시됩니다.
Systems Manager Parameter Store로 이동 하여 Docker 사용자 이름과 암호에 각각 하나씩 2 개의 새 파라미터를 생성합니다. 이름에 경로를 사용하고 다음과 같은 적절한 이름 지정 규칙을 선택하십시오 /{APPLICATION_NAME}/{ENVIRONMENT}/{PARAMETER_NAME}
. 표준 계층 은 자격 증명으로 충분해야하지만 암호화되도록 아래 표시된대로 SecureString 유형 을 선택해야합니다 . 또한 값을 암호화 할 KMS 키 를 선택하고이 작업에 대해 생성 한 KMS를 선택해야합니다.
Docker 사용자 이름 및 비밀번호 매개 변수에 대한 옵션을 설정하는 방법
CodeBuild 프로젝트를 편집 하고 환경 패널로 이동하여 사용자 이름과 암호에 대한 2 개의 새 환경 변수를 추가합니다. "매개 변수"유형 이 선택 되었는지 확인 하고 매개 변수 저장소에 입력 한대로 필드를 매개 변수의 경로 / 이름 으로 설정합니다. 또한 서비스 역할 이름을 기록해 두십시오 . 나중에 IAM에서 편집해야합니다.
Parameter Store의 값을 사용하여 CodeBuild에서 환경 변수를 설정하는 방법
IAM / Roles로 이동 하여 CodeBuild 프로젝트에 연결된 서비스 역할을 검색 하고 편집합니다. CodeBuild 에는 Parameter Store 의 사용자 이름 및 암호 파라미터대한 읽기 액세스 권한과 암호 해독을위한 KMS 키 사용 권한부여 되어야합니다 . 연결된 정책을 편집하거나 새 정책을 연결 한 후 다음 문을 추가합니다.

{
    "Action": [
        "ssm:GetParameter",
        "ssm:GetParameters"
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:ssm:{AWS_REGION}:
    {YOUR_AWS_ACCOUNT_ID}:parameter/my-application/dockerhub/*"
},
{
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Effect": "Allow",
    "Resource": [
        "{YOUR_KMS_KEY_ID_HERE}"
    ]
},
buildspec.yml다음과 같이 애플리케이션 코드에서 파일을 편집하십시오 .

phases:
  pre_build:
    commands:
      - echo Logging in to Docker Hub...
      - echo $DOCKERHUB_PASSWORD | docker login --username $DOCKERHUB_USERNAME --password-stdin
# put the rest of your build commands after the "docker login" line
업데이트를 커밋 buildspec.yml하고 CodeBuild에서 새 빌드 작업을 시작합니다. Docker Hub에 대한 로그인이 성공했는지 확인하려면 콘솔에서 로그를 조정하십시오.

추가 읽기

위의 자습서는 Docker Hub에 대한 요청을 인증하여 레지스트리에서 공식 이미지를 가져오고이를 사용하여 CodeBuild에서 고유 한 Docker 이미지를 빌드하는 방법을 보여줍니다. 이러한 빌드 프로세스는 런타임 환경이라고하는 Docker 컨테이너 자체 내에서 실행됩니다. CodeBuild에서 자체 프라이빗 기본 이미지를 런타임 환경으로 사용 하려면이 공식 AWS 자습서를 따르십시오 .

CodeBuild로 Docker 이미지를 빌드 하는 방법 에 대한 공식 AWS 자습서 도 유용한 통찰력을 제공합니다.

Suggested posts

MySQL 8 성능 벤치 마크

MySQL 8 성능 벤치 마크

이 기사에서는 MySQL 8 기본 구성과 innodb_dedicated_server 지원 구성과

Kafka Cruise Control의 시각화

CCFE (Cruise Control Front End) 오픈 소스 프로젝트에 대한 우리의 기여

Kafka Cruise Control의 시각화

컨텍스트 Kafka는 Teads에서 선택한 메시지 스트리밍 플랫폼입니다. 다른 지역에 여러 Kafka 클러스터가 있습니다.

Related posts

백엔드 개발을 배우기위한 10 가지 최고의 튜토리얼

프로그래밍은 당신이 아는 것에 관한 것이 아닙니다. 그것은 당신이 알아낼 수있는 것에 관한 것입니다.

백엔드 개발을 배우기위한 10 가지 최고의 튜토리얼

"더 나은 오류 메시지를 작성하지 말고 필요하지 않은 코드를 작성하십시오." — Jason McDonald Backend Development — 대부분 웹, 소프트웨어 또는 앱에서 모든 것이 작동하는 방식에 관한 것입니다. 대부분은 애플리케이션 작동 방식의 중추입니다.

엔트리 레벨 소프트웨어 엔지니어로서 배운 5 가지

엔트리 레벨 소프트웨어 엔지니어로서 배운 5 가지

코딩과 기술력뿐만 아니라 3 년 전, 저는 사물이 어떻게 생겼을 지에 대한 수많은 가정과 기대를 가지고 기업 세계에 처음 발을 들여 놓았습니다. 내가 얼마나 잘못이 증명 될지 거의 알지 못했습니다.

소프트웨어 개발에서“단순한 것”이 빠르게 복잡 해지는 방법

소프트웨어 개발에서“단순한 것”이 빠르게 복잡 해지는 방법

"자동화되기를 바라는이 사소한 것이 있습니다."— 사소한 일이 아닐 것임을 알고 이것을 얼마나 자주 듣지 못했습니까? 아니면 당신이 더 잘 알면서도 직접 말 했나요? 왜 단순한 것들은 소프트웨어 개발에서 결코 단순하지 않고, 여기저기서 몇 가지 작은 것들이 빠진 것과 당신이 만들어야했던 몇 가지 지름길을 아는 것에 대한 좌절없이 우리가 기능을 "적절하게"구현하는 것을 방해하지 않는가? 프로젝트의 다음 기한을 잡을 수있을만큼 모든 것이 제대로 작동하도록하려면? Europe Elects의 다른 사람들과 함께 여러 유럽 국가의 여론 조사에서 주요 데이터를 수집하는 약간의 취미 프로젝트가 있습니다. 이 프로젝트에서는 모든 정보를 수집 할 수있는 인프라를 설정해야합니다.

해독 : 얻을 수없는 테스트 안정성 (아니면?)

해독 : 얻을 수없는 테스트 안정성 (아니면?)

Detox는 모바일 앱용 그레이 박스 테스트 솔루션으로, 테스트 코드와 앱 간의 동기화를 관리하므로 사용자가 수동으로 수행 할 필요가 없습니다. 사용자의 필요와 풍부한 문서 및 가이드가 없어도 개발자와 테스터는 여전히 사용 패턴, 잘못된 구성, 열악한 테스트 안정성으로 어려움을 겪을 수 있습니다.