프라이빗 리포지토리에서 도커 이미지를 가져와서 Elastic Beanstalk 도커 플랫폼에서 사용하려면 어떻게 해야 하나요?

3분 분량
0

프라이빗 리포지토리에서 도커 이미지를 가져와서 Elastic Beanstalk 플랫폼에서 사용하고 싶습니다.

간략한 설명

프라이빗 리포지토리에서 이미지를 가져올 때 Elastic Beanstalk 인스턴스에서 다음의 오류가 발생할 수 있습니다.

/var/log/ecs/ecs-agent.log[CannotPullContainerError]의 오류 메시지 대몬(daemon)의 오류 응답: pull access denied for {username}/{repo}, repository does not exist or may require 'docker login': denied: requested access to the resource is denied" module=docker_client.go

이 오류는 프라이빗 레지스트리와 Elastic Beanstalk 사이의 인증에 차이가 있을 때 발생합니다. 프라이빗 리포지토리의 이미지를 사용하려면 Elastic Beanstalk는 프라이빗 리포지토리를 호스팅하는 온라인 레지스트리로 인증해야 합니다. 프라이빗 리포지토리에서 이미지를 검색하고 배포하기 전에 인증을 받아야 합니다. 프라이빗 리포지토리로 인증하기 위해 Elastic Beanstalk 환경에 대한 보안 인증 정보를 검색하고 저장하는 두 가지 옵션이 있습니다.

  • AWS Systems Manager(SSM) 파라미터 스토어
  • Dockerrun.aws.json 파일

해결 방법

Dockerrun.aws.json 파일을 사용하여 프라이빗 리포지토리에서 도커 이미지를 검색하려면 다음의 단계를 따르세요.

  1. 유효한 인증 토큰 생성
  2. Amazon Simple Storage Service(S3) 버킷 생성 및 인증 파일 저장
  3. Dockerrun.aws.json v2 파일 생성

유효한 인증 토큰 생성

**참고:**AWS Command Line Interface(AWS CLI) 명령을 실행 시 오류가 발생하면 AWS CLI 최신 버전을 실행 중인지 확인하세요.

  1. 다음의 명령을 실행하여 컴퓨터에 도커를 설치합니다.

    $ brew install docker
  2. dockerhub에서 계정을 생성합니다.

  3. 리포지토리를 생성하고 이미지를 리포지토리로 전송합니다.

  4. Docker 로그인 명령을 실행합니다.

    $ Docker login
  5. 다음의 명령을 사용하여 credentials.env라는 이름의 파일을 생성합니다.

    $ vi credentials.env
  6. 생성한 이전 파일에 다음의 보안 인증 정보를 추가합니다.

    **참고:**모든 예시 문자열을 지정된 값으로 바꾼 다음 파일을 저장하고 편집기 모드를 종료해야 합니다.

    DOCKER_USERNAME=example-user-name
    DOCKER_PASSWORD=example-password
    DOCKER_REGISTRY=https://index.docker.io/v1/
  7. 다음 명령을 실행합니다.

    docker run -it --rm \
    -env-file=credentials.env \
    v "$(pwd):/opt/data/" \
    v "/var/run/docker.sock:/var/run/docker.sock" \
    codeship/dockercfg-generator /opt/data/dockercfg
  8. .dockercfg 파일을 검색합니다.

    $ cat  /opt/data/dockercfg

    출력 예시:

    {
    "https://index.docker.io/v1/ ": {
    "auth": '**************************AMTE="     
    },
    "HttpHeaders": {
    "User-Agent": "Docker-Client/18.03.1-ce (linux)"
    }
    }

    참고: 애플리케이션 소스 번들에 있는 .dockercfg 파일을 포함해야 합니다.

Amazon S3 버킷 생성 및 인증 파일 저장

안전한 Amazon S3 버킷을 생성하고 .dockercfg 파일을 버킷에 전송합니다. 다음 사항을 확인하십시오.

  • Amazon S3 버킷은 해당 버킷을 사용하는 환경과 동일한 AWS 리전에서 호스팅됩니다. Elastic Beanstalk는 다른 리전에서 호스팅된 Amazon S3 버킷에서 파일을 다운로드할 수 없습니다.
  • s****3:GetObject 작업에 대한 권한은 인스턴스 프로파일의 AWS Identity and Access Management(AWS IAM) 역할에 부여됩니다.

Dockerrun.aws.json v2 파일 생성

다음 명령을 실행하여 Dockerrun.aws.json v2 파일을 생성하고 인증 파라미터 아래에 Amazon S3 버킷 정보를 추가합니다.

  • 버킷 파라미터에 대해서는 Amazon S3 버킷 정보를 추가합니다.
  • 이미지 파라미터에 대해서는 태그와 함께 이미지 이름을 추가합니다. 이는 dockerhub 계정에서 검색할 수 있습니다.
{
"AWSEBDockerrunVersion": 2,  
"authentication": {    
"bucket": "example-bucket-name",    
"key": ".dockercfg"  
},  
"volumes": [    
{      
"name": "php-app",      
"host": {        
"sourcePath": "/var/app/current/php-app"      
}    
},    
{      
"name": "nginx-proxy-conf",      
"host": {        
"sourcePath": "/var/app/current/proxy/conf.d"      
}    
}  
],  
"containerDefinitions": [    
{      
"name": "php-app",      
"image": "example-image-name",      
"essential": true,      
"memory": 128,      
"mountPoints": [        
{          
"sourceVolume": "php-app",          
"containerPath": "/var/www/html",          
"readOnly": true        
},        
{          
"sourceVolume": "awseb-logs-php-app",          
"containerPath": "/var/log/sample-app"        
}      
]    
},    
{      
"name": "nginx-proxy",      
"image": "nginx",      
"essential": true,      
"memory": 128,      
"portMappings": [        
{          
"hostPort": 80,          
"containerPort": 80        
}      
],      
"links": [        
"php-app"      
],      
"mountPoints": [        
{          
"sourceVolume":"php-app",          
"containerPath": "/var/www/html",          
"readOnly": true        
},        
{          
"sourceVolume": "awseb-logs-nginx-proxy",          
"containerPath": "/var/log/nginx"        
},        
{          
"sourceVolume": "nginx-proxy-conf",          
"containerPath": "/etc/nginx/conf.d",          
"readOnly": true        
}      
]    
}  
]
}

참고: 위 명령을 사용하면 Elastic Beanstalk 인스턴스를 온라인 레지스트리로 성공적으로 인증할 수 있습니다.

관련 정보

프라이빗 리포지토리 이미지 사용

AWS Elastic Beanstalk에서 프라이빗 도커 이미지에 액세스

AWS 공식
AWS 공식업데이트됨 일 년 전