43장. ECR — 컨테이너 이미지 저장소
이 장에서 말하고자 하는 것
이미지를 빌드했다면 다음 문제가 생긴다.
“이 이미지를 ECS / EKS / EC2 가 어떻게 받아가지?”
이때 등장하는 게
Amazon ECR (Elastic Container Registry)
다.
ECR은 AWS가 운영하는 컨테이너 이미지 저장소다.
1. ECR이 하는 일
- 이미지를 안전하게 저장 (프라이빗 기본)
- IAM으로 접근 통제
- 취약점 자동 스캔
- ECS · EKS · Lambda 와 매끄럽게 연동
Docker Hub와 비슷한 자리지만
AWS 내부에 두니 권한 · 속도 · 비용이 좋다.
2. 리포지토리 = 한 종류의 이미지
orders 리포지토리
├─ orders:v1
├─ orders:v2
└─ orders:sha-a3f2c1
서비스마다 리포지토리 하나가 일반적이다.
3. 이미지 태그 — 운영 규칙
좋은 태그
- 시맨틱 버전:
v1.2.3 - 커밋 해시:
sha-a3f2c1 - 빌드 번호:
build-145
피해야 할 태그
latest— 내용이 자꾸 바뀐다prod— 어디서 만들어졌는지 모른다
태그는 불변(immutable) 으로 — 한 번 푸시한 태그는 덮어쓰지 않는다
ECR은 imageTagMutability = IMMUTABLE 로 설정할 수 있다.
4. 인증과 푸시
aws ecr get-login-password --region ap-northeast-2 \
| docker login --username AWS \
--password-stdin <acct>.dkr.ecr.ap-northeast-2.amazonaws.com
docker tag orders:v1 <acct>.dkr.ecr.ap-northeast-2.amazonaws.com/orders:v1
docker push <acct>.dkr.ecr.ap-northeast-2.amazonaws.com/orders:v1
ECS가 그 이미지를 받을 때는
Task Execution Role 에 ECR pull 권한이 필요하다.
5. 이미지 스캔
- Basic Scan — 알려진 CVE 매칭 (무료)
- Enhanced Scan — Inspector 기반 깊은 스캔 (유료)
스캔 결과: CRITICAL 1, HIGH 3, MEDIUM 12
CRITICAL 등급 이상은 알람 또는 배포 차단으로 연결한다.
운영 이미지는 무조건 스캔 결과를 본다
6. 수명 주기 정책
오래된 이미지를 자동 정리한다.
규칙 1: 태그 없는 이미지 7일 후 삭제
규칙 2: 최근 30개만 유지
ECR 비용의 절반은 “안 쓰는 옛 이미지” 다.
7. 우리 서비스에서
[개발자 또는 CI]
↓ docker push
[ECR: orders / users / payments]
↑ docker pull (Task Execution Role)
[ECS Service Task]
- 서비스마다 리포지토리 하나
- 태그는 커밋 해시 (불변)
- CRITICAL 취약점은 배포 전 차단
- 수명 주기로 자동 정리
8. 직접 확인해보기 — CLI
aws ecr create-repository \
--repository-name orders \
--image-scanning-configuration scanOnPush=true \
--image-tag-mutability IMMUTABLE
aws ecr list-images --repository-name orders
aws ecr describe-image-scan-findings \
--repository-name orders \
--image-id imageTag=v1
9. 코드로는 이렇게 생겼다 — Terraform
resource "aws_ecr_repository" "orders" {
name = "orders"
image_tag_mutability = "IMMUTABLE"
image_scanning_configuration {
scan_on_push = true
}
encryption_configuration {
encryption_type = "AES256"
}
}
resource "aws_ecr_lifecycle_policy" "orders" {
repository = aws_ecr_repository.orders.name
policy = jsonencode({
rules = [
{
rulePriority = 1
description = "untagged 7일 후 삭제"
selection = {
tagStatus = "untagged"
countType = "sinceImagePushed"
countUnit = "days"
countNumber = 7
}
action = { type = "expire" }
},
{
rulePriority = 2
description = "최근 30개만 유지"
selection = {
tagStatus = "any"
countType = "imageCountMoreThan"
countNumber = 30
}
action = { type = "expire" }
}
]
})
}
10. 이렇게 쓰면 망한다 — 안티패턴
안티패턴 1. latest 태그로 운영한다
롤백 불가능.
안티패턴 2. 수명 주기를 안 건다
청구서가 매달 늘어난다.
안티패턴 3. 스캔 결과를 안 본다
CRITICAL CVE가 운영 이미지에 있는데 모른다.
안티패턴 4. 권한 없는 사용자에게 push 권한을 준다
이미지가 곧 운영 코드다. push 권한은 CI/일부 인력으로 제한.
11. 한 줄로 정리
ECR은 AWS 안의 컨테이너 이미지 저장소이며,
불변 태그 · 스캔 · 수명 주기 세 가지가 운영의 기본이다
12. 이 장의 핵심 정리
- ECR은 AWS의 관리형 컨테이너 이미지 저장소다.
- 서비스마다 리포지토리 하나가 표준이다.
- 태그는 불변으로 운영해야 롤백이 가능하다.
- 스캔 결과를 알람으로 받고, CRITICAL은 배포에서 차단한다.
- 수명 주기 정책으로 오래된 이미지를 자동 정리한다.
- ECS의 Task Execution Role이 이미지를 pull 한다.