개요

  • 도커 이미지를 ECR에 푸시하고 접근하는 방법을 정리한다.
  • 쿠버네티스에서의 ECR 사용방법도 정리한다.

ECR에 이미지 푸시하기

전제조건

aws-cli와 Docker가 설치되어 있어야 한다.

$ aws --version
aws-cli/2.3.0 Python/3.8.8 Windows/10 exe/AMD64 prompt/off

$ docker --version
Docker version 20.10.23, build 7155243

AWS Web 콘솔에서 ECR 리포지토리 생성

딱히 정리하지 않아도 화면을 보면 간단하게 할 수 있다. 이미지를 생성하고 나면 화면 우측 상단에 View push commands 버튼이 보인다. 이 버튼을 클릭하면 어떤 명령어를 실행하면 푸시할 수 있는지 보여준다. 매우 편리하다!

대략적인 흐름은 다음과 같다.

  1. 인증 토큰을 취득하고 ECR 리포지터리에 대해 Docker 클라이언트를 인증한다 (aws ecr 명령)
  2. 도커 이미지를 빌드 (docker build 명령)
  3. 이미지에 태그를 지정 (docker tag 명령)
  4. 이미지를 새로 생성한 ECR 리포지터리로 푸시 (docker push 명령)

ECR로부터 이미지 pull하기

로그인

  • 먼저 ecr에 로그인이 필요하다.
  • AWS_ACCOUNT, AWS_REGION을 적절히 변경한다.
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com

이미지 pull

docker pull ${ECR_URI}

쿠버네티스에서 ECR 사용하기

  • Docker Desktop등 로컬환경의 클러스터에서 ECR 리포지터리를 사용하는 방법이다.
  • EKS의 경우에는 IAM으로 접근제한을 설정할 수 있으므로 쿠버네티스 매니페스트 파일에 imagePullSecrets를 설정하는 과정등은 필요없을 것이다.

매니페스트 파일에서 도커 컨테이너 URI변경

쿠버네티스 매니페스트 파일(yaml파일)의 image 키의 값을 ECR 리포지터리의 URI로 설정하면 된다. URI는 AWS 웹 콘솔의 ECR 서비스에서 해당 이미지를 선택한 후 COPY URI버튼을 누르면 복사할 수 있다. 아래의 ECR-IMAGE-URI 부분을 이 URI로 변경한다.

spec:
  containers:
  - name: my-container
    image: {ECR-IMAGE-URI}

ECR용 시크릿 생성

다음 명령으로 ECR용 시크릿을 생성한다.

kubectl create secret docker-registry ecr-secret --docker-server=${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com --docker-username=AWS --docker-password=$(aws ecr get-login-password --region=${AWS_REGION}) 
  • AWS_ACCOUNT, AWS_REGION을 적절히 변경한다.
  • docker-password는 윈도우즈 커맨드에서 실행할 경우 확장이 안되므로 두 단계로 나눠서 실행한다.
  • aws ecr get-login-password 로 생성한 패스워드는 유효기간이 있다. 12시간이다. 따라서 하루에 한번정도씩은 새롭게 시크릿을 만들어야 한다.
  • aws ecr get-login-password 실행시 리전설정이 중요하다. ECR 리전과 리전이 다르면 다음과 같이 토큰이 유효하지 않다는 메세지가 출력된다.
repository does not exist or may require 'docker login': denied: Your Authorization Token is invalid.

매니페스트 파일에서 imagePullSecrets 변경

imagePullSecrets의 name값을 위에서 생성한 ECR용 시크릿으로 지정한다.

imagePullSecrets:
- name: ecr-secret

참고 링크

  • https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/docker-push-ecr-image.html
  • https://sotoiwa.hatenablog.com/entry/2021/01/02/024715
  • https://skryvets.com/blog/2021/03/15/kubernetes-pull-image-from-private-ecr-registry/