ECR이란?

ECR (Elastic Container Registry) 은 Docker Container의 이미지를 저장하는 Repository 서비스입니다.

주로 사용하는 Docker hub의 기능과 동일하다고 보면되고 Private 하게 이미지를 관리하는데 편리합니다.

 

Container 이미지를 S3에 저장하기 때문에 고가용성이 유지되고 AWS IAM 인증을 통해 이미지를 push/pull 할 수 있습니다.

 

리포지토리 생성

 

ECR Repositories 탭에서 프라이빗 리포지토리를 생성합니다.

ECR 〉 리포지토리 〉 리포지토리 생성 
리포지토리 생성 
일반 설정 
표시 여부 설정 Info 
리포지토리에 대한 가시성 설정을 선택합니다. 
프라이빗 
액세스는 IAM 및- 리포지토리 정책 권한에 의해 관리될니다. 
(0 퍼블릭 
이미지 풀에 대해 공개적으로 표시되고 액세스할 수 있습니다. 
리포지토리 이름 
간결한 이름을 제공합니다. 개발자는 이름으로 리포지토리 콘텐즈를 식 별할 수 있어야 합니다. 
-』:`&1 v••.dkr.ecr.ap-northeast- 
2.amazonaws.com/ 
최 대 256자 증 7자(최소 2자 이상) The name must start with letter and can 이1[y contain lowercase letters, numbers, hyphens, underscores, 
and forward slashes. 
태그 변경 불가능 Info 
동일한 태그를 사용하는 후속 이미지 푸시가 이미지 Eh그를 덮어쓰지 않도록 방지하려면 [다그 변경 불가능]을 활성화합니다. 이미지 리그를 덮 
어쓰려면 [리그 변경 불가능〕을 비활•넝화합니다. 
비활성화됨 
0 리포지토리가 생성되면 해당 리포지토리의 가시성 설정을 변경할수 없습니다.

 

 

AWS CLI 

 

awscli는 IAM Credentials 혹은 IAM 역할을 이용하여 사용 가능합니다.

Amazon Linux 2 OS에는 기본적으로 설치가 되어 있으므로 다른 OS를 사용하실 경우는 아래를 참고하여 설치[1] 하시기 바랍니다.

 

Jenkins 서버에서 aws configure 커맨드로 IAM access key와 secret key를 설정합니다.

혹은 .aws/credentials 경로에 IAM Credentials를 아래의 형태로 넣어주시면 됩니다.

 

[default]

aws_access_key_id = [ACCESSKEYID]

aws_secret_access_key = [SECRETACCESSKEY]

 

주의할 점은 Jenkins계정으로 로그인 하셔야 합니다. Jenkins 홈 디렉토리에 AccessKey를 설정해 AWS 커맨드를 사용할 수 있게합니다.

 

 

[1] https://aws.amazon.com/ko/cli/

 

Docker 설치

 

Jenkins 서버에 docker 설치를 진행합니다. 이때 jenkins 계정에 docker 권한을 부여해야 하는데요

그 이유는 Jenkins 파이프라인이 돌아갈 때 프로세스가 돌면서 Docker 권한을 사용하기 때문입니다. 

 

$ sudo amazon-linux-extras install -y docker

$ sudo systemctl start docker

$ sudo systemctl enable docker

 

$ sudo /usr/sbin/groupadd -f docker
$ sudo /usr/sbin/usermod -aG docker jenkins
$ sudo chown root:docker /var/run/docker.sock

 

이제 jenkins 계정에 접속해서 docker가 실행되는 지 확인해봅니다.

이전 Jenkins 설치 스크립트의 내용을 보면 Jenkins 패스워드가 포함되어 있습니다. (Jenkins1!) 보안을 위해 수정 해 주세요!

 

$ docker ps

CONTAINER ID   IMAGE     COMMAND    CREATED   STATUS    PORTS      NAMES

 

레지스트리 인증

 

Docker CLI는 기본 IAM 인증 방법을 지원하지 않아 ECR이 Docker 푸시 및 풀 요청을 인증하고 승인할 수 있도록 추가 단계를 수행 해야합니다. 

아래는 권한 부여 토큰을 이용한 인증 방법인데요. 사용된 토큰은 IAM 기반으로 권한 범위가 일치하고 12시간 동안 ECR 레지스트리에 액세스하는 데 사용됩니다.

 

명령어는 아래와 같습니다. 계정 ID와 Region을 변경하여 입력하세요.


$ aws ecr get-login-password --region region | docker login --username AWS --password-stdin [계정ID].dkr.ecr.[Region].amazonaws.com

 

AWS CLI 버전 1.17.10 이전 버전[2]

 

$ aws ecr get-login --region region --no-include-email

docker login -u AWS -p password https://aws_account_id.dkr.ecr.region.amazonaws.com

 

[2] https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/registry_auth.html

 

ECR Push 명령어 사용

 

이제 ECR을 사용에 필요한 모든 준비는 끝이 났습니다.

 

Jenkins 서버에서 jenkins 계정으로 테스트 하기위한 nginx 이미지를 pull 합니다.

 

$ docker pull nginx:latest

 

latest: Pulling from library/nginx

69692152171a: Pull complete

30afc0b18f67: Pull complete

596b1d696923: Pull complete

febe5bd23e98: Pull complete

8283eee92e2f: Pull complete

351ad75a6cfa: Pull complete

Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750

Status: Downloaded newer image for nginx:latest

docker.io/library/nginx:latest

 

$ docker images

 

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE

nginx        latest    d1a364dc548d   3 weeks ago    133MB

 

레지스트리 인증을 진행합니다.


$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin [계정ID].dkr.ecr.ap-northeast-2.amazonaws.com

 

WARNING! Your password will be stored unencrypted in /home/jenkins/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

 

Login Succeeded

 

로그인 성공 구문을 보면 레포지토리URI:Version 형식으로 tag를 달아 레포지토리에 push 할 수 있습니다.


$ docker tag nginx:latest [포지토리URI]:[Version]

$ docker push [포지토리URI]:[Version]

The push refers to repository [**********.dkr.ecr.ap-northeast-2.amazonaws.com/****]

075508cf8f04: Pushed

5c865c78bc96: Pushed

134e19b2fac5: Pushed

83634f76e732: Pushed

766fe2c3fc08: Pushed

02c055ef67f5: Pushed

latest: digest: sha256:61191087790c31e43eb37caa10de1135b002f10c09fdda7fa8a5989db74033aa size: 1570

 

 

이렇게 Jenkins 서버와 ECR 연동하는 법을 알아봤습니다.

다음에는 Jenkins 파이프라인 설정으로 앞서 배웠던 CodeCommit과 ECR 연동하는 방법을 알아 보겠습니다.

 

감사합니다