[AWS 입문 시리즈] Amazon ECR편

Classmethod Korea Co., Ltd.
Classmethod Korea Co., Ltd.
10 min readJun 9, 2022

이 블로그는 클래스메소드코리아의 일본본사Classmethod, Inc.의 DevelopersIO 블로그에 게시된 글입니다. 작성자의 동의를 받고 게시합니다.

작성일 이후로 업데이트 및 변경사항이 있을수 있습니다.

원문 사이트 : https://dev.classmethod.jp/articles/re-introduction-2022-ecr/

원문 작성일 : 2022.03.23

원문 작성자 : Tokuyama Shun

이 블로그 릴레이의 기획은 평소 AWS 서비스에 대해 최신 소재, 깊은/세세한 주제를 주로 써 온 멤버들의 손에 의해 다시 초심으로 돌아가 기본적인 부분을 다시 살펴보고 해설해 보자는 컨셉이 담겨 있습니다.

AWS를 앞으로 배워보자! 라고 하는 분에게는 글자 그대로의 입문게시글로, 또 이미 AWS를 활용하시는 분에게도 AWS 서비스의 재발견과 2022년 서비스 업데이트의 캐치업의 장이 되었으면 하는 바람입니다.​

그럼 시작해 볼까요? 이번 주제는 Amazon ECR 입니다.

Amazon ECR이란?

Amazon Elastic Container Registry(ECR)는 풀 매니지드의 Docker 컨테이너 레지스토리 서비스입니다.

자신이 작성하거나 AWS Marketplace에서 구입한 Docker컨테이너 이미지의 저장・관리・디플로이가 가능합니다.

컨테이너 레지스토리에는 자신이 구축하는 Docker Registry나 Docker사가 공식으로 제공하는 SaaS인 Docker Hub등의 서비스가 있습니다.

그 중에서 ECR은 아래와 같은 특징을 갖습니다.

● 인프라 운용 불필요

○ 매니지드 서비스이기 때문에 운용이나 스케일링이 필요없음

● 높은 내구성/가용성

○ 스토리지로 Amazon S3를 이용

● AWS 서비스와의 통합

○ IAM유저나 IAM롤을 사용한 폴리시로 각 리포지토리에의 액세스 허가 설정이 가능

○ Amazon ECS, Amazon EKS, AWS Lambda등과 통합이 되어 워크플로우의 간략화가 가능

○ Code Build나 Code Deproy와도 은밀하게 연계하여 CI/CD파이프라인 구축에도 이용이 가능

AWS의 다른 서비스와 연계하려면 컨테이너 레지스토리에 ECR을 쓰는 것을 추천합니다.

ECR이 가진 기능

ECR은 Registory와 Repository로 구성됩니다.

1리전에 대해 1개의 Public Registory와 1개의 Private Registory를 가질 수 있습니다.

Registory 중에는Repository를 1개 이상 만들 수 있고 컨테이너 이미지는Repository안에 저장합니다.

Registory의 기능

Registory는 크게 2가지 종류가 있습니다.

Public Registory

저장한 컨테이너 이미지를 AWS외의 전 세계에 공개 가능

○ 컨테이너 이미지는 자동적으로 AWS의 각 리전에도 전개되어 pull시간 단축과 가용성 향상을 도모할 수 있다

공개된 컨테이너 이미지는ECR Public Gallery에서 pull가능

○ 2021년11월에는 Docker공식 이미지도 공개되어 Docker사의 Docker Hub 대신으로 이용이 가능

URL은 public.ecr.aws/에이리어스/란 형식

○ 에이리어스는 초기 작성 시는 디폴트 에이리어스란 랜덤값을 할당

○ 커스텀 에이리어스를 신청해서 승인되면 임의 이름을 설정하는 것도 가능

Private Registory

저장한 컨테이너 이미지를 개인적인 범위로 공개 가능

○ 자사 애플리케이션 운용에서는 기본적으로 이쪽을 선택

URL은 계정ID.dkr.ecr.리전.amazonaws.com라는 형식

○ AWS계정 및 리전마다 유니크한URL

풀 스루캐시

○ Public Registory의 Repository를 Private Registory에 캐시하는 것이 가능

○ ECR의 인터페이스 VPC엔드포인트를 쓰는 것으로 Private Subnet에서 Public Registory의 갱신 내용에 액세스 가능

○ 동기는 24시간에 1번이라 실시간은 아님

레플리케이션

1. 크로스 리전 레플리케이션

○ 다른 리전을 선택해서 레플리케이션

2. 크로스 어카운트 레플리케이션

○ 송신처 계정과 리전을 선택하여 레플리케이션

○ 송신처 계정에는 액세스 허가를 위한 Registory폴리시 설정이 필요

