Amazon ECR

마지막 업데이트: 2026년 2월 25일

개요

Amazon Elastic Container Registry(ECR)는 AWS에서 제공하는 완전관리형 컨테이너 레지스트리 서비스입니다. Docker 이미지, OCI 이미지 및 OCI 호환 아티팩트를 저장, 관리, 배포할 수 있으며, AWS IAM과 통합되어 세밀한 접근 제어가 가능합니다.

아키텍처

spinner

Private vs Public ECR

특성
ECR Private
ECR Public

URL 형식

<account>.dkr.ecr.<region>.amazonaws.com/<repo>

public.ecr.aws/<alias>/<repo>

인증

IAM 기반 필수

선택적 (익명 pull 가능)

리전

모든 상용 리전

us-east-1만 (글로벌 배포)

비용

스토리지 + 전송

스토리지 + 전송 (50GB 무료)

사용 사례

프라이빗 워크로드

오픈소스, 공개 배포

가격 모델

항목
비용
비고

스토리지

$0.10/GB/월

모든 리전 동일

데이터 전송 (리전 내)

무료

같은 리전 EKS/EC2

데이터 전송 (리전 간)

$0.01-0.02/GB

리전별 상이

데이터 전송 (인터넷)

$0.09/GB~

용량별 할인

비용 예시 (월간):


리포지토리 생성 및 구성

AWS CLI로 리포지토리 생성

주요 옵션:

옵션
설명
권장 값

--image-tag-mutability

태그 변경 가능 여부

IMMUTABLE (프로덕션)

--image-scanning-configuration

푸시 시 스캐닝

scanOnPush=true

--encryption-configuration

암호화 설정

KMS (민감 데이터)

AWS CDK로 리포지토리 생성

Immutable Tags 설정

Immutable tags는 한번 푸시된 태그를 덮어쓸 수 없게 합니다:

Immutable Tags의 장점:

  • 프로덕션 이미지 무결성 보장

  • 감사 추적 용이

  • 롤백 시 일관성 보장

주의사항:

  • latest 태그 사용 불가 (매번 새 태그 필요)

  • CI/CD 파이프라인 조정 필요

암호화 설정

AES-256 (기본):

KMS (고객 관리형):

KMS 사용 사례:

  • 규제 준수 (키 로테이션 감사)

  • 교차 계정 암호화 제어

  • 세분화된 접근 제어

취약점 스캐닝

Basic Scanning (기본):

Enhanced Scanning (Amazon Inspector):

특성
Basic Scanning
Enhanced Scanning

엔진

Clair (오픈소스)

Amazon Inspector

커버리지

OS 패키지

OS + 언어 패키지

주기

푸시 시 / 수동

지속적 + 새 CVE 발견 시

비용

무료

Inspector 요금


인증 및 접근 제어

Docker 로그인

amazon-ecr-credential-helper

Docker 자격 증명을 자동으로 관리합니다:

IAM 정책 예시

읽기 전용 (Pull):

Push 권한:

관리자 권한:

교차 계정 접근

리소스 기반 정책 (대상 리포지토리에 설정):

교차 계정에서 pull:


Lifecycle Policy 심화

ECR Lifecycle Policy는 이미지 보존 규칙을 자동화하여 스토리지 비용을 최적화합니다. 이 섹션에서는 다양한 전략과 그 장단점을 상세히 설명합니다.

Lifecycle Policy 동작 원리

spinner

규칙 평가 순서:

  1. 규칙은 rulePriority 숫자가 낮은 것부터 평가

  2. 각 규칙은 선택 기준에 맞는 이미지를 식별

  3. 삭제 대상으로 표시된 이미지는 실제 삭제 실행

  4. 한 이미지가 여러 규칙에 매칭되면 첫 번째 매칭 규칙 적용

선택 기준 (Selection Criteria):

기준
설명
예시

tagStatus

태그 상태

tagged, untagged, any

tagPatternList

태그 패턴 (glob)

["v*", "release-*"]

countType

카운트 방식

imageCountMoreThan, sinceImagePushed

countNumber

보존할 개수

100

countUnit

시간 단위

days

중요 제한사항:

  • 단일 규칙에서 imageCountMoreThansinceImagePushed를 OR 조건으로 결합할 수 없음

  • 규칙 간 우선순위로만 조합 가능

  • "N개 또는 M일 중 더 많은 쪽" 로직은 네이티브 지원 안 됨


Strategy A: 분리된 리포지토리 (권장)

프로덕션과 개발 이미지를 별도 리포지토리로 분리하면 각각에 최적화된 lifecycle 정책을 적용할 수 있습니다.

아키텍처:

프로덕션 리포지토리 (myapp-prod) Lifecycle Policy:

개발 리포지토리 (myapp-dev) Lifecycle Policy:

