코딩/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, 추천 방식)

  1. Jenkins EC2
    • GitHub push 트리거
    • Docker buildDocker tagDocker push to ECR
  2. Chat EC2
    • docker-compose.ymlimage: <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 사용자 생성 및 액세스 키 발급 방법
  1. AWS 콘솔 접속https://console.aws.amazon.com/
  2. 로그인
  3. 우측 상단 메뉴에서IAM” 서비스 검색 → 클릭
  4. 왼쪽 메뉴에서 사용자 선택 → 사용자 추가 클릭
  5. 사용자 이름 입력 (예: jenkins-user)
  6. 액세스 유형:
    • 프로그래밍 방식 액세스만 체크
  7. 권한 설정:
    • “기존 정책 직접 연결” 탭에서 다음 정책 추가:
      • AmazonEC2FullAccess (EC2 작업 가능)
      • AmazonECRFullAccess (ECR 작업 가능)
      • CloudWatchLogsFullAccess (필요 시)
    •  
  8. 다음 → 다음 → 사용자 만들기
  9. 완료 화면에서 다음 두 값이 표시됨:
    • 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: 사용
장점 빠르게 구현 가능 안정적, 보안 강화, 운영자/개발자 분리 가능