이전 포스팅에서 CI/CD 구축을 위해서 AWS 프리티어 EC2 서버를 만들어서 SSH로 접속까지 진행했습니다
이번에는 EC2 서버에 필요한 세팅과 RDS를 만들어서 인스턴스와 연동해 보겠습니다
CI/CD 배포 순서
- 코드 수정 후 GitHub에 push (master 브랜치)
- GitHub Actions 작동 → Gradle로 빌드 (.jar 생성)
- Docker 이미지 생성 → DockerHub에 push
- GitHub Actions가 EC2에 SSH로 접속
- EC2에서 deploy.sh 실행 → Docker 이미지 pull & 컨테이너 재시작
- Spring Boot 앱이 EC2에서 실행됨 (8080 포트)
Github Actions Docker,Docker Hub를 이용해서 AWS EC2 서버에 자동으로 빌드 후 배포하는 구조로 CI/CD를 구축해보려고 합니다 서버에 필요한 언어와 도구를 설치합니다
우분투 서버 설정 및 프로그램 설치
1. 인스턴스 SWAP 메모리 설정
프리티어 인스턴스 사양을 보면 기본 RAM 용량이 1GB 밖에 되지 않기 때문에 메모리 부족 문제가 발생하여 서버가 다운되는 경우가 발생될 수 있기 때문에 스왑(SWAP) 메모리 설정으로 가상 메모리를 만들어 RAM 용량을 늘려주도록 하겠습니다
1. 메모리 용량 확인
free -h

메모리 용량을 명령어로 확인해 줍니다
2. 2GB 스왑 파일 생성
sudo fallocate -l 2G /swapfile
또는 아래 명령어로 생성 가능합니다
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

3. Swap 파일 설정 및 적용
# 보안 권한 설정 (chmod 600은 루트만 rw 가능)
sudo chmod 600 /swapfile
# 스왑 영역으로 초기화
sudo mkswap /swapfile
# 스왑 활성화
sudo swapon /swapfile
# 부팅 시 자동으로 스왑 사용되도록 설정
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

다음과 같이 Swap을 설정하고 다시 메모리 용량을 확인해 보면 Swap이 추가된 걸 볼 수 있다

이렇게 메모리를 늘려서 서버가 중간에 다운되지 않도록 방지하였습니다
2. 시스템 업데이트
시스템과 패키지 목록을 최신 상태로 유지 위해서 apt를 업데이트를 진행해 줍니다
리눅스 시스템은 설치된 패키지(프로그램)를 최신 버전으로 업그레이드를 진행하여 보안성과 안정성을 유지하도록 시스템 업데이트를 적용하여 시스템이 최신으로 유지하도록 하는 게 좋기 때문에 되도록이면 처음에 업데이트를 진행
# 패키지 목록을 최신 상태로 갱신
sudo apt update
# 패키지를 최신 버전으로 업데이트 (-y는 모든 yes/no 질문을 yes로 선택)
sudo apt upgrade -y

먼저 패키지 목록을 최신으로 갱신하고 나면 65개의 패키지가 최신 버전이 아니라고 표시되어 있습니다
65개의 패키지를 최신 버전으로 업그레이드하기 위해 아래 명령어를 실행시켜 줍니다

apt 업그레이드 진행 중 이런 창이 표시되었는데 운영체제의 커널이 업데이트되었지만 적용하기 위해서 시스템을 재부팅해야
한다는 안내 메시지였고 OK를 누르고 EC2 인스턴스를 재부팅해주는 작업이 필요합니다

OK 버튼을 누르니까 이런 창이 나왔는데 업데이트된 내용을 적용하기 위해서 일부 서비스를 재시작한다는 내용이었다
기본값 그대로 두고 OK 버튼을 눌러줬습니다

이렇게 많은 작업이 이루어졌고 apt 업데이트는 완료되었습니다

커널 업데이트가 이루어져서 인스턴스 재부팅을 해줍니다
3. Java 설치
EC2 인스턴스 서버에 Spring으로 만든 프로젝트를 배포하여 실행하기 위해서 프로젝트에 사용된 버전의 Java를 설치해 줍니다
저는 17 버전을 사용했기 때문에 17 버전의 jdk를 설치해 줬습니다
sudo apt install openjdk-17-jdk -y

Java 버전 확인 명령어
java -version

4. Docker 설치
CI/CD 배포 구조를 보면 Spring Boot 프로젝트를 Docker 이미지로 패키징하여 해당 이미지를 Docker Hub에 Push 하고 EC2 서버에서 Pull을 통해 실행하는 구조입니다 Docker 이미지로 만들기 위해서 Dcoker를 설치하여 실행 환경을 구축합니다
우분투 OS 도커 설치 메뉴얼
Ubuntu
Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.
docs.docker.com
(공식 문서를 참고하여 설치를 진행했습니다)
1. Docker 패키지 제거
Linux 배포판에서 비공식 Docker 패키지를 제공할 수 있다고 하여 다음 명령어를 통해서 패키지를 제거해 줍니다
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

