AWS에서 VPC, EC2, Jenkins, GitHub, Docker, ECR을 활용한 CI/CD 파이프라인 구축 가이드

Ma_Seokjae·2025년 2월 14일
0

1️⃣ VPC 설정 (Virtual Private Cloud)

Jenkins 서버를 AWS EC2에서 운영하려면, 우선적으로 네트워크 환경(VPC, 서브넷 등)을 구성해야 합니다.

📌 VPC 생성

  1. AWS 콘솔 → VPC → "VPC 생성" 클릭
  2. VPC 설정
    • 이름 태그: TempDev-VPC
    • IPv4 CIDR 블록: 10.0.0.0/16 (VPC 내부 네트워크 범위 설정, 기본적으로 넓게 설정)
    • IPv6 CIDR 블록: 없음 (IPv6 사용하지 않을 경우)
    • 테넌시: 기본
    • VPC 생성 클릭

📌 서브넷 생성

VPC 내부에서 EC2 인스턴스가 위치할 서브넷을 만들어야 합니다.

(1) 퍼블릭 서브넷

  • 외부 인터넷과 직접 통신하는 서브넷
  • Jenkins를 실행할 EC2 인스턴스가 위치

설정 방법:

  1. VPC 대시보드 → 서브넷 → "서브넷 생성" 클릭

  2. 퍼블릭 서브넷 설정

    • 이름 태그: TempDev-Public-Subnet
    • VPC 선택: TempDev-VPC
    • IPv4 CIDR 블록: 10.0.1.0/24
    • 가용 영역: ap-northeast-2a (AWS 서울 리전 선택)
    • 서브넷 생성 클릭

📌 인터넷 게이트웨이 생성 및 연결

퍼블릭 서브넷의 EC2 인스턴스가 인터넷과 연결되려면 인터넷 게이트웨이(IGW)가 필요합니다.

  1. VPC 대시보드 → 인터넷 게이트웨이 → "인터넷 게이트웨이 생성" 클릭

  2. 이름 태그: TempDev-IGW

  3. 생성 후 "VPC 연결" → TempDev-VPC 선택 → 연결 클릭


📌 라우팅 테이블 생성 및 설정

인터넷 게이트웨이를 사용하도록 라우팅 테이블(Route Table)을 수정합니다.

  1. VPC 대시보드 → 라우팅 테이블 → "라우팅 테이블 생성" 클릭

  2. 설정

    • 이름 태그: TempDev-Public-RT
    • VPC 선택: TempDev-VPC
    • 라우팅 테이블 생성 클릭
  3. 라우팅 테이블 → 경로 편집

    • 대상(Target): 0.0.0.0/0
    • 대상(Target) 값: TempDev-IGW
  4. 하위 네트워크 연결 → TempDev-Public-Subnet 선택 → 연결 클릭

이제 TempDev-Public-Subnet에 있는 EC2 인스턴스가 인터넷과 통신할 수 있음


2️⃣ EC2 인스턴스 생성 및 설정

VPC가 설정되었으니 이제 Jenkins를 실행할 EC2 인스턴스를 생성합니다.

📌 EC2 인스턴스 생성

  1. AWS 콘솔 → EC2 → "인스턴스 시작" 클릭

  2. 기본 설정

    • 이름: Jenkins-Server
    • 애플리케이션 및 OS 이미지 (AMI): Ubuntu 22.04 LTS (Amazon Linux 2도 가능)
    • 인스턴스 유형: t3.micro (메모리와 CPU 고려)

    • 키 페어 생성 및 선택: jenkins-server-key.pem (SSH 접속을 위한 키 생성)
    • 네트워크 설정
      • VPC 선택: TempDev-VPC
      • 서브넷 선택: TempDev-Public-Subnet
      • 퍼블릭 IP 자동 할당: 활성화
    • 보안 그룹 설정 (새 보안 그룹 생성)
      • SSH (22)Anywhere (0.0.0.0/0)
      • HTTP (80)Anywhere (0.0.0.0/0)
      • HTTPS (443)Anywhere (0.0.0.0/0)
      • Jenkins (8080)Anywhere (0.0.0.0/0)