허가

○ 풀 스루 캐시 기능과 레플리케이션 기능의 허가를 AWS 프린시펄에 부여

○ Registory폴리시를 사용해서 허가를 기술

스캔

1.기본 스캔

○ CVE데이터베이스를사용하서 푸시 시 취약성 스캔이 가능

2.확장 스캔

○ Amazon Inspector v2와 통합되어 자동 계속적인 스캔이 가능

○ OS와 프로그래밍 언어 패키지의 양쪽의 취약성에 대해 스캔

Repository기능

Repository도 크게 2가지 종류가 있습니다

Public Repository

Public Repository에서는 Repository명을 설정합니다.

옵션으로 로고나 콘텐츠 타입, Repository개요, 이미지의 사용 방법에 관한 정보를 제공하는 것도 가능합니다.

Private Repository

Private Repository에서는 아래 설정이 가능합니다.

태그의 변경 불가능

○ 유효화 하면 같은 태그를 사용한 후속 이미지 푸시에 의한 이미지 덮어쓰기를 방지

○ 모든 이미지의 태그를 유니크하는 것으로 latest태그의 운용을 Repository 레벨로 금지하기 등이 가능

암호화

○ KMS를 사용해서Repository에 저장되는 이미지를 암호화

○ 암호화 키는 디폴트로는 AWS소유의 키

○ 자신이 작성한 KMS키를 설정하는 것도 가능

Private Repository를 작성해서 push해보기

그럼 Private Repository를 작성해서 push해보겠습니다.

클라이언트머신환경

클라이언트머신은다음버전을사용합니다.

OS

○ macOS Big Sur Version 11.6.5

aws-cli

○ 2.4.16

Docker Desktop

○ 4.6.1

또 로컬에 ecr-test란 디렉토리를 작성해서 밑의 Dockerfile을 작성해 둡니다.

ecr-test/Dockerfile

FROM alpine:3.15.1 CMD [“echo”,”Hello World”]

Repository작성

매니지먼트 콘솔에서 Repository를 작성합니다. 이번은 아래 그림대로 설정해서 test란Repository를 작성합니다.

설정이되면 리포지토리 생성을 클릭합니다.

Repository에의 Docker 이미지 push

ECR에 test란 Repository가 작성되었습니다.

매니지먼트 콘솔에서 푸시 명령 보기를클릭 합니다.

그러면 Docker이미지를 test Repository에 push하기 위한 커맨드가 4개 나옵니다.

클라이언트의 터미널에서부터 ecr-test디렉토리로 이들의 4개 커맨드를 실행합니다.

xxxxxxx@xxxxxxx ecr-test % aws ecr get-login-password — region ap-northeast-1 | docker login — username AWS — password-stdin AWS어카운트 번호.dkr.ecr.ap-northeast-1.amazonaws.com Login Succeeded xxxxxxx@xxxxxxx ecr-test % docker build -t test . [+] Building 0.9s (5/5) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 87B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/alpine:3.15.1 0.9s => CACHED [1/1] FROM docker.io/library/alpine:3.15.1@sha256:d6d0a0eb4d40ef96f2310ead734848b9c819bb97c9d846385c4aca1767186cd4 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:8597e2c888b061820f07bcf32674ceaa26b5b510b8f8c004e7c623c27177beca 0.0s => => naming to docker.io/library/test 0.0s Use ‘docker scan’ to run Snyk tests against images to find vulnerabilities and learn how to fix them xxxxxxx@xxxxxxx ecr-test % docker tag test:latest AWS어카운트 번호.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest xxxxxxx@xxxxxxx ecr-test % docker push AWS어카운트 번호.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest The push refers to repository [AWS어카운트 번호.dkr.ecr.ap-northeast-1.amazonaws.com/test] 534ef0372885: Pushed latest: digest: sha256:5deb9e49c07e84ba35cd0523d03098fad9b2766bee8af6f9d7bf045afb4e1c8f size: 527

test Repository에 이미지가 push되었습니다.

Repository에 저장한 이미지는 ECS나 EKS에서 참조하는 것으로 실제의 컨테이너로 조작할 수 있습니다.

이번에는 태그에 latest를 붙었지만 본 운용의 경우에는 각 이미지를 유니크로 설정할 수 있는 태그를 설정하는 것을 추천합니다.

마지막으로

이상 Amazon ECR편이었습니다. 이번에 소개하지 못한 기능이나 항상 업데이트도 있으니 확인해보세요.

다음은 AWS Auto Scaling편 예정입니다. 기대해주세요!!

클래스메소드코리아에 문의사항이 있으신 분들은

​info@classmethod.kr 로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !

--

--