명령어를 실행하니 비공식 패키지는 설치되어 있지 않아 삭제할 수 없다고 나옵니다
2. Docker 설치 사전 작업
Docker를 설치하기 전에 공식 저장소를 시스템 패키지에 등록하고 필요한 GPG 키를 설정하는 사전 작업을 먼저 진행합니다
sudo apt-get install ca-certificates curl # HTTPS 저장소 GPG 키 다운로드 도구 설치
# Docker 공식 GPG 키를 다운로드하여 신뢰할 수 있는 저장소로 등록
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# Docker의 공식 저장소를 apt에 추가
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 시스템 패키지 업데이트
sudo apt-get update

3. Docker 설치
최신 버전의 Docker를 설치를 진행합니다
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
중간에 [y/n]이 표시되면 y를 눌러 설치를 진행해 줍니다

4. Docker 설치 확인
이미지를 실행하여 Docker가 정상적으로 동작하는지 확인합니다
sudo docker run hello-world

이런 메시지가 출력되면 정상적으로 설치가 된 겁니다
5. 부팅 시 Docker 자동 실행
Spring Boot 프로젝트를 Docker 기반으로 EC2를 운영할 때 만약 서버가 재부팅이 된다면 Docker의 기본설정은 부팅 시에 자동 실행 되지 않도록 되어 있기 때문에 Docker가 실행되지 않아 Spring Boot 컨터이너도 실행되지 않기 때문에 서버가 동작하지 않으며 직접 인스턴스에 접속하여 Docker를 실행하는 명령어를 실행해야 하므로 자동으로 부팅시에 실행되도록 만들어줄 필요가 있다
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
2줄의 명령어를 통해서 부팅 시에도 자동으로 Docker가 실행되도록 설정할 수 있습니다
sudo systemctl disable docker.service
sudo systemctl disable containerd.service
자동 실행을 비활성화하는 명령어입니다
AWS RDS(데이터베이스) 생성
직접 인스턴스에 데이터베이스를 설치하여 진행해도 되지만 AWS의 RDS를 통해서 쉽게 관리하고 사용할 수 있도록 제공하고 있기도 하고 프리티어로 RDS까지 빌려서 사용할 수 있기 때문에 우분투 서버에 설치하지 않고 RDS를 생성하여 인스턴스와 연결해서 사용해 보는 방식으로 하려고 합니다
먼저 AWS의 검색창에 RDS라고 치고 검색하면 나오는 첫 번째 항목을 클릭하여 RDS 생성 페이지로 넘어가 줍니다

생성 페이지로 넘어왔다면 맨 위에 있는 데이터베이스 생성 방식 선택에서 표준 생성을 선택하고 사용할 DBMS를 선택해 줍니다
저는 MySQL을 사용하기 위해서 MySQL을 선택해 줬습니다

DBMS의 에디션과 버전을 설정

템플릿은 프리 티어를 사용하기 위해서 프리 티어를 선택

프리 티어를 선택하면 단일 AZ DB 인스턴스 배포만 활성화되는 걸로 보입니다

DB 인스턴스 식별자: DB 인스턴스 이름
마스터 사용자 이름: root 사용자 이름
마스터 암호: 접속할 때 인증하기 위해 사용되는 암호
위 내용을 적절하게 설정해 줍니다

인스턴스 구성은 버스터블 클래스,db.t4g.micro는 프리 티어로 750시간/월 무료로 사용 가능합니다

스토리지는 프리 티어 기준 20GB까지 무료로 제공되기 때문에 20GB로 설정해 줬습니다
그리고 스토리지 자동 조정은 임계값 초과 후 스토리지를 늘리면 그만큼 비용이 발생되기 때문에 체크 해제 해줍니다

연결은 미리 만들어둔 EC2 인스턴스와 연결하기 위해서 리소스에 연결을 선택
인스턴스는 항목에서 연결할 인스턴스 선택
서브넷 그룹은 기존 항목 선택으로 설정했습니다

기존 DB 서브넷 그룹은 기본값으로 퍼블릭 액세스는 DB 인스턴스에 IP 주소를 할당하여 외부에서 접속이 가능하도록 설정하는 걸로 보입니다 여기서는 아니요만 활성화되기 때문에 아니요로 설정합니다
VPC 보안 그룹은 EC2에 적용했던 보안 그룹을 찾아서 설정


자동 백업은 프리 티어로 운영할 때 스냅샷이 일정량을 초과하면 그만큼 과금이 되기 때문에 비활성화하여 불필요한 과금을 방지합니다

다시 한번 프리 티어를 초과해서 사용하고 있지 않는지 확인하고 데이터베이스 생성을 눌러줍니다