📌 EC2 인스턴스 접속 및 기본 설정

EC2 인스턴스를 실행한 후, SSH로 접속하여 기본적인 설정을 진행합니다.

  1. SSH 접속 (저는 VSCode로 ssh 연결을 했습니다.)

     ssh -i jenkins-key.pem ubuntu@your-ec2-public-ip
  2. 패키지 업데이트

    sudo apt update && sudo apt upgrade -y

3️⃣ Jenkins 및 Docker 설치 (볼륨 설정 포함)

EC2에서 Jenkins를 실행하려면 Java와 Docker가 필요하며, Jenkins 데이터를 유지하기 위해 볼륨 설정이 필요합니다.


📌 OpenJDK 17 설치 (Jenkins 필수)

sudo apt install -y openjdk-17-jdk

설치 후 확인

java -version

출력 예시:

openjdk version "17.0.9" 2024-01-16

📌 Docker 및 Docker Compose 설치

Ubuntu 서버에서 Docker를 설치하고 실행할 수 있도록 설정하는 과정입니다.

sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER

🚀 설정 적용 방법

  • 로그아웃 후 다시 로그인하거나
  • 아래 명령어 실행
    newgrp docker

설치 후 확인

docker --version

출력 예시:

Docker version 24.0.5, build ced0996

📌 Jenkins 데이터 유지 (볼륨 설정)

Docker 볼륨 방식 (추천)

Jenkins 데이터를 유지하려면 Docker 볼륨을 사용하는 것이 가장 좋습니다.

docker volume create jenkins_home

Jenkins 컨테이너 실행 (Docker 볼륨 방식)

docker run -d \
  --name jenkins \
  -p 8080:8080 -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:lts

📌 로컬 디렉토리 마운트 방식

Docker 볼륨이 아니라 EC2 내 로컬 디렉토리를 사용하고 싶다면:

mkdir -p ~/jenkins_home
chmod 777 ~/jenkins_home

Jenkins 컨테이너 실행 (로컬 디렉토리 방식)

docker run -d \
  --name jenkins \
  -p 8080:8080 -p 50000:50000 \
  -v ~/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:lts

📌 Jenkins 초기 비밀번호 확인 및 웹 UI 접속

실행 중인 Jenkins 컨테이너 확인

먼저 실행 중인 Jenkins 컨테이너가 있는지 확인하세요.

docker ps | grep jenkins

출력 예시:

b2345c8a9b2f  jenkins/jenkins:lts  "/sbin/tini -- /usr/..."  Up 2 minutes  8080/tcp, 50000/tcp  jenkins

여기서 jenkins 컨테이너가 정상적으로 실행 중인지 확인합니다.


컨테이너 내부에 접근 (Bash 쉘 실행)

docker exec -it jenkins bash
  • it인터랙티브 모드로 실행
  • jenkins컨테이너 이름
  • bashBash 셸을 실행

🚀 이제 Jenkins 컨테이너 내부로 접속되었습니다!


Jenkins 초기 비밀번호 확인

컨테이너 내부에서 아래 명령어를 실행하세요.

cat /var/jenkins_home/secrets/initialAdminPassword

출력 예시:

615fe9574f824b92868f0a7a4d922956

📌 이 비밀번호를 복사해서 http://your-ec2-public-ip:8080에서 Jenkins 로그인 화면에 입력하면 됩니다.


컨테이너에서 빠져나오기

비밀번호를 확인한 후, 컨테이너에서 나가려면 아래 명령어를 입력하세요.

exit

이제 다시 EC2 터미널로 돌아옵니다. 🚀


🔹 요약

  1. 실행 중인 Jenkins 컨테이너 확인 → docker ps | grep jenkins
  2. 컨테이너 내부 접속 → docker exec -it jenkins bash
  3. 초기 비밀번호 확인 → cat /var/jenkins_home/secrets/initialAdminPassword
  4. 컨테이너 종료 → exit

🔹 웹 UI 접속

  • http://your-ec2-public-ip:8080 접속
  • 출력된 비밀번호를 입력하여 로그인
  • "Install suggested plugins" 선택 후 설치 진행

