[AWS] ECR (Elastic Container Registry)

artp·2024년 11월 11일
0

aws

목록 보기
4/13
post-thumbnail

AWS ECR이란?

AWS ECR(Amazon Elastic Container Registry)은 컨테이너 이미지를 저장하고 관리하는 AWS 서비스입니다. 쉽게 말해, 이미지를 저장하고 공유하는 Docker Hub와 비슷한 역할을 합니다. AWS ECR을 사용하면 도커 이미지를 안전하게 저장하고 관리할 수 있으며, 이를 필요할 때 EC2, ECS 등 다양한 AWS 리소스와 연동해 실행할 수 있습니다.

Docker Hub와 AWS ECR의 차이점

  • Docker Hub: Docker 이미지를 전 세계적으로 공유하거나 다운로드하는 데 주로 사용됩니다. 퍼블릭 레지스트리로, 전 세계 개발자가 널리 사용하는 저장소입니다.
  • AWS ECR: Docker Hub와 비슷하지만, AWS 서비스와의 높은 연동성과 AWS 환경에서 통합 관리의 장점이 있습니다. ECR은 AWS의 IAM(Identity and Access Management)을 통해 접근 제어와 보안도 간편하게 설정할 수 있습니다.

AWS ECR을 왜 사용할까?

최근에는 AWS 클라우드 환경에서 인프라를 구축하는 일이 많아졌습니다. 이런 환경에서 AWS ECR을 사용하는 주된 이유는 다음과 같습니다:

  1. AWS 서비스와의 높은 호환성
    AWS ECR은 EC2, ECS, CodePipeline 등 AWS의 다른 서비스와 쉽게 연동됩니다.

  2. 관리의 편의성
    모든 리소스를 AWS 환경 내에서 관리하기 때문에, 운영의 복잡도가 줄어듭니다. Docker Hub와 같은 외부 서비스 없이 AWS 내부에서 이미지 관리와 배포를 처리할 수 있습니다.

  3. 보안
    AWS ECR은 AWS IAM을 통해 세분화된 접근 권한을 설정할 수 있습니다. 이를 통해 사용자, 애플리케이션, 서비스별로 제한된 권한만 부여할 수 있어 보안이 강화됩니다.

  4. 네트워크 성능 향상
    ECR은 AWS 내부 네트워크에서 이미지를 전송하기 때문에 Docker Hub보다 네트워크 성능이 우수합니다. 이미지 다운로드 속도가 더 빠르고, 트래픽 비용도 절약됩니다.

AWS ECR을 배우는 이유

1. 기존 배포 방식의 문제점


Docker를 사용하지 않는 일반적인 배포 방식은 다음과 같습니다:

  1. 코드 기반 배포

    • 프로젝트 코드를 GitHub에 푸시합니다.
    • AWS EC2 서버에 SSH로 접속한 뒤, GitHub에서 코드를 풀(Pull) 받아 실행합니다.
    • 이 과정에서 프로젝트를 실행하기 위한 런타임 환경(Node.js, JDK 등)을 EC2에 직접 설치해야 합니다.
  2. 문제점

    • 비효율적: 코드와 런타임 환경을 직접 설치하고 설정하는 과정이 번거롭습니다.
    • 환경 의존성 문제: 개발 환경과 서버 환경이 다르면 오류가 발생할 가능성이 높습니다.
    • 업데이트 번거로움: 새로운 버전을 배포하려면 동일한 과정을 반복해야 합니다.

2. Docker와 AWS ECR의 장점


Docker의 가장 큰 장점은 이식성입니다.

  • Docker 이미지는 필요한 코드, 라이브러리, 런타임 환경이 모두 포함된 패키지입니다.
  • 이를 통해 "어디에서든 실행 가능"한 환경을 제공합니다.

AWS ECR을 활용하면, 다음과 같은 방식으로 배포를 간소화할 수 있습니다:

  1. 이미지 빌드 및 푸시
    • 프로젝트 코드를 Docker 이미지로 빌드한 뒤, AWS ECR에 업로드합니다.
  2. 이미지 다운로드 및 실행
    • EC2나 ECS에서 이미지를 바로 다운로드해 실행합니다.
    • EC2에 코드와 환경을 개별적으로 설치할 필요가 없어집니다.

기존 배포 방식과 Docker 기반 배포 방식 비교

항목기존 배포 방식Docker + AWS ECR 기반 배포 방식
배포 준비GitHub에서 코드 풀(Pull) 후 실행 준비ECR에서 Docker 이미지 다운로드
환경 설정런타임(Node, JDK 등) 수동 설치 필요이미 Docker 이미지에 포함됨
배포 속도느림 (환경 설정 및 코드 다운로드)빠름 (이미지 다운로드 및 실행)
환경 의존성 문제개발 환경과 서버 환경 불일치 가능성컨테이너로 동일한 환경 제공
보안GitHub 리포지토리 접근 권한 필요AWS IAM으로 세분화된 접근 제어

AWS ECR 실습 #1

