열공스토리

[AWS] AWS EC2에 Docker로 스프링부트 프로젝트 배포하기 본문

AWS

[AWS] AWS EC2에 Docker로 스프링부트 프로젝트 배포하기

열쩡열쩡열쩡_ 2024. 10. 24. 15:48

Docker Compose에 포함된 스프링부트 프로젝트를 AWS EC2 서버에 배포해 보았습니다.

EC2 인스턴스 생성

1. 이름 및 태그

인스턴스의 이름과 태그를 설정합니다.

 

2. AMI 설정

운영체제는 우분투를 선택했습니다. 여기서 문득, 다른 개발자 블로그들을 보면 ec2 운영체제를 선택하는 부분에서 대부분 우분투를 선택하는 데 그 이유가 궁금해졌습니다. 그래서 찾아본 결과,

1. 우분투는 리눅스의 배포판이므로 리눅스의 기능들을 사용할 수 있다.

2. 오픈소스 소프트웨어와 호환이 잘 되기 때문에 웹 서버, 데이터베이스, 애플리케이션 서버 등의 설치와 운영에 최적화 되어 있다.

정도로 정리할 수 있었습니다. (이외에도 다른 이유들이 있겠지만 그러한 부분들은 다음에 제대로 활용해 보면서 찾아봐야 겠다고 생각했습니다.)

 

3. 인스턴스 유형

인스턴스 유형은 프리티어 기본 값인 t2.micro를 선택해 주었습니다.

 

4. 키 페어 생성

키 페어는 ec2 인스턴스에 접속할 때 사용되는 암호 키입니다. 또, 키 페어는 공개 키와 개인 키가 한 쌍으로 이루어져 있다고 합니다.

위와 같이 키 페어를 생성해 주었습니다.

5. 네트워크 설정

네트워크 설정에서는 보안 그룹을 생성하여 접속 가능한 IP 주소를 설정해 줍니다. 저는 어떤 네트워크에서든 접속할 수 있도록 설정하였습니다.

 

처음에는 기존에 RDS의 데이터베이스를 생성할 때 만들어 둔 보안 그룹을 그대로 사용하려고 했으나, 생각해 보니 RDS는 ec2 서버에서만 접속이 가능해야 하고 ec2는 외부에 공개 되어야하므로 그 역할이 다르다는 것을 알아차리고 ec2 서버에 대한 새로운 보안 그룹을 만들어 주었습니다.

 

6. 스토리지 구성

프리 티어 최대 용량인 30GB로 설정했습니다.

 

위 단계에 걸쳐 인스턴스를 생성해 주면,

이렇게 인스턴스가 생성된 것을 확인할 수 있습니다.

 

7. 보안 그룹 설정

보안 그룹의 인바운드 규칙을 위와 같이 추가해 주었습니다.

 

HTTPS 통신과 HTTP 통신은 사용자가 브라우저를 통해 접속할 수 있도록 모든 외부 IP를 허용하도록 설정했고 SSH는 접근 허용 IP 주소를 수정하여 집에서만 접근할 수 있도록 설정 했습니다.

 

추가적인 설명을 보태면, 배포하려는 스프링부트 프로젝트는 현재 Nginx를 프록시 서버로 사용하고 있어서 Nginx 포트를 통해서만 서비스를 제공받을 수 있도록 인바운드 규칙을 추가했습니다.

 

EC2 서버 접속

1. EC2 서버 접속

인스턴스 연결을 참고하여 아래와 같이,

(1) 터미널을 열고

(2) 발급 받은 키 페어 (.pem)파일이 존재하는 디렉토리 위치로 이동해서

(3) 키 페어 파일에 대해 400 권한을 준 다음,

(4) ec2 서버에 접속합니다.

Docker를 이용하여 EC2 서버에 프로젝트 배포

1. Docker Compose 빌드

[Dockerfile]

# 베이스 이미지 설정
FROM amazoncorretto:17 AS builder

# Gradle 및 소스 코드 복사
WORKDIR /app
COPY . .

# Gradle 빌드 실행 (테스트 제외)
RUN ./gradlew clean build -x test

# 최종 이미지
FROM amazoncorretto:17

# 작업 디렉토리 설정
WORKDIR /app