정리

단계명령어
1. OpenJDK 17 설치sudo apt install -y openjdk-17-jdk
2. Docker 설치sudo apt install -y docker.io
3. Docker 서비스 시작sudo systemctl start docker
4. 서버 재부팅 시 자동 실행 설정sudo systemctl enable docker
5. 사용자 권한 추가 (sudo 없이 Docker 사용)sudo usermod -aG docker $USER
6. 설정 적용newgrp docker 또는 로그아웃 후 재접속
7. Docker 볼륨 생성 (Jenkins 데이터 유지)docker volume create jenkins_home
8. Jenkins 컨테이너 실행 (볼륨 방식)docker run -d -p 8080:8080 -v jenkins_home:/var/jenkins_home ...
9. Jenkins 초기 비밀번호 확인sudo cat /var/jenkins_home/secrets/initialAdminPassword
10. 웹 UI 접속http://your-ec2-public-ip:8080

이제 Jenkins가 EC2에서 Docker 컨테이너로 실행됩니다


4️⃣ GitHub → Jenkins 연동 (Webhook 설정 및 빌드 트리거 구성)

Jenkins에서 GitHub 저장소의 Jenkinsfile을 읽어와 Test → Build → Docker 이미지 Push까지 수행하는 파이프라인을 구축합니다.


📌 4.1 Jenkins 플러그인 설치

GitHub과의 원활한 연동을 위해 아래 플러그인을 설치합니다.

  1. Jenkins UI 접속
    • http://your-jenkins-public-ip:8080
  2. Manage Jenkins → Plugin Manager → Available 탭에서 검색 후 설치✅ 필수 플러그인:
    • Git Plugin
    • Pipeline Plugin
    • Docker Pipeline
    • Amazon ECR Plugin
    • GitHub Branch Source Plugin

설치 후 Jenkins 재시작 (sudo systemctl restart jenkins)


📌 4.2 GitHub Webhook 설정 (자동 빌드 트리거)

GitHub에서 코드가 푸시될 때 Jenkins가 자동으로 빌드를 수행하도록 Webhook을 설정합니다.

  1. GitHub Repository 이동Settings → Webhooks

  2. Webhook 추가

    • Payload URL:
      http://your-jenkins-public-ip:8080/github-webhook/
    • Content type: application/json
    • Trigger: Just the push event
  3. Webhook 생성 후 테스트

    curl -X POST -H "Content-Type: application/json" -d '{}' http://your-jenkins-public-ip:8080/github-webhook/

이제 GitHub에 새로운 코드가 푸시될 때 Jenkins가 자동으로 빌드를 시작합니다!


5️⃣ AWS ECR 설정 및 Docker 이미지 푸시

Jenkins가 Docker 이미지를 빌드하고, AWS ECR에 Push할 수 있도록 설정합니다.


📌 5.1 AWS CLI 설치 및 설정

AWS CLI를 설치하고 Jenkins 서버에서 ECR에 접근할 수 있도록 설정합니다.

sudo apt update
sudo apt install -y awscli
aws configure

✅ 설정할 정보:

  • AWS Access Key & Secret Key 입력
  • Default Region: ap-northeast-2
  • Output Format: json

📌 5.2 AWS ECR 저장소 생성

ECR에서 Jenkins가 푸시할 Docker 이미지 저장소를 생성합니다.

aws ecr create-repository --repository-name my-jenkins-image

✅ 생성된 ECR URL 확인

aws ecr describe-repositories --query "repositories[0].repositoryUri" --output text

출력 예시:

123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-jenkins-image

📌 5.3 Jenkins AWS Credentials 설정

AWS ECR에 접속할 수 있도록 Jenkins에 AWS 인증 정보를 추가해야 합니다.

  1. Jenkins UI 접속Manage Jenkins → Manage Credentials
  2. Global Credentials에서 Add Credentials
    • Kind: AWS Credentials
    • ID: aws-jenkins
    • Access Key & Secret Key 입력
    • Description: AWS ECR Access for Jenkins
  3. 저장 후 확인