Strategy A 장점:

  • 환경별 명확한 정책 분리

  • 프로덕션 이미지 실수 삭제 방지

  • 간단하고 예측 가능한 동작

  • Immutable tags를 프로덕션에만 적용 가능

Strategy A 단점:

  • 이미지 프로모션 시 cross-repo 복사 필요

  • 리포지토리 수 증가


Strategy B: 단일 리포지토리 + 우선순위 규칙

하나의 리포지토리에서 태그 패턴으로 환경을 구분합니다.

태그 컨벤션:

Lifecycle Policy:

⚠️ Strategy B의 중요한 제한사항:

단일 리포지토리 + 우선순위 규칙 전략에서는 "N개 또는 M일 중 더 많이 보존" 로직을 구현할 수 없습니다.

문제 시나리오:

구체적 예시:

이 제한을 우회하려면:

  • Strategy A (분리 리포지토리) 사용

  • Strategy C (Lambda 기반 커스텀 로직) 사용


Strategy C: Lambda 기반 커스텀 Lifecycle (고급)

ECR 네이티브 lifecycle의 한계를 극복하려면 Lambda를 사용한 커스텀 로직이 필요합니다.

아키텍처:

Lambda 함수 (Python):

Lifecycle Policy Dry-Run 테스트

정책을 적용하기 전에 미리 결과를 확인할 수 있습니다:


Lifecycle Policy 전략 비교

전략
복잡성
유연성
운영 부담
권장 사용 사례

A: 분리 리포지토리

낮음

높음

낮음

대부분의 팀 (권장)

B: 단일 + 우선순위

중간

중간

낮음

소규모 프로젝트

C: Lambda 커스텀

높음

매우 높음

높음

복잡한 보존 요구사항


멀티 환경 태그 전략

태그 네이밍 컨벤션

권장 태그 형식:

환경
태그 형식
예시

프로덕션

SemVer

1.2.3, 2.0.0

스테이징

stage-{semver}

stage-1.2.3

개발

dev-{git-sha}

dev-abc1234

Feature

feature-{name}-{sha}

feature-login-def5678

PR

pr-{number}

pr-123

CI/CD에서 태그 생성:

태그 프로모션 워크플로우

프로모션 스크립트:

Immutable Tags 사용 이유


EKS 통합

IRSA (IAM Roles for Service Accounts)

EKS Pod Identity (신규 권장)

imagePullSecrets 방식

Private Endpoint 접근

VPC 내에서 인터넷 없이 ECR 접근이 필요한 경우, VPC Endpoint를 구성합니다:

  • ecr.api: ECR API 호출용 Interface 엔드포인트

  • ecr.dkr: Docker 레지스트리 프로토콜용 Interface 엔드포인트

  • s3: 이미지 레이어 저장소 접근용 Gateway 엔드포인트

ECR Pull-through Cache

외부 레지스트리를 ECR을 통해 캐싱하여 외부 의존성을 줄이고 pull 성능을 향상시킵니다.

spinner

지원 Upstream 레지스트리

Upstream 레지스트리
ECR Prefix
인증 필요
비고

Docker Hub

docker-hub

Yes (Secrets Manager)

rate limit 우회

Quay.io

quay

No

Red Hat / CoreOS 이미지

GitHub Container Registry

ghcr

Yes (Secrets Manager)

GitHub Actions 이미지

registry.k8s.io

k8s

No

Kubernetes 핵심 컴포넌트

ECR Public

ecr-public

No

AWS 공개 이미지

Secrets Manager 설정 (인증 필요 레지스트리)

Pull-through Cache 규칙 생성

Pull-through Cache용 IAM 정책

검증

containerd 설정 (투명한 Pull-through)

Pod의 이미지 경로를 변경하지 않고도 캐시를 사용할 수 있도록 containerd 미러를 구성합니다:

참고: EKS 관리형 노드 그룹에서는 Launch Template의 사용자 데이터를 통해 containerd 설정을 적용합니다.

사용 예시:


멀티 리전 복제

복제 구성

DR 고려사항


모니터링 및 비용 최적화

CloudWatch 메트릭

CloudWatch 대시보드:

비용 분석

비용 최적화 팁

1. Lifecycle Policy 적극 활용:

2. 멀티스테이지 빌드로 이미지 크기 줄이기:

3. 리전 간 전송 최소화:


요약

항목
권장 사항

리포지토리 구조

환경별 분리 (prod/dev)

태그 전략

SemVer (prod), git-sha (dev)

태그 불변성

프로덕션: IMMUTABLE

스캐닝

Enhanced Scanning (프로덕션)

Lifecycle

Strategy A (분리 리포지토리)

인증

IRSA 또는 Pod Identity

비용

Lifecycle + 멀티스테이지 빌드

DR

멀티 리전 복제


참고 자료

마지막 업데이트