Amazon ECR (Elastic Container Registry)
ECR은 도커(Docker) 컨테이너 이미지를 저장하고 관리하는 보관소입니다.
- 역할: 개발자가 작성한 코드를 컨테이너 이미지로 빌드한 뒤, 이를 안전하게 저장합니다.
- 특징: AWS IAM과 연동되어 권한 관리가 강력하며, ECS나 EKS에서 이미지를 불러와 배포할 때 가장 빠르고 안정적입니다.
Amazon ECS (Elastic Container Service)
AWS에서 자체 개발한 컨테이너 오케스트레이션(관리) 서비스입니다.
- 역할: ECR에 저장된 이미지를 가져와서 실제 서버(EC2 또는 Fargate)에서 실행하고 관리합니다.
- 장점: 설정이 간단하고 배우기 쉽습니다.
- 비용 효율: 클러스터 관리 비용(Control Plane)이 무료입니다. (사용한 리소스 비용만 지불)
- 네이티브 통합: AWS의 다른 서비스(ALB, IAM, CloudWatch 등)와 매우 긴밀하게 연결되어 있습니다.
- 단점: AWS 전용 도구이므로 다른 클라우드(GCP, Azure)로 옮길 때 설정 등을 다시 해야 합니다(Lock-in 가능성).
Amazon EKS (Elastic Kubernetes Service)
Kubernetes(K8s)를 AWS 환경에서 운영할 수 있도록 관리해주는 서비스입니다.
- 역할: 대규모의 복잡한 컨테이너 환경을 전문적으로 관리합니다.
- 장점: 유연성과 확장성: 오픈 소스인 Kubernetes의 모든 생태계(Helm, ArgoCD, Istio 등)를 그대로 사용할 수 있습니다.
- 이식성: 다른 클라우드나 온프레미스 환경으로 서비스 이전이 비교적 자유롭습니다.
- 단점: Kubernetes 자체의 난이도가 매우 높습니다.
- 비용: 클러스터당 시간당 비용($0.10/hour, 월 약 7~8만 원)이 기본적으로 발생합니다.
비교하기
| 구분 | ECR | ECS | EKS |
| 주요 역할 | 이미지 저장/관리 | 컨테이너 배포/운영 | Kubernetes 기반 배포/운영 |
| 관리 난이도 | 낮음 | 중간 | 높음 |
| 비용 | 저장 용량당 과금 | 사용한 인프라만 과금 | 클러스터 요금 발생 + 인프라 과금 |
| 추천 대상 | 모든 컨테이너 사용자 | 소규모~중간 규모, 빠른 배포 중시 | 대규모, 복잡한 마이크로서비스(MSA) |
실습
인스턴스 세팅
Docker 및 awscli 설치
# Docker 설치
DOCKER_USER=ubuntu
sudo apt update
sudo apt-get update && sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --yes --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $DOCKER_USER
# awscli 설치
sudo apt update && sudo apt install unzip -y
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# 설치 확인
aws --version
AWS 로그인
aws configure

실습 - ECR
Simple Notification Service 생성
AWS에서 ECR 검색 → 리포지토리→ 리포지토리 생성

Docker 클라이언트가 AWS의 컨테이너 저장소(ECR)에 접근할 수 있도록 인증 토큰을 발급받아 로그인



방금 만든 AWS 리포지토리에 이미지 업로드

# min-nginx:v1.0는 임의로 만든 이미지
# 해당 이미지 태그 생성 후 배포
docker tag min-nginx:v1.0 799581472868.dkr.ecr.ap-northeast-2.amazonaws.com/min-nginx:v1.0
docker push 799581472868.dkr.ecr.ap-northeast-2.amazonaws.com/min-nginx:v1.0

실습 - ECS
클러스터 생성
AWS에서 ECS 검색 → 클러스터 → 클러스터 생성

새 태스크 정의 생성
AWS에서 ECS 검색 → 태스크 정의 → 새 태스크 정의 생성


아까 만든 min-ECS-cluster-00 클러스터에 들어가 태스크 생성



최종적으로 빌드된 Docker 이미지를 ECS 클러스터에 배포하여 실제 컨테이너 서비스로 구동시킬 수 있습니다




실습 - EKS
IAM 역할 추가
EKS 역할 추가
AmazonEKSClusterPolicy,
AmazonEKSVPCResourceController
AWS 검색창에 IAM 검색 -> 역할 -> 역할 생성 (EKS)




EC2 역할 추가
AmazonEC2ContainerRegistryReadOnly,
AmazonEKS_CNI_Policy,
AmazonEKSWorkerNodePolicy
AmazonSSMManagedInstanceCore
AWS 검색창에 IAM 검색 -> 역할 -> 역할 생성 (EC2)



최종 역할 추가 및 권한


인스턴스에 k8s 관리도구 및 eks 설치/운영도구
k8s 관리도구 - kubectl
# https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.34.2/2025-11-13/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
kubectl version --client
eks 설치/운영 도구 - eksctl
# https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eksctl.html
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
mv /tmp/eksctl /usr/local/bin
`cluster.yaml` 생성
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: min-cluster
region: ap-northeast-2
vpc:
id: vpc-0b4d781f8ccbee1d0
subnets:
public:
ap-northeast-2a:
id: subnet-0e39b2043ad66619a
ap-northeast-2c:
id: subnet-071965700e6b84141
iam:
withOIDC: true
managedNodeGroups:
- name: min-nodeGroup
instanceType: t3.medium
desiredCapacity: 2
minSize: 1
maxSize: 2
privateNetworking: false
subnets:
- subnet-0e39b2043ad66619a
- subnet-071965700e6b84141
iam:
withAddonPolicies:
imageBuilder: true
autoScaler: true
ebs: true
ssh:
allow: true
publicKeyName: min-01
`cluster.yaml` 실행
eksctl create cluster -f cluster.yaml
설치 중간에 오류났을 경우

설정한 두개의 서브넷에 `퍼블릭 주소 자동 할당 활성화` 체크
기존에 설치 되던 cluster 제거
eksctl delete cluster --region=ap-northeast-2 --name=min-cluster
재설치
eksctl create cluster -f cluster.yaml
테스트용 `nginx-00.yaml` 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.io/box8741/min-nginx:v1.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
nginx 접근을 위한 인바운드 규칙 추가


`curl <<EXTERNAL-IP>>:30080` 로 접근이 된다면 성공!

'Public Cloud > AWS' 카테고리의 다른 글
| AWS Service - ELB (0) | 2026.04.02 |
|---|---|
| AWS Service - Route53 (0) | 2026.04.02 |
| AWS Service - VPC Peering (0) | 2026.04.02 |
| AWS (0) | 2026.04.02 |
| AWS Load Balancer Controller와 SVC 연결 실습 (0) | 2026.04.01 |