# 빌드된 JAR 파일 복사
COPY --from=builder /app/build/libs/*.jar app.jar

# 컨테이너가 실행될 때 Java 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "app.jar"]

 

[docker-compose.yml]

version: "3.8"

services:
  redis:
    image: redis:latest # :latest 태그(명시하지 않아도 default 값)는 가장 최신 안정 버전을 의미함(redis:6.2.6는 redis 6.2.6 버전을 의미)
    ports:
      - 6379:6379

  spring_boot:
    image: devhub
    build: .
    expose:
      - 8080 # 컨테이너 내부에서만 해당 포트를 인식하게끔 하는 속성. 즉, 다른 컨테이너에서는 8080으로 통신이 가능하지만, 외부에서는 8080으로 접근할 수 없음
    volumes:
      - /data/DevHubProject:/data/DevHubProject # ec2 환경
    depends_on:
      - redis  # redis 컨테이너가 먼저 올라간 다음 nginx가 올라가도록 설정

  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d # nginx/conf.d 폴더를 컨테이너 내부의 /etc/nginx/conf.d로 마운트
    depends_on:
      - spring_boot

Dockerfile과 docker-compose.yml 파일을 작성하고

 

docker-compose build

위 명령어로 도커 컴포즈 파일을 빌드하면

위와 같이 이미지 도커 이미지가 생성된 것을 확인할 수 있습니다. (docker compose 빌드 테스트)

 

2. ec2 서버에 Docker 설치

# docker의 공식 GPG 키 추가:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# apt 소스에 저장소 추가:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# docker 관련 플러그인 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

[공식 문서]를 참고하여 docker를 설치해 줍니다. (docker compose 플러그인 포함)

 

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

 

docker가 정상적으로 설치 됐는지 테스트도 해주고

 

# 도커 그룹에 사용자 추가
sudo usermod -aG docker $USER

# 변경사항 적용 (새로고침)
newgrp docker

docker 명령을 실행할 때, docker 데몬(docker 백그라운 서비스)에 접근이 가능하도록 docker 그룹에 사용자를 추가해 항상 관리자 권한으로 docker 명령을 실행할 수 있도록 설정해 줍니다.

 

3. ec2 서버에서 docker compose로 프로젝트 실행

git clone {레포지토리 URL}

이제, 깃허브 저장소에 올려놓은 프로젝트를 ec2 서버에 클론하고

 

# format
scp [옵션] [pem파일 경로] [송신 파일 경로] [호스트 이름]@[퍼블릭 DNS]:[파일 수신 경로]

위 형식에 맞춰, scp 명령으로 개인 pc에 있는 서버 설정 파일을 ec2서버에 전송해 주었습니다. (application.yml 파일은 gitignore로 깃허브에 올라가지 않게 막아두었기 때문에 해당 작업이 필요했습니다.)

 

# 프로젝트 내부에 docker-compose.yml 파일 위치로 이동
cd ~/devhub-server

# docker compose 실행
docker compose up

그리고 프로젝트 내부에 docker-compose.yml 파일 위치로 이동한 다음 docker compose 명령을 입력하면…

 

스프링부트가 정상적으로 실행되고

스프링부트를 포함한 nginx, redis 3개의 컨테이너가 잘 띄어지고

브라우저로 접속할 수 있게 됩니다!

 

이로써 docker를 이용하여 aws ec2 서버에 스프링부트 프로젝트 배포가 되었습니다.

 

 

 

다음 목표

1. HTTPS 통신을 위한 SSL 인증서 적용

2. 도메인 연동

3. CI/CD를 구축하여 배포 자동화 (GitHub Action)
+ Active Profile을 설정하여 개발 환경 설정과 배포 환경 설정 분리

참고

 

SpringBoot 프로젝트 EC2 배포하기

깃헙에 있는 프로젝트를 AWS EC2에 git clone을 통해 내려받아 jar 파일 빌드를 해보겠습니다.(EC2 인스턴스는 우분투로 진행합니다. 또한 따로 배포 시스템을 구축하지 않고 수동으로 배포하는것만

velog.io

 

'AWS' 카테고리의 다른 글

[AWS] 스프링부트 프로젝트에 AWS RDS 연동하기  (0) 2024.10.24