게시:
수정:

Docker loves AWS

AWS ECR은 도커 허브와 같은 컨테이너 이미지 레지스트리 서비스다. AWS IAM 계정을 사용하여 프라이빗(Private) 리포지토리를 사용할 수 있고 AWS CLI를 이용하여 도커 이미지를 리포지토리에 푸시(Push), 풀(Pull), 삭제할 수 있다.

ECR을 사용하면 AWS EC2 및 ECS에서 컨테이너 리포지토리 및 도커 이미지에 액세스할 수 있으며 도커 이미지 스캔을 지원하기 때문에 사용에 따른 이점이 많다.

이 포스팅에서는 푸시할 도커 이미지가 이미 존재하고 최신 버전의 도커(1.7버전 이상)가 설치되어 있다고 가정한다.

사전 조건

아래의 사전 조건들이 이미 충족된 경우에는 1단계: 기본 레지스트리에 대해 인증으로 건너뛴다.

IAM 계정 생성

ECR 등의 AWS 서비스에 액세스할 때 필요한 자격 증명을 위하여 IAM 계정이 필요하다. 본인이 권한 관리자라면 AWS 콘솔 로그인하면 우측 상단에 보이는 자신의 계정을 클릭하면 나오는 메뉴 중 ‘보안 자격 증명’에서 만들 수 있다. 자격 증명을 만들 때 리포지토리를 푸시할 수 있는 액세스 권한이 있도록 한다.

IAM 계정을 만들고나면 AWS account ID(AWS Access Key ID)와 Secret(AWS Access Secret Key)을 받을 수 있는데 딱 한 번만 제공하므로 어딘가에 잘 보관해야 한다.

AWS CLI 설치

AWS CLI는 curl과 Homebrew로 설치할 수 있다. (다른 방법도 있다.) 경로별로 아래의 명령어를 통하여 설치를 진행하되 보다 자세한 설치 지침은 외부 링크에서 확인하도록 한다.

방법1: curl을 이용하여 설치

$ curl “https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip” -o “awscliv2.zip”
$ sudo apt -y install unzip
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws configure

방법2: Homebrew를 이용해 설치

$ brew install awscli
$ aws configure

EC2 보안 그룹 생성

EC2 콘솔에서 보안 그룹을 생성해야 한다. 생성된 보안 그룹에는 인바운드 규칙만 하나 추가하는데 SSH 유형으로 만들되 0.0.0.0/0으로 열지말고 특정 IP만 접근이 가능하도록 구성하는 것이 안전하다. SSH를 허용할 IP(공인 IP) 뒤에는 /32를 붙여준다.

1단계: AWS 컨텍스트 생성

docker context create ecs {ECS Context Name} 명령으로 ECS 도커 컨텍스트를 생성한다. 명령 입력 후 나오는 인증 방법 선택 프롬프트에서는 IAM 계정 사용을 위해 AWS secret and token credentials를 선택한다.

AWS Access Key ID, AWS Secret Access Key와 리전를 묻는 프롬프트가 출력되면 차례대로 입력해준다.

$ docker context create ecs myecscontext
? Create a Docker context user: AWS secret and token credentials
Retrieve or create AWS Access Key and Secret on https://console.aws.amazon.com/iam/home?#security_credential
? AWS Access Key ID AKIA6K**************
? Enter AWS Secret Access Key ****************************************
? Region ap-northeast-2
Successfully created ecs context "myecscontext"

AWS 컨텍스트를 생성하면 docker context ls 명령으로 도커 컨텍스트 목록을 나열할 수 있다.

$ docker context ls
NAME            TYPE      DESCRIPTION                                   DOCKER ENDPOINT
default *       moby      Current DOCKER_HOST based configuration       unix:///var/run/docker.sock
myecscontext    ecs       (ap-northeast-2)

2단계: 기본 레지스트리에 대해 인증

다음으로 AWS ECR 기본 레지스트리에 대하여 도커 CLI를 인증한다. aws ecr get-login-password --region {Region Name} 명령을 입력하면 Credential이 반환되는데 이걸 Pipe에 넘겨주면 된다.

