본문 바로가기
Spring boot

AWS EC2인스턴스에 Spring Boot 서버 배포하기

by 리버🐦‍🔥 2024. 4. 30.

앞서 포스팅한 “Github Actions를 활용한 CI”과 마찬가지로 실습 위주의 포스팅을 진행하도록 하겠다.

본 포스팅에서는 AWS의 EC2를 통해 Spring boot 서버 배포를 다룬다.

(CodeDeploy에 대한 내용은 다음 포스팅에서 다루도록 하겠다.)

서버 배포 순서

  1. AWS에서 EC2 인스턴스 생성
  2. 탄력적 IP 설정
  3. 보안 그룹 설정
  4. SSH 클라이언트(iterm)으로 서버 접속
  5. SSH를 통해 EC2 인스턴스에 Spring Boot 서버 띄우기

CD(Code Deploy) 순서

  1. AWS EC2에 Tag 설정
  2. AWS EC2에 IAM 설정
  3. 서버에 CodeDeploy Agent 설치
  4. AWS S3 생성
  5. AWS CodeDeploy 전용 IAM 역할 생성
  6. AWS CodeDeploy Application 생성 및 배포 설정
  7. Github Actions의 사용자 권한 추가
  8. App Spec 작성
  9. 배포 스크립트(start.sh, stop.sh) 작성 & build.gradle 파일 수정
  10. Github Actions Workflow 작성
  11. Github에서 push로 배포 확인

 

서버 배포

1. AWS에서 EC2 인스턴스 생성

1. AWS 지역 설정(지역에 따라서 인스턴스 위치가 결정된다. 따라서, 우리나라에서 서비스한다면 “아시아 태평양 (서울)”로 설정하면 된다.

2. EC2에서 새 인스턴스 생성

3. 애플리케이션 및 OS 이미지(AMI) & 인스턴스 유형 선택

4. 키 페어 생성

5. 네트워크 & 스토리지 선택

6. 인스턴스 설정 요약 확인

7. 인스턴스 생성 완료

2. 탄력적 IP 설정

1. EC2 인스턴스는 서버를 재실행하면 퍼블릭 IP가 변경되어서 클라이언트가 항상 동일한 IP로 접근하기 위해 탄력적 IP 설정이 필요하다. 아래 사진을 보면 탄력적 IP가 아직 설정되어있지 않은 것을 볼 수 있다.

2. 탄력적 IP 메뉴 들어가기

3. 탄력적 IP 주소 생성

4. 탄력적 IP 주소에 인스턴스 연결

5. 인스턴스 정보에서 탄력적 IP 연결 확인

3. 보안 그룹 설정

1. 보안 그룹 → 보안 그룹 생성

2. 보안 그룹 이름, 설정 정보 기입

3. 인바운드 규칙 설정(저자의 경우 SSH, HTTP, HTTPS, 8080만 설정)

4. 아웃바운드 규칙은 기본설정 그대로

5. 보안 그룹 생성

6. 인스턴스의 보안 그룹 변경

    a. 작업 → 보안 → 보안 그룹 변경

    b. 이전에 설정해놓은 보안 그룹 추가 및 저장

    c. 인스턴스 정보에서 보안 그룹 설정 확인

4. SSH 클라이언트(iterm)으로 서버 접속

1. 인스턴스 정보에서 연결을 클릭하여 인스턴스 연결 페이지로 이동

2. SSH 클라이언트에 나온 순서대로 터미널에 입력(key가 있는 디렉토리 위치에서 실행해야 한다.)

  • “Operation timed out”이라는 오류가 난다면 보안그룹이 설정이 되지 않은거니 보안그룹 설정으로 이동해 인바운드 규칙을 설정한다. → 본인의 경우 (ssh, tcp, http, https만 설정)
  • 혹시라도 이전과 같은 탄력적 IP를 재사용 할 때는 아래와 같은 에러가 뜰 수 있다.

  • 이럴 때에는 ~/.ssh 디렉토리 내부에 있는 known_hosts를 지우고 다시 명령어를 쳐주면 정상적으로 실행된다.

3. 정상적으로 실행되는 서버 확인

4. (Optional) 호스트로 등록해서 간편하게 접속하기

    키 페어를 ~/.ssh/config에 등록하여 설정한 호스트로 ssh를 간편하게 접속할 수 있다.

    a. 키 페어를 ~/.ssh/config 디렉토리로 이동

cp {키 페어 파일 이름}.pem ~/.ssh/

    b. 키 페어 파일 권한 변경

chmod 600 {키 페어 파일 이름}.pem

    c. vi ~/.ssh/config 파일 생성 후 내용 작성

$ vi ~/.ssh/config 
# 아래는 파일 내용 
Host {원하는 호스트 이름} 
User {유저 이름} 
HostName {탄력적 IP} 
IdentityFile {키 페어 파일 위치}

    d. ssh 호스트로 인스턴스 접근

ssh -i {키 페어 파일} {유저 이름}@{탄력적 IP}

    e. 접속 성공

 

5. SSH를 통해 EC2 인스턴스에 Spring Boot 서버 띄우기

1. EC2 인스턴스에 JDK 설치

# EC2 인스턴스 
sudo apt-get update 
sudo apt-get install openjdk-17-jdk # 필자의 경우 jdk 17을 사용


2. Spring boot 프로젝트 클린 빌드 후 EC2 인스턴스로 복사 & 전송

# Spring boot 프로젝트가 있는 로컬(EC2 인스턴스 X) 
# gradle을 사용해도 되지만 모든 컴퓨터에서 동일한 결과를 얻기 위해 gradlew 명령어를 사용 
./gradlew clean build

# Spring boot 프로젝트가 있는 로컬(인스턴스 X)
# 컴퓨터 -> ssh로 빌드 파일 복사 및 이동
scp ./build/libs/{생성된 스냅샷 이름}.jar {ssh 호스트 명}:/home/ubuntu

3. EC2 인스턴스에서 스냅 샷이 위치한 디렉토리로 이동하여 아래 명령어를 실행

# EC2 인스턴스
cd ~ # 스냅 샷이 위치한 디렉토리로 이동
java -jar {복사된 스냅 샷}.jar

4. EC2에서 설정해놓은 퍼블릭 IP 또는 DNS로 접근이 되는지 확인

http://{탄력적 IP}로 접속하면 서버에 정상적으로 연결이 되어야 한다.