Amazon ECR: Kho lưu trữ container riêng tư và an toàn trên AWS
Hiểu ECR qua vai trò thực tế trong pipeline DevOps — từ build, push đến deploy
1. ECR là gì và tại sao bạn cần nó?
Khi bạn đóng gói ứng dụng vào Docker container, bạn cần một nơi để lưu trữ image đó — giống như GitHub cho mã nguồn, nhưng dành riêng cho container. Đó chính là **Amazon ECR (Elastic Container Registry)**.
ECR là dịch vụ lưu trữ container registry **riêng tư, được quản lý hoàn toàn bởi AWS**, tích hợp sâu với IAM, ECS, EKS và các dịch vụ khác. Khác với Docker Hub (công cộng hoặc trả phí cho private repo), ECR:
- Miễn phí cho private repository
- Tự động quét lỗ hổng bảo mật (CVE) trong image
- Tích hợp liền mạch với AWS CLI, Docker CLI và CI/CD tools
- Chỉ cho phép truy cập qua IAM — không cần quản lý username/password riêng
Nếu bạn chạy container trên AWS (ECS/EKS), **ECR là lựa chọn tự nhiên và an toàn nhất**.

2. Cấu trúc và khái niệm cơ bản
2.1. Repository
Là nơi chứa các phiên bản (tag) của một image. Tên repository thường theo định dạng: my-app/backend
, nginx-custom
, v.v.
Mỗi repository có URL duy nhất, ví dụ:
123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/my-app
2.2. Image và Tag
- Image là bản snapshot của ứng dụng đã build.
- Tag là nhãn phiên bản, ví dụ: latest
, v1.2.0
, sha-a1b2c3d
.
- AWS khuyến nghị **tránh dùng latest
trong production** — vì không xác định được phiên bản cụ thể.
2.3. Scan lỗ hổng bảo mật
ECR tự động quét image khi bạn push (hoặc theo lịch). Kết quả hiển thị trong console: số CVE, mức độ nghiêm trọng (CRITICAL, HIGH…), và CVE ID.
Bạn có thể chặn pipeline nếu phát hiện lỗ hổng nghiêm trọng — tăng độ tin cậy hệ thống.
3. Thực hành: Từ build đến push image vào ECR
Giả sử bạn có ứng dụng Node.js với Dockerfile trong thư mục hiện tại.
Bước 1: Tạo repository trên AWS Console
- Vào ECR → Repositories → Create repository
- Tên:
my-web-app
- Giữ nguyên các tùy chọn mặc định (private, scan on push: bật)
Bước 2: Build image cục bộ
docker build -t my-web-app .
Bước 3: Đăng nhập Docker CLI vào ECR
Chạy lệnh sau (AWS CLI phải đã được cấu hình):
aws ecr get-login-password --region ap-southeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com
Bước 4: Đặt tag cho image theo định dạng ECR
docker tag my-web-app:latest 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/my-web-app:v1.0.0
Bước 5: Push image lên ECR
docker push 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/my-web-app:v1.0.0
Sau bước này, image sẽ xuất hiện trong repository, kèm kết quả quét bảo mật sau vài phút.
4. Tích hợp ECR với ECS và EKS
Khi tạo task definition (ECS) hoặc deployment (EKS), bạn chỉ cần khai báo image URL đầy đủ từ ECR:
123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/my-web-app:v1.0.0
Với ECS (Fargate hoặc EC2), bạn cần đảm bảo:
- Task execution role có quyền
ecr:GetDownloadUrlForLayer
,ecr:BatchGetImage
,ecr:GetAuthorizationToken
. - Task chạy trong VPC có kết nối đến ECR (thường qua internet hoặc VPC endpoint).
Với EKS, bạn có thể dùng IAM role cho service account (IRSA) để cấp quyền pull image — không cần secret Docker.
5. Best practices khi dùng ECR
- Luôn dùng tag có phiên bản cụ thể (ví dụ: git commit hash hoặc semantic version) — không dùng
latest
trong production. - Bật scan on push và tích hợp vào CI pipeline để fail build nếu có lỗ hổng CRITICAL.
- Dọn dẹp image cũ bằng lifecycle policy — tránh tốn chi phí lưu trữ.
- Sử dụng VPC endpoint cho ECR (com.amazonaws.region.ecr.dkr, com.amazonaws.region.ecr.api) để giữ traffic trong AWS backbone — tăng bảo mật và hiệu năng.
- Giới hạn quyền pull/push bằng IAM policy — chỉ cho CI/CD user quyền push, chỉ cho ECS task quyền pull.

6. Kết luận
Amazon ECR không chỉ là “nơi lưu image” — mà là **mắt xích bảo mật và kiểm soát** trong toàn bộ vòng đời container. Khi được kết hợp với IAM, VPC endpoint và lifecycle policy, ECR giúp bạn:
- Ngăn rò rỉ image ra ngoài
- Phát hiện lỗ hổng trước khi deploy
- Tối ưu chi phí lưu trữ
- Tăng tốc độ pull image trong VPC
Trong hệ sinh thái AWS, **ECR + ECS/EKS là bộ đôi đáng tin cậy** cho mọi workload container — từ prototype đến hệ thống production quy mô lớn.
Hãy bắt đầu bằng cách tạo một repository, push image đầu tiên, và bật scan — bạn sẽ thấy ngay giá trị của một registry “có trách nhiệm”.