⚠️ 주의
오류가 발생하거나 get-login-password 명령을 사용할 수 없는 경우 최신 버전의 AWS CLI를 설치해야 할 수도 있다. AWS CLI를 최신 버전으로 업그레이드 하는 방법은 외부 링크를 참고한다.

$ aws ecr get-login-password \
      --region {Region Code} \
  | docker login
      --username AWS \
      --password-stdin {AWS account ID}.dkr.ecr.{Region Code}.amazonaws.com
Login Succeeded

3단계: ECR 리포지토리 생성

AWS ECR에 이미지를 푸시할 리포지토리가 있어야 한다. 만약 리포지토리가 없는 경우 AWS ECR에서 리포지토리를 만들거나 AWS CLI를 통한 명령으로 리포지토리를 생성한다.

$ aws ecr create-repository \
      --repository-name <Repository Name>
      --image-scanning-configuration scanOnPush=<true or false>
      --region <Region Code>
https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password

4단계: ECR에 이미지 푸시·풀·삭제하기

ECR로 이미지 푸시하기

ECR에 이미지를 푸시하려면 먼저 리포지토리에 푸시할 이미지에 태그를 지정해야 한다. 아래 명령에서 REPOSITORY는 이미지 보관소가 아닌 docker images 명령을 입력했을 때 출력되는 필드명을 의미한다.

$ docker tag {REPOSITORY}:{TAG} {AWS account ID}.dkr.ecr.{Region Code}.amazonaws.com/{REPOSITORY}:{TAG}

이미지를 푸시한다.

$ docker push {AWS account ID}.dkr.ecr.{Region Code}.amazonaws.com/{REPOSITORY}:{TAG}

🗣 참고
이미지 푸시에 실패하는 가장 흔한 이유는 ECR 도커 로그인이 되어 있지 않은 경우이다. 그 외 푸시를 시도하는 IAM 계정에 ECR 푸시관련 정책 권한이 없으면 이미지가 푸시되지 않고 Retrying을 시도하다가 종료된다.

# Push failed

$ docker push 012345678901.dkr.ecr.ap-northeast-2.amazonaws.com/backend:0.1.0
The push refers to repository [012345678901.dkr.ecr.ap-northeast-2.amazonaws.com/backend]
c91d1306e6af: Retrying in 1 second
26e4a0f8bfdc: Retrying in 1 second
007a4ba90d98: Retrying in 1 second
69a0bbf2a7a6: Retrying in 1 second
75cc7e96c9eb: Retrying in 1 second
07424576deb8: Waiting
56d4e3495fd7: Waiting
5b7440eabd3e: Waiting
13b045a1dfd2: Waiting
2fbabeba902e: Waiting
ee509ed6e976: Waiting
9177197c67d0: Waiting
7dbadf2b9bd8: Waiting
e7597c345c2e: Waiting
EOF

ECR에서 이미지 가져오기

도커 명령으로 이미지를 가져온다.

$ docker pull {AWS account ID}.dkr.ecr.{Region Code}.amazonaws.com/{REPOSITORY}:{TAG}

리포지토리에 있는 이미지 삭제하기

batch-delete-image 명령을 사용하여 리포지토리에 있는 이미지를 삭제할 수 있다. 이미지를 삭제하려면 이미지가 있는 리포지토리 및 이미지의 imageTag 또는 imageDigest값(SHA 256 해싱값)을 지정해야 한다.

$ aws ecr batch-delete-image \
      --repository-name {REPOSITORY} \
      --image-ids imageTag={TAG} \
      --region {Region Code}

5단계: 리포지토리 삭제

기본적으로 이미지가 들어 있는 리포지토리는 삭제할 수 없다. 그러나 --force 플래그를 사용하면 삭제가 가능하다. 다음은 이미지가 들어 있는 리포지토리를 삭제하는 명령이다.

$ aws ecr delete-repository \
      --repository-name {Repository Name} \
      --force \
      --region {Region Code}

Reference

https://docs.docker.com/cloud/ecs-integration/
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password
https://stackoverflow.com/questions/70828205/pushing-an-image-to-ecr-getting-retrying-in-seconds

댓글남기기