2025. 3. 5. 12:03ㆍAWS
오늘은 제가 만들고 있는 스프링부트 프로젝트를 배포해보도록 하겠습니다!
단계는 크게 1. jar파일 생성하기 2. AWS EC2에 배포하기 로 나뉜다.
jar 파일이란?
JAR(Java ARchive) 파일은 Java에서 사용되는 압축된 파일 형식으로 여러 개의 .class 파일(바이트코드), 리소스(이미지, 설정 파일 등), 메타데이터를 하나의 파일로 묶은 것이다.
1. jar 파일 생성하기
생성되어있는 프로젝트를 열고 Gradle > build > boot.Jar 선택하면 자동으로 빌드가 된다.
아래 결과창에 SUCCESSFUL로 뜨면 성공
내 프로젝트 파일 > build > libs > 생성한 jar 파일 확인
2. AWS EC2에 생성하기
AWS > EC2 에 가서 먼저 인스턴스를 생성해주겠다. 인스턴스 시작 선택
원하는 이름을 작성해준다.
OS로는 우분투 24.04 버전을 선택해주었다.
컴퓨터의 성능인 인스턴스 유형을 선택한다.
나는 프리티어로 사용 가능한 t2.micro를 사용했다.
그 다음 인스턴스에 접근할 수 있는 KEY를 발급받을 것이다.
ssh방식으로 인스턴스에 접근하기 위해서는 .pem을 선택한다.
키 페어 생성을 누르면 .pem 파일로 키가 생성되는데 잃어버리지 않게 잘 보관해둬야 한다!
보안 그룹은 EC2 인스턴스에 대한 방화벽 역할을 하는 규칙 집합이다.
이 보안 그룹에 설정된 규칙에 따라 허용된 트래픽만 EC2 인스턴스로 들어오거나 나갈 수 있다.
인바운드 보안 그룹 규칙은 EC2 인스턴스로 들어오는 트래픽을 허용하는 규칙이다.
기본으로 22번 포트가 허용되고 거기에 나는 8080포트도 추가해주었다.
첫 번째 규칙
유형 | SSH | SSH 프로토콜 사용 (22번 포트) |
프로토콜 | TCP | TCP 프로토콜 사용 |
포트 범위 | 22 | SSH 접속을 위한 기본 포트 |
소스 유형 | 내 IP | 현재 사용자의 공인 IP만 접속 허용 |
이 설정은 현재 내 IP에서만 SSH 접속(22번 포트)을 허용하는 것이다.
즉, 내 컴퓨터에서만 SSH 접속 가능하고, 다른 IP에서는 접속이 차단된다.
두 번째 규칙
유형 | 사용자 지정 TCP | 특정 포트를 열어줌 |
프로토콜 | TCP | TCP 프로토콜 사용 |
포트 범위 | 8080 | 웹 애플리케이션(Spring Boot 등)을 실행하는 포트 |
소스 유형 | 위치 무관 (0.0.0.0/0) | 모든 IP에서 접속 허용 |
이 설정은 모든 IP(0.0.0.0/0)에서 8080 포트로 접속 가능하도록 허용하는 것이다. 웹 애플리케이션(Spring Boot 등)을 실행하면 누구나 접근할 수 있다.
내 스프링부트는 8080포트에서 실행되기 때문에 추가해준 것이다!]
다 지정해주었으니 인스턴스 시작을 선택해서 EC2 인스턴스 생성을 마무리해준다.
3. EC2에 접속하기
이제 우리가 만든 EC2 인스턴스에 접근해서 배포해보도록 하자
우리가 생성한 인스턴스에 마우스 오른쪽을 클릭 > 연결 선택하면 인스턴스에 연결할 수 있는 방법이 나온다.
iTerm에서 아까 다운로드 받아놨던 키페어(.pem 파일)가 있는 곳으로 이동한다.
chmod 400 petlogkey.pem
EC2 KEY에 400권한을 부여한다.
이렇게 하면 파일 소유자는 읽기 권한만 가지고 그룹 및 기타 사용자는 접근할 수 없기 때문에 파일을 수정하거나 실행할 수 없고 읽기만 가능하게 된다.
그 다음 인스턴스 연결 방법에서 내가 A라고 표시해 놓은 예시 명령어를 입력한다.
우리가 만든 키페어로 접속하는 것이다.
처음 접속하면 안내문구가 뜨는데 yes를 입력하면 된다.
ubuntu 접속이 완료된 iterm 화면이다!
현재 이 bash는 내 컴퓨터가 아닌 내가 만든 EC2 컴퓨터에 접속이 되어있는 중이다.
sudo apt update
sudo apt install openjdk-17-jre-headless
이 컴퓨터에 위 명령어를 입력해서 java(jvm)을 설치해준다.
이제 EC2 컴퓨터에 .jar 파일을 가져와야한다.
iterm을 하나 더 켜서 .jar파일이 저장된 곳으로 이동해준다.
chmod 400 petlogkey.pem
scp -1 {내 .pem키} {내 .jar파일 경로} {EC2 컴퓨터 경로}:{EC2컴퓨터에 저장할 경로}
scp -i petlogkey.pem ~/PetLog-0.0.1-SNAPSHOT.jar ubuntu@ec2.ap-northeast-2.compute.amazonaws.com:~/
다시 400권한을 준 다음 jar파일을 이동시켜준다.
정상적으로 이동되었다면 저장한 EC2 컴퓨터의 경로에 잘 들어와있는 것이 보일 것이다!
sudo java -jar {.jar파일 이름}
sudo java -jar PetLog-0.0.1-SNAPSHOT.jar
이제 이 파일을 jvm을 통해 실행하면 서버에 보일 것이다.
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'petController' defined in URL [jar:nested:/home/ubuntu/PetLog-0.0.1-
SNAPSHOT.jar/!BOOT-INF/classes/!/com/petlog/petService/pet/PetController.class]: Unsatisfied dependency
expressed through constructor parameter 1: Error creating bean with name 'jwtUtil': Injection of autowired dependencies failed
그런데 이때 오류 발생!
나는 jwt토큰을 이용했는데 그 때 사용할 secretkey가 설정되어있지 않아서 나는 오류다.
JWT_SECRET_KEY={내 secret-key} java -jar {jar파일 이름}
JWT_SECRET_KEY=A1B1C2 java -jar PetLog-0.0.1-SNAPSHOT.jar
환경변수를 설정해줄 수도 있지만 일단 배포되는지만 확인할 거기때문에 위 명령어를 입력해서 애플리케이션 실행 시에만 호다닥 설정해주었다. 그리고 다시 jvm을 실행해주면 문제 없이 실행이 완료된다!
그리고 브라우저를 열고 아까 인스턴스의 A 부분에 있는 숫자 부분 예를 들어 1-10-100-10 부분을 .으로 바꿔 입력한 후 포트번호까지 입력해주면 서버에 잘 접속이된다. 참고로 저 숫자 부분은 퍼블릭 IPv4 주소이다.
'AWS' 카테고리의 다른 글
리액트 AWS S3 + CloudFront로 배포하기 - 1. S3, CloudFront 설정 (0) | 2025.03.31 |
---|---|
빌드할 때 Cannot find a Java, JAVA_HOME이 공란인 오류 해결하기 (0) | 2025.03.06 |
Spring Boot 애플리케이션 AWS EC2에 배포하기 (Git Clone + JAR 실행) (0) | 2025.03.05 |
AWS S3에 이미지 저장하기 - 2. IAM 사용자 생성 및 권한 설정하기 (0) | 2025.02.19 |
AWS S3에 이미지 저장하기 - 1. S3 버킷 만들기 (0) | 2025.02.19 |