AWS CLI(AWS Command Line Interface) 설치

AWS CLI란?
AWS CLI(AWS Command Line Interface)는 명령어를 통해 AWS를 관리할 수 있게 해주는 도구입니다.

쉽게 설명하면:
AWS 관리 콘솔(웹 사이트)에서 클릭으로 설정하고 관리하던 작업을, 터미널에서 명령어로 빠르게 처리할 수 있도록 도와주는 프로그램입니다.

AWS CLI 설치 공식 문서 링크:
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

  1. 맥(MAC OS) 설치
$ brew install awscli
$ aws --version # 잘 출력된다면 정상적으로 설치된 상태입니다.
  1. 우분투(Ubuntu) 설치
$ sudo apt install unzip
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version # 잘 출력된다면 정상적으로 설치된 상태입니다.

AWS IAM 생성 및 엑세스 키 등록

  1. IAM에서 사용자를 생성합니다. 권한 정책은 AmazonEC2ContainerRegistryFullAccess를 선택합니다.



  2. Access Key를 발급받습니다. 이때, 엑세스 키와 비밀 엑세스 키는 반드시 다른 곳에 저장해놓도록 합니다.



  3. AWS CLI로 엑세스 키를 등록합니다.

AWS ECR(Elastic Container Registry) 세팅

AWS에서 Elastic Container Registry를 검색 후 리포지토리를 생성합니다. 일반적으로 리포지토리는 프라이빗으로 생성하며, 하나의 리포지토리에는 한 종류의 이미지만 저장하고 관리합니다.

이미지 빌드 후 AWS ECR에 push, pull 해보기

  1. 이미지 push
    생성한 리포지토리를 선택하여 들어가면, 푸시 명령을 확인할 수 있습니다. 명령어를 순서대로 복사하여 프로젝트 터미널에 붙여넣고 실행합니다.





    명령어를 모두 입력 후 ECR에서 새로고침을 해보면 빌드된 이미지가 ECR에 푸시된 것을 확인할 수 있습니다.

  2. 이미지 pull

$ docker pull [AWS ECR 주소(=이미지 이름)] # ECR에 있는 이미지를 받아올 수 있습니다.


AWS ECR 실습 #2

AWS EC2에 Spring Boot 배포

Spring Boot 프로젝트를 하나 생성한 후 AppController 클래스를 생성합니다.

Dockerfile을 생성합니다.

AWS ECR 푸시 명령 보기를 참조하여 이미지를 빌드 및 푸시합니다.


EC2에서 ECR로부터 이미지를 다운받아 컨테이너를 띄웁니다.

❗️만약, 이 과정에서 다음과 같은 에러가 발생한다면, CPU 아키텍처 환경이 일치하지 않기 때문입니다.

EC2 CPU 아키텍처를 확인합니다.

$ lscpu # 해당 명령어로 EC2의 CPU 아키텍처를 확인할 수 있습니다.


이미지를 실행하고자 하는 CPU 아키텍처에 맞춰서 이미지를 다시 빌드합니다.

EC2 CPU 아키텍처에 맞게 다시 빌드된 이미지를 ECR로부터 받아온 후 실행해보면, 잘 작동하는 것을 확인할 수 있습니다.

AWS ECR 실습 #3

AWS EC2에 Spring Boot, MySQL, Redis 배포

실습 #2에서 사용한 프로젝트 그대로 이어서 실습합니다.
EC2 내부에 폴더를 하나 생성한 후 해당 폴더에 도커 컴포즈 파일을 생성합니다
도커 컴포즈 파일 내용은 다음과 같습니다:

services:
  instagram-server:
    image: 381492107073.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:lateset # 실제 사용하는 ECR 주소(이미지 이름)를 입력합니다.
    ports:
      - 8080:8080
    depends_on:
      my-db:
        condition: service_healthy
      my-cache-server:
        condition: service_healthy
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
      MYSQL_DATABASE: mydb
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3306:3306
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping" ]
      interval: 5s
      retries: 10
  my-cache-server:
    image: redis
    ports:
      - 6379:6379
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 5s
      retries: 10




도커 컴포즈 파일이 위치한 경로에서 도커 컴포즈 실행 명령어를 입력합니다. 이때, --build를 포함하여 명령어를 입력해야 합니다.

$ docker compose up -d --build

# 잘 실행되고 있는지 확인하는 명령어:
$ docker ps
$ docker compose ps
$ docker compose logs 

결론: AWS ECR을 배우는 이유

  • 간소화된 배포 프로세스
    Docker 이미지로 필요한 환경을 모두 캡슐화하여 EC2에서 바로 실행할 수 있습니다.

  • 운영 효율성 향상
    AWS 내부에서 이미지 관리와 배포를 통합적으로 처리할 수 있어 운영 복잡도가 줄어듭니다.

  • 보안 및 성능 강화
    IAM으로 보안을 강화하고 AWS 네트워크를 활용해 배포 속도와 성능을 최적화할 수 있습니다.

profile
donggyun_ee

0개의 댓글