image:
repository: <account>.dkr.ecr.ap-northeast-2.amazonaws.com/myrepo
tag: "1.2.3"
pullPolicy: IfNotPresent
imagePullSecrets: [] # EKS+노드 Role이면 비워둠, 필요시 ['ecr-secret']
📌 ECR (Elastic Container Registry)란?
- **AWS에서 제공하는 컨테이너 이미지 저장소(Registry)**예요.
- Docker Hub 같은 퍼블릭 레지스트리 대신, 프라이빗 레지스트리로 안전하게 컨테이너 이미지를 저장하고 관리할 수 있어요.
- CI/CD 파이프라인이나 쿠버네티스에서 이미지를 가져올 때(Pull) 사용됩니다.
-
1) ECR 핵심 개념
- 무엇: Docker/OCI 이미지 저장소(프라이빗/퍼블릭). 저장, 버전(tag) 관리, 스캔, 복제 지원.
- 형식: xxxxx.dkr.ecr.<region>.amazonaws.com/<repo>:<tag>
- 인증 방식: 짧게 유효한(기본 12시간) 토큰 기반. AWS IAM 권한으로 토큰을 받아 docker/login 수행.
2) 쿠버네티스에서 ECR 쓰는 3가지 패턴
A. EKS(Managed K8s on AWS) — 권장
EKS 워커노드(EC2)의 IAM Role(인스턴스 프로파일) 로 kubelet이 ECR 토큰을 받아 자동 인증합니다.
즉, imagePullSecrets 없이도 잘 동작하도록 되어 있어요(최근 EKS AMI/containerd는 ECR Credential Provider가 기본 포함/연동).
-노드 IAM 정책 예시(최소 권한 샘플):
{
"Version": "2012-10-17",
"Statement": [
{ "Effect": "Allow", "Action": ["ecr:GetAuthorizationToken"], "Resource": "*" },
{ "Effect": "Allow", "Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer",
"ecr:DescribeImages"
], "Resource": "arn:aws:ecr:<region>:<account-id>:repository/<repo>"
}
]
}
매니페스트는 그냥 ECR 이미지를 참조
containers:
- name: app
image: <account>.dkr.ecr.ap-northeast-2.amazonaws.com/myrepo:1.0.0
CI/CD 파이프라인 예시(GitHub Actions → ECR → EKS)
name: build-and-deploy
on: [push]
jobs:
build:
runs-on: ubuntu-latest
permissions:
id-token: write # OIDC로 AWS에 페더레이션
contents: read
steps:
- uses: actions/checkout@v4
- name: Configure AWS Credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::<account-id>:role/gha-oidc-ecr
aws-region: ap-northeast-2
- name: Login to ECR
run: |
aws ecr get-login-password --region ap-northeast-2 \
| docker login --username AWS --password-stdin <account>.dkr.ecr.ap-northeast-2.amazonaws.com
- name: Build & Push
run: |
REPO=<account>.dkr.ecr.ap-northeast-2.amazonaws.com/myrepo
TAG=${{ github.sha }}
docker build -t $REPO:$TAG .
docker push $REPO:$TAG
echo "IMAGE=$REPO:$TAG" >> $GITHUB_OUTPUT
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: azure/setup-kubectl@v4
- name: Update image
run: |
kubectl set image deploy/my-app my-app=${{ needs.build.outputs.IMAGE }}
📌 쿠버네티스 + ECR 연결 과정
쿠버네티스에서 Pod을 띄우려면 컨테이너 이미지를 가져와야 하잖아요?
이때 이미지가 ECR에 저장되어 있다면, 쿠버네티스가 ECR에 접근할 수 있도록 인증을 해줘야 합니다.
ECR에 이미지 Push
docker build -t <ECR_URI>:tag .
docker push <ECR_URI>:tag
쿠버네티스에서 인증용 Secret 생성
aws ecr get-login-password --region ap-northeast-2 \
| kubectl create secret docker-registry ecr-secret \
--docker-server=<ECR_URI> \
--docker-username=AWS \
--docker-password-stdin
Pod/Deployment에서 secret 참조
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: <ECR_URI>:tag
imagePullSecrets:
- name: ecr-secret