개요
현재는 GitHub Actions를 통해 main 브랜치에 merge되었을 때, EC2 인스턴스에 작성해 둔 Shell Script를 실행하여 Spring Boot API 서버를 배포하고 있습니다.
이러한 방식은 간단하게 배포를 자동화할 수 있다는 장점이 있지만, 다음과 같은 문제점이 있었습니다.
기존 배포 방식의 문제점
- 🚨무중단 배포의 어려움
서버를 중지하고 다시 시작하는 방식이기 때문에, 배포 시 사용자에게 순간적인 장애가 발생할 수 있습니다. - 롤백의 어려움
문제가 생겼을 때 이전 버전으로 되돌리는 과정이 수동적이고 번거롭습니다. - 트래픽 증가 대응의 어려움
EC2 인스턴스 하나에서 모든 요청을 처리하기 때문에, 트래픽이 늘어날 경우 확장이 어렵습니다. - 환경 간 일관성 부족
로컬과 운영 환경의 설정 차이로 인해 예기치 못한 문제가 발생할 수 있습니다.
Docker & Kubernetes 도입 이유
이러한 문제점을 해결하기 위해 Docker와 Kubernetes 도입을 검토하게 되었습니다.
- Docker는 이미지 기반의 배포 방식으로, 애플리케이션을 환경에 구애받지 않고 실행할 수 있습니다. 버전 태그를 통해 빠른 롤백이 가능하고, 동일한 환경 구성을 보장합니다.
- Kubernetes(K8s)는 Rolling Update, Blue-Green Deployment 등의 배포 전략을 통해 무중단 배포를 지원하며, HPA(Horizontal Pod Autoscaler)를 통해 자동 스케일링도 가능합니다. 또한, Pod 상태를 지속적으로 체크하여 문제가 발생한 경우 자동으로 재시작하거나 교체하여 모니터링 및 장애 대응도 용이합니다.
이미지 저장소 선택: Docker Hub vs AWS ECR
오늘은 Spring Boot 프로젝트의 Docker 이미지를 생성한 후, 해당 이미지를 저장하고 배포할 저장소로 Docker Hub와 AWS ECR 중 어떤 것을 선택하는 것이 좋을지에 대해 정리해보려 합니다.
🐳 Docker Hub vs 🟠 AWS ECR 비교
항목 | Docker Hub | AWS ECR |
설정 난이도 | 설정이 간단하고 직관적이며, CI/CD 연동도 쉬움 | IAM 설정, 권한 부여 등 약간의 사전 설정이 필요함 |
속도 및 접근성 | 퍼블릭 레지스트리로 글로벌 CDN을 통해 빠른 이미지 접근 가능 | 같은 리전에 있을 경우 빠른 이미지 Pull이 가능함 (특히 AWS 서비스와 통합 시 강점) |
보안 | 퍼블릭 기본, Private는 유료 제한 있음 (무료 계정은 private repo 수 제한) | 기본적으로 private, IAM과 연계된 세밀한 권한 설정 가능 |
비용 | 퍼블릭은 무료, Private 저장소는 제한적 무료 또는 유료 | AWS 프리 티어 제공, 사용량 초과 시 S3 기반 과금 발생 |
CI/CD 연동 | GitHub Actions 등 외부 도구와 쉽게 연동 가능 | GitHub Actions 또는 CodePipeline 등 AWS 생태계 연동이 뛰어남 |
사용성 | 전 세계적으로 널리 쓰이며 커뮤니티 및 문서가 풍부 | AWS를 기반으로 하는 환경에 최적화되어 있음 |
🐳Docker-hub
클라우드 기반 레포지토리.
도커 유저들은 도커 허브를 통해 컨테이너 이미지를 생성, 테스트, 저장 그리고 배포할 수 있습니다.
장점
- 간편한 사용: Docker 명령어로 간단히 이미지를 푸시하고 풀(pull)할 수 있어 사용이 매우 직관적이고 쉽습니다.
- 무료 사용: 개인용 공개 저장소는 무료로 제공되며, 기본적인 기능은 무료로 이용할 수 있습니다.
- 광범위한 지원: Docker와의 자연스러운 호환성으로, 다양한 Docker화된 애플리케이션을 쉽게 사용할 수 있습니다.
단점
- 속도: 글로벌 서버에 있는 Docker Hub의 이미지를 풀하는 속도가 지역에 따라 느릴 수 있습니다.
- 제한된 개인 저장소: 무료 계정에서는 개인 저장소의 수나 푸시 횟수 등에 제한이 있습니다.
- 보안 문제: 공개 저장소의 이미지는 누구나 접근할 수 있어, 보안 취약점이 있는 이미지를 사용할 위험이 있습니다.
- 비용: 개인 저장소의 수나 프라이빗 저장소 기능을 확장하려면 유료 플랜을 이용해야 하며, 비용이 발생합니다.
- 권한 관리: 권한 관리를 체계적으로 하지 못합니다.
- 클라우드 서비스로 AWS를 사용하지만, 컨테이너 이미지 관리는 도커 허브에서 하기 때문에 사용자가 관리해야 하는 서비스가 많습니다.
📥AWS ECR
안전하고 확장 가능하고 신뢰할 수 있는 AWS 관리형 컨테이너 이미지 레지스트리 서비스입니다.
AWS IAM을 사용하여 리소스 기반 권한을 가진 프라이빗 레포지토리를 지원합니다.
컨테이너 이미지를 Amazon S3에 저장합니다.
장점
- AWS와의 통합: AWS의 다른 서비스들(예: ECS, EKS, Lambda)과 매끄럽게 통합되어, 관리가 용이하고 배포가 간편합니다.
- 보안: IAM(Identity and Access Management)을 사용해 사용자 및 권한 관리를 할 수 있어 보안이 강화됩니다. 이미지의 보안도 Amazon GuardDuty나 ECR Repository 정책을 통해 관리 가능합니다.
- 고가용성: AWS의 글로벌 인프라에 의해 높은 가용성과 안정성을 보장합니다.
- 자동화: ECR과 연동된 CI/CD 파이프라인을 쉽게 구성할 수 있어 자동화가 가능합니다.
- 클라우드 관리 용이성 : 클라우드 서비스를 이용하는 AWS에서 컨테이너 관리도 함께 하기 때문에 사용자가 관리하는 서비스가 적습니다.
- 컨테이너 관리 용이성 : S3를 이용하여 컨테이너를 쉽게 관리할 수 있습니다.
단점
- 비용: 저장 용량과 데이터 전송에 따른 요금이 부과됨. 사용량에 따라 가격이 올라갈 수 있어 비용 관리를 철저히 해야 합니다.
- AWS 종속성: AWS 생태계에 종속되므로, AWS 밖의 환경에서 사용하기 어려운 점이 다소 존재합니다.
- 복잡한 설정: AWS의 복잡한 설정과 구성이 초보자에게는 다소 어려울 수 있습니다.
비용
📥AWS ECR (Amazon Elastic Container Registry)
1. 스토리지 비용
- 요금: $0.10/GB/월
- 예시: 1GB 이미지 저장 시 월 $0.10
2. 데이터 수신 비용 (Push)
- 요금: 무료
3. 데이터 송신 비용 (Pull)
- 동일 리전 내 EC2, ECS, Fargate 등에서 Pull 시: 무료
- 인터넷 또는 다른 리전으로의 Pull 시: $0.09/GB
4. 예상 비용 (월간)
- 스토리지: 1GB × $0.10 = $0.10
- 데이터 송신: 동일 리전 내에서 Pull 시 무료
- 총합: 약 $0.10/월
🐳 Docker Hub
1. 스토리지 비용
- 무료 플랜: 1개의 개인(private) 저장소, 최대 2GB 저장 용량
- Pro 플랜: $9/월, 무제한 개인 저장소 및 추가 기능 제공
2. 데이터 수신 비용 (Push)
- 요금: 무료
3. 데이터 송신 비용 (Pull)
- 무료 플랜: 인증된 사용자 기준 6시간당 100회 Pull 제한
- Pro 플랜 이상: Pull 횟수 무제한
4. 예상 비용 (월간)
- 무료 플랜: Pull 제한으로 인해 주 50회 이상 사용 시 제한에 걸릴 수 있음
- Pro 플랜: $9/월
비교 요약
항목 | AWS ECR | Docker Hub (Pro 플랜) |
스토리지 요금 | $0.10/GB/월 | $9/월 (2GB 포함) |
Push 요금 | 무료 | 무료 |
Pull 요금 | 동일 리전 내 무료 | 무제한 (Pro 플랜 기준) |
Pull 제한 | 없음 | 무료 플랜은 제한 있음 |
총 예상 비용 | 약 $0.10/월 (1GB 기준) | $9/월 |
결론
기업 환경에서 EC2, RDS 등 AWS 인프라를 이미 사용 중이기 때문에 AWS ECR(Amazon Elastic Container Registry)는 다음과 같은 이유로 가장 적합하다고 생각하였습니다.
- AWS 서비스와의 강력한 통합성
ECR은 EC2, ECS, Fargate, CodePipeline, IAM 등 다양한 AWS 서비스와 자연스럽게 연동되므로, 별도 설정 없이도 이미지 빌드부터 배포까지의 전체 워크플로우를 AWS 내에서 통합적으로 구성할 수 있습니다. 이는 유지보수 및 관리 효율성을 크게 높여줍니다. - 리전 내 데이터 송수신 무료 혜택
동일 리전 내에서 EC2나 ECS와 같은 AWS 서비스가 ECR에서 이미지를 Pull 할 경우, 네트워크 요금이 발생하지 않기 때문에 운영 비용을 절감할 수 있습니다. 외부 레지스트리(Docker Hub 등)에서 이미지를 Pull 하면 인터넷 송신 요금이 발생할 수 있어 장기적으로는 비용 부담이 커질 수 있습니다. - 보안 및 접근 제어
ECR은 AWS IAM과 연동되어, 세부적인 권한 관리(예: 특정 사용자에게만 Push 권한 부여 등)가 가능합니다. 또한, 이미지 스캔 기능을 통해 취약점 분석을 수행할 수 있어 보안이 중요한 기업 환경에 매우 적합합니다. - CI/CD 자동화에 최적화
AWS CodeBuild, CodePipeline과의 연계를 통해 자동 빌드 및 배포 파이프라인을 쉽게 구성할 수 있어 DevOps 환경에 최적화되어 있습니다.
하지만 Github Actions를 통한 CI/CD를 고려하고 있기 때문에 해당 항목은 크게 고려되지 않았습니다. - 예상 가능하고 합리적인 비용
Docker Hub는 일정 횟수 이상 이미지 Pull이 발생하면 Pro 요금제 이상의 유료 플랜을 이용해야 하며, 일부 기업 환경에서는 비용이 예측 불가능하게 증가할 수 있습니다. 반면, ECR은 저장 용량 기준으로만 요금이 부과되고, AWS 내부 통신에는 별도의 비용이 들지 않아 비용 구조가 단순하고 예측 가능합니다.
따라서, 기업 환경에서 AWS의 EC2 및 RDS를 사용하고 있으며, 동일 리전 내에서의 이미지 Pull이 주로 발생하는 경우, AWS ECR이 비용 효율적이고 AWS 서비스와의 통합 측면에서도 유리합니다. 특히, 초기 개발 환경 설정 시 빈번한 이미지 Pull이 예상된다면, Pull 제한이 없는 AWS ECR이 적합하다고 생각하였습니다.
'개발 > DevOps' 카테고리의 다른 글
GitHub Actions를 이용한 Vue 프로젝트 Firebase Hosting 자동 배포 (1) | 2025.05.02 |
---|---|
Spring Boot CI/CD with Github Actions, ECR, Docker, K3S (1) | 2025.04.24 |
도커(Docker) 배우기 (3) - 볼륨 (Volume) (0) | 2025.04.11 |
도커(Docker) 배우기 (2) - 자주 쓰는 명령어(Docker CLI) (0) | 2025.04.04 |
도커(Docker) 배우기 (1) - 컨테이너(Container), 이미지(Image) 란? (0) | 2025.04.03 |