코딩/sparta TIL
CI/CD 구축하기 : ECR 적용
americanoallday
2025. 6. 20. 10:59
✅ 현재 CI/CD 구조 요약 (Before)
📦 구성요소
구성 | 설명 |
Jenkins EC2 | GitHub webhook → 빌드 실행 → SSH로 챗 서버 접속 |
Chat EC2 | 소스 코드 git clone → docker-compose up으로 실행 |
Docker | EC2 내에서 직접 build 후 container 실행 |
배포 방식 | Jenkins → SSH → docker-compose up --build 직접 실행 |
보안 | 빌드 EC2의 SSH 키를 Chat EC2에 등록함 |
🔄 전환 목표: 코드 배포 ❌ → 이미지 배포 ✅
“EC2에 소스코드가 아니라, 빌드된 Docker 이미지만 전달하는 구조로 변경”
✅ 전환 후 CI/CD 구조 (After, 추천 방식)
- Jenkins EC2
- GitHub push 트리거
- Docker build → Docker tag → Docker push to ECR
- Chat EC2
- docker-compose.yml에 image: <ECR URL>만 명시
- Jenkins가 SSH 접속해서 docker-compose pull && up -d 만 실행
🛠️ Amazon ECR 적용 방법 (Step-by-Step)
1️⃣ Jenkins EC2에 AWS CLI 설치 + 인증 설정
✅ AWS CLI v2 설치 (Ubuntu 전용)
# 1. 필요한 패키지 설치
sudo apt update
sudo apt install -y unzip curl
# 2. AWS CLI v2 설치 파일 다운로드
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# 3. 압축 해제
unzip awscliv2.zip
# 4. 설치
sudo ./aws/install
# 5. 설치 확인
aws --version
# 6. 도커 설치
sudo apt install -y docker.io
# Docker 서비스 자동 시작 설정 및 시작
sudo systemctl enable docker
sudo systemctl start docker
출력 예시:
aws-cli/2.15.3 Python/3.11.8 Linux/5.15.0-1052-aws exe/x86_64.ubuntu
⚙️ 설정 (필요 시)
AWS CLI를 사용하려면 IAM 사용자 자격 증명이 필요합니다:
aws configure
입력:
- AWS Access Key ID: AKIA...
- AWS Secret Access Key: ....
- Default region name: us-west-2
- Default output format: json (또는 text)
더보기
이 값들은 **AWS IAM 사용자(계정)**를 통해 발급받는 API 자격 증명입니다. 아래 순서대로 진행하면 됩니다:
✅ [1] IAM 사용자 생성 및 액세스 키 발급 방법
- AWS 콘솔 접속 → https://console.aws.amazon.com/
- 로그인
- 우측 상단 메뉴에서 “IAM” 서비스 검색 → 클릭
- 왼쪽 메뉴에서 사용자 선택 → 사용자 추가 클릭
- 사용자 이름 입력 (예: jenkins-user)
- 액세스 유형:
- ✅ 프로그래밍 방식 액세스만 체크
- 권한 설정:
- “기존 정책 직접 연결” 탭에서 다음 정책 추가:
- AmazonEC2FullAccess (EC2 작업 가능)
- AmazonECRFullAccess (ECR 작업 가능)
- CloudWatchLogsFullAccess (필요 시)
- “기존 정책 직접 연결” 탭에서 다음 정책 추가:
- 다음 → 다음 → 사용자 만들기
- 완료 화면에서 다음 두 값이 표시됨:
- ✅ Access Key ID → 예: AKIA...
- ✅ Secret Access Key → 예: abcd...
- ⚠️ 이 값은 한 번만 보여지니 복사해두세요
✅ [2] EC2 인스턴스에서 AWS CLI 설정
aws configure
입력 예시:
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
2️⃣ ECR 리포지토리 생성
aws ecr create-repository --repository-name cluvr-chat --region us-west-2
aws ecr create-repository --repository-name cluvr-batch --region us-west-2
aws ecr create-repository --repository-name cluvr-api --region us-west-2
aws ecr create-repository --repository-name cluvr-noti --region us-west-2
→ 출력된 repositoryUri 예시:
123456789012.dkr.ecr.us-west-2.amazonaws.com/cluvr-chat
3️⃣ Jenkins EC2에 Docker 로그인 스크립트 추가
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com
💡 Jenkinsfile 내에서 이 명령을 build 후 push 전에 넣으면 됨
4️⃣ Jenkinsfile 수정 (Docker 이미지 빌드 + ECR 푸시)
pipeline {
agent any
environment {
AWS_REGION = 'ap-northeast-2'
ECR_REGISTRY = '123456789012.dkr.ecr.ap-northeast-2.amazonaws.com'
ECR_REPO = 'cluvr-chat'
IMAGE_TAG = 'latest'
}
stages {
stage('Build Docker Image') {
steps {
sh '''
docker build -t $ECR_REPO:$IMAGE_TAG .
docker tag $ECR_REPO:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPO:$IMAGE_TAG
'''
}
}
stage('Push to ECR') {
steps {
sh '''
aws ecr get-login-password --region $AWS_REGION \
| docker login --username AWS --password-stdin $ECR_REGISTRY
docker push $ECR_REGISTRY/$ECR_REPO:$IMAGE_TAG
'''
}
}
stage('Deploy to Chat EC2') {
steps {
sh """
ssh -i /var/lib/jenkins/.ssh/id_rsa ubuntu@<CHAT_EC2_IP> << 'EOF'
docker-compose pull
docker-compose up -d
EOF
"""
}
}
}
}
5️⃣ Chat EC2 세팅
- docker-compose.yml에서 build: 제거하고 image:로 대체
services:
chat:
image: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/cluvr-chat:latest
ports:
- "8080:8080"
...
- EC2가 ECR pull 가능하려면:
- EC2가 ECR read 권한 있는 IAM Role을 갖고 있거나
- EC2에서 aws configure로 로그인해야 함
✅ 최종 구조 요약
항목 | Before | After |
코드 전달 방식 | Jenkins → SSH → git pull | Jenkins → ECR 이미지 Push |
EC2 역할 | 빌드 + 실행 | 실행 전용 |
docker-compose | build: 포함 | image: 사용 |
장점 | 빠르게 구현 가능 | 안정적, 보안 강화, 운영자/개발자 분리 가능 |