이제 Jenkins가 AWS ECR에 인증하여 이미지를 Push할 수 있습니다.


6️⃣ Jenkins Pipeline Job 생성 (GitHub → Jenkinsfile 자동 실행)

Jenkins에서 Pipeline Job을 생성하여 GitHub의 Jenkinsfile을 읽어와 빌드합니다.


📌 6.1 Jenkins에서 New Item 생성

  1. Jenkins Dashboard → New Item
  2. Job 이름 입력 (예: GitHub-CI-CD-Pipeline)
  3. Pipeline 선택 → OK 클릭

📌 6.2 Pipeline Job 설정

  1. General 탭
    • GitHub project 체크 후 GitHub Repository URL 입력
      https://github.com/your-username/your-repo.git
  2. Build Triggers 설정
    • GitHub hook trigger for GITScm polling 체크
  3. Pipeline 설정
    • Definition: Pipeline script from SCM 선택
    • SCM: Git
    • Repository URL:
      https://github.com/your-username/your-repo.git
    • Branch: main 또는 빌드할 브랜치 입력
    • Script Path: Jenkinsfile
  4. 저장 후 Build 실행 (Build Now 클릭)

이제 GitHub 저장소의 Jenkinsfile을 읽어와 실행됩니다.


7️⃣ Jenkinsfile 작성 (Test → Build → Docker Push)

GitHub 저장소에 Jenkinsfile을 작성하여 Jenkins가 읽어오도록 합니다.

📌 Jenkinsfile 예제

pipeline {
    agent any
    environment {
        AWS_REGION = "ap-northeast-2"
        AWS_ACCOUNT_ID = "123456789012"
        ECR_REPO = "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/my-jenkins-image"
    }
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/your-username/your-repo.git'
            }
        }
        stage('Test') {
            steps {
                sh 'echo "Running tests..."'
                sh 'sleep 3'  // 실제 테스트 명령어로 변경
            }
        }
        stage('Build Docker Image') {
            steps {
                script {
                    sh "docker build -t ${ECR_REPO}:latest ."
                }
            }
        }
        stage('Login to AWS ECR') {
            steps {
                script {
                    sh "aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REPO}"
                }
            }
        }
        stage('Push Docker Image') {
            steps {
                script {
                    sh "docker push ${ECR_REPO}:latest"
                }
            }
        }
    }
}

Jenkinsfile 주요 구성

  1. Checkout → GitHub에서 코드 가져오기
  2. Test → 빌드 전에 간단한 테스트 수행
  3. Build Docker Image → Jenkins 서버에서 Docker 이미지 빌드
  4. Login to AWS ECR → AWS ECR 로그인 수행
  5. Push Docker Image → 생성된 Docker 이미지를 ECR로 푸시

8️⃣ 빌드 실행 및 ECR 확인

  1. Jenkins UI에서 "Build Now" 실행

  2. 빌드 성공 여부 확인

    • Console Output에서 docker push 성공 여부 확인
  3. AWS ECR에서 이미지 확인

    aws ecr list-images --repository-name my-jenkins-image

정상적으로 등록되었는지 확인 후, CI/CD 파이프라인 완료! 🎯


🔹 최종 확인 및 정리

작업 내용확인 방법
Jenkins 플러그인 설치Plugin Manager에서 확인
GitHub Webhook 설정Webhook 테스트 (curl)
AWS CLI & ECR 설정aws ecr describe-repositories
Jenkins Credentials 설정Manage Credentials 확인
Jenkins Pipeline 생성New Item → Pipeline 생성
GitHub에 Jenkinsfile 추가git push 확인
빌드 실행 및 확인Jenkins UI에서 빌드 성공 여부 확인
ECR에서 Docker 이미지 확인aws ecr list-images

🚀 마무리

이제 GitHub에 새로운 코드가 푸시될 때마다, Jenkins가 자동으로 실행되어 Test → Build → Docker 이미지 생성 → AWS ECR에 Push까지 자동화됩니다! 🎯

profile
Why not change the code?

0개의 댓글