RDS 파라미터 그룹 설정
AWS의 RDS 기본 파라미터 설정으로 사용하게 되면 한글 깨짐이나 이모지 저장 오류,시간 오차등이 발생되기 때문에 직접 수정하여 커스터 마이징한 파라미터 그룹으로 설정해 주는 게 좋습니다
RDS 탭을 보면 파라미터 그룹이 있는데 클릭

파라미터 그룹 생성을 눌러줍니다

- 파라미터 그룹 이름: RDS와 동일하게 적용
- 설명: 파라미터 설명을 작성 (간단하게 Char,time setting으로 작성)
- 엔진 유형: RDS 엔진 유형에 맞춰서 선택
- 파라미터 그룹 패밀리: RDS DBMS 버전에 맞춰서 설정

생성된 파라미터의 세부 정보에 들어가면 우측 상단에 편집 버튼이 있는데 눌러줍니다

다음과 같이 파라미터를 수정해 줍니다
| collation_server | utf8mb4_general_ci | 안정적인 정렬, 대소문자 구분 안 함 |
| time_zone | Asia/Seoul | UTC 시간 오차 방지, 한국 시간 기준 저장 |
| character_set_server | utf8mb4 | 한글, 이모지 저장 |
시간대 설정 (time_zone)
AWS RDS의 기본 시간대는 UTC이기 때문에 Spring Boot 서버가 Asia/Seoul 기준으로 구동된다고 하면 DATETIME 등의 속성에 저장되는 값은 9시간이 느리기 저장되기 때문에 Asia/Seoul로 변경해 줍니다

문자셋 설정 (character_set_server,collation_server)
기본 설정은 한글이 깨지거나 이모지가 저장되지 않기 때문에 utf8mb4으로 설정해줘야 합니다
character_set_server는 "utf8mb4"
collation_server는 "utf8mb4_general_ci"


설정을 완료하고 파라미터 그룹을 RDS에 적용시켜줘야 합니다
생성한 RDS에 상세 정보에 들어가 수정을 눌러줍니다

파라미터 그룹을 생성한 파라미터 그룹으로 지정하고 계속을 눌러 적용

그리고 수정 예약은 즉시 적용으로 바로 적용되도록 하고 수정해 줍니다
로컬 MySQLWorkBench에서 접속
인스턴스에 접속해서 터미널 환경에서 접속해서 관리하는 것보다 GUI 환경에서 사용할 수 있도록 접속하는 환경을 만들어 봅니다
하지만 퍼블릭 액세스가 빌활성화 되어 있어서 인스턴스에서만 접속이 가능한 상태입니다
그래서 일반적인 접속 방법이 아닌 SSH 방식으로 연결할 수 있도록 설정해줘야 합니다
MySQL Workbench 설치 방법 (이전에 포스팅 한 내용입니다)
[MySQL] 윈도우 MySQL & Workbench 설치 방법
MySQL오라클에서 제공하는 데이터베이스 관리 소프트웨어입니다 대용량의 데이터를 관리,운영할때 주로 사용하는데요 MySQL은 교육용 또는 개인용으로는 무료로 사용할수 있습니다 (Community Edition
white63ser.tistory.com
먼저 로컬에 설치되어 있는 MySQL Workbench를 실행시켜 줍니다
MySQL Connections에서 "+" 버튼을 눌러 접속 환경을 설정

그리고 Connection Method를 변경해 줍니다
"Standard TCP/IP over SSH" SSH 방식으로 접속할 수 있도록 설정

- Connection Name: 식별할 이름 (MySQL Connections에 표시되는 이름)
- SSH Hostname: EC2 인스턴스에 할당한 탄력적 IP
- SSH Username: 이것도 식별할 Username
- SSH Password: 이건 pem Key로 접속하기 때문에 설정 X
- SSH Key File: 인스턴스 생성 과정에서 만들었던 pem Key 로컬 경로
- MySQL Hostname: RDS 엔드포인트
- MySQL Server Port: 기본값 3306
- Username: RDS에 설정한 Username
- Password: RDS에 설정한 Password

설정하고 OK 버튼을 누르면 MySQL Connections에 항목이 추가된다

접속을 해보면 잘되는 걸 볼 수 있습니다

CI/CD를 구축하기 전에 필요한 사전 작업을 해주었습니다
DB 설정은 Spring Boot 프로젝트의 applications.properties에서 생성한 RDS로 변경해줘야 합니다
DB 설정도 CI/CD 구축하기 전에 설정해 두어야 나중에 변경할 일이 없기 때문에 먼저 진행했습니다
다음은 본격적으로 GitHub Actions를 이용해서 CI/CD를 구축해 보겠습니다
'DevOps' 카테고리의 다른 글
| [CI/CD] GitHub Actions와 Docker로 AWS EC2서버 CICD 구축 Docker Hub로 관리하고 배포하기 (0) | 2025.05.09 |
|---|---|
| [CI/CD] GitHub Actions CI/CD 구축을 위해 AWS 프리티어 계정 생성 및 EC2 인스턴스 생성하여 SSH 원격연결 (0) | 2025.05.02 |