[Web] 최종프로젝트(9) 스프링 부트와 EC2 연결 및 배포 (+Filezila) java 17

hyewon jeong·2023년 3월 3일
0

web

목록 보기
10/24

1. ⚡️EC2 인스턴스 생성

1-1. AWS Region 설정

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_18_38_44.png

우선 위치를 서울로 설정합니다.

리전에 따라서 인스턴스 위치가 결정되기 때문에 외국으로 하면 속도가 낮을 수도 있습니다.

만약 대한민국이 아닌 다른 나라에 서비스 하려면 그 도시를 선택해도 됩니다.

1.2. EC2 메뉴로 이동

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_18_41_13.png

처음에 대시보드가 나올텐데 만약 EC2 서비스를 찾기 힘들다면 검색해서 들어갑니다.

1.3. 새 인스턴스 생성

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_18_34_30.png

인스턴스 메뉴로 들어가 인스턴스 시작 버튼을 클릭합니다.

1.4. Amazon Machine Image(AMI) 및 인스턴스 유형 선택

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_04_30_03_12_44.png

AMI 는 어떤 서버로 구성할지 선택하는 겁니다.

여러 종류가 있어서 원하는 걸 선택하면 되고, 저는 프리 티어에 Ubuntu LTS 버전을 선택했습니다.

인스턴스 유형은 프리 티어를 사용한다면 다른 선택권이 없습니다.

스펙이 좋을수록 과금이 더 많이 되기 때문에 처음부터 좋은걸 고르기보다는 작게 시작했다가 스케일업 해나가는 걸 추천드립니다.

💡 반드시 Ubuntu 20.04 LTS 를 선택하시기 바랍니다. 최신 버전에서는 자동배포에 사용하는 툴인 CodeDeploy가 제대로 동작하지 않을 수 있습니다!

1.5. 키 페어 생성

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_04_30_03_29_30.png

키 페어는 EC2 서버에 SSH 접속을 하기 위해 필수라서 생성해야 합니다.

"새 키 페어 생성" 을 눌러 원하는 이름을 적고 생성합니다.

위 그림처럼 설정 후 생성하면 자동으로 my-key.pem 파일이 다운되며, SSH 환경에 접속하기 위해서는 해당 키 파일이 존재하는 위치로 가서 ssh 명령어를 실행하면 됩니다.

한번 다운받은 후에는 재다운 받을 수 없기 때문에 안전한 곳에 저장해둡니다.

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_04_30_03_34_29.png

생성한 후에는 이렇게 키 페어를 선택하면 됩니다.

1.6. 네트워크 및 스토리지 선택

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_04_30_03_39_54.png

네트워크 설정은 EC2 에 접속을 허용하는 ACL 을 생각하면 됩니다.

나중에 "보안 그룹" 이라는 걸로 별도 설정을 할 예정이기 때문에 SSH 트래픽만 허용해줍니다.

위 설정대로 하면 SSH 트래픽 접속 가능한 IP 가 내 IP 로 자동 설정 됩니다.

프리티어는 최대 30 까지 지원하기 때문에 해당 부분만 변경해줍니다.

볼륨 유형은 범용 SSD 로 선택해야 합니다.

만약 Provisioned IOPS SSD (프로비저닝된 IOPS SSD) 를 선택한다면 사용하지 않아도 활성화한 기간만큼 계속 비용이 발생하게 됩니다.

1.7. 인스턴스 설정 요약

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_04_30_03_53_57.png

다 설정하면 우측에 간단하게 지금까지 설정한 인스턴스 요약이 뜹니다.

이상한 부분이 없다면 인스턴스 시작을 눌러서 생성하면 됩니다.

1.8. 인스턴스 생성 완료

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_19_19_54.png

처음 화면으로 돌아오면 이렇게 인스턴스가 생성된 것을 확인할 수 있습니다.

이제 탄력적 IP 와 보안 그룹을 추가하기 위해 인스턴스 ID 를 클릭합니다.

(2) 보안그룹 등록 / 기존꺼는 삭제하기

2. ⚡️ 탄력적 IP (Elastic IP)

AWS EC2 인스턴스는 서버를 중지하고 다시 실행시키면 퍼블릭 IP 가 변경되기 때문에 클라이언트가 사용할 수 있는 변하지 않는 IP 가 필요합니다.

탄력적 IP (Elastic IP) 란 외부에서 인스턴스에 접근 가능한 고정 IP 입니다.

탄력적 IP 는 만들어놓고 사용하지 않더라도 과금이 되기 때문에 필요한 만큼만 생성하는 것이 중요합니다.

자세한 설명은 AWS Docs - 탄력적 IP 에서 확인하실 수 있습니다.

우선, 진짜 퍼블릭 IP 가 변경하는지 한번 확인해봅시다.

현재 생성된 인스턴스의 정보입니다.

퍼블릭 IP 로 3.35.238.69 가 할당된 것을 확인할 수 있습니다.

  • 탄력 ip : 사용하지 않더라도 비용발생 단점

2-1. 탄력적 IP 메뉴 접근


메뉴에서 탄력적 IP 를 찾아서 들어갑니다.

아직 아무것도 할당받은 게 없기 때문에 새로운 IP 를 추가합니다.

2-2. 새로운 탄력적 IP 할당


딱히 변경할 건 없고 바로 할당을 선택해서 만들어줍시다.

2-3. 탄력적 IP 주소 선택

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_22_04_35.png

방금 생성한 탄력적 IP 를 선택해서 연결을 시도합니다.

2-4. 인스턴스 선택 및 연결

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_22_05_33.png

설정 화면에 들어가면 현재 내 인스턴스 목록을 선택할 수 있고 연결된 프라이빗 IP 까지 선택 가능합니다.

2-5. 인스턴스 정보 확인

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_22_07_58.png

탄력적 IP 를 연결하고 다시 인스턴스 정보를 확인해보면 IP 가 할당된 것을 볼 수 있습니다.

퍼블릭 IP 주소도 기존 값에서 탄력적 IP 주소로 자동으로 변경되었습니다.

3. ⚡️터미널창에서 ssh로 ec2접속하기

    1. 키페어 있는 폴더로 이동 cd Desktop
    2. sudo ssh -i [키파일] ubuntu@퍼블릭키주소 하기 
    3. yes
    4.컴터 비밀번호 
    ubuntu 연결~~ 

호스트 등록해서 간편하게 접속

4. ⚡️보안 그룹 설정

보안 그룹은 AWS 에서 제공하는 방화벽 모음입니다.

서비스를 제공하는 애플리케이션이라면 상관 없지만 RDS 처럼 외부에서 함부로 접근하면 안되는 인스턴스는 허용된 IP 에서만 접근하도록 설정이 필요합니다.

  • 인바운드 (Inbound): 외부 -> EC2 인스턴스 내부 허용
  • 아웃바운드 (Outbound): EC2 인스턴스 내부 -> 외부 허용

4.1. 현재 보안 그룹 확인

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_16_22_51_44.png

인스턴스 정보의 보안 탭에서 현재 설정된 보안 그룹을 확인할 수 있습니다.

처음 인스턴스를 생성할 때 아무런 보안 그룹을 설정하지 않았기 때문에 default 값만 들어가있습니다.

인바운드 규칙 해석해보면 22번 포트의 모든 IP 에 대해서 TCP 연결을 허용한다는 의미입니다.

SSH 접속을 위해 22번 포트는 기본으로 설정해준 것 같네요.

이제 새로운 보안 그룹을 만들어 봅시다.

4.2. 보안 그룹 ID 리스트 확인

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_17_00_02_06.png

인스턴스에서 보안 그룹 ID 를 보고 들어갈 수도 있지만 메뉴에서 직접 들어가면 이렇게 보안 그룹 ID 리스트를 볼 수 있습니다.

보안 그룹은 인스턴스와 별개로 존재하기 때문에 한번 만들어두면 새 인스턴스를 생성해도 한번에 적용할 수 있습니다.

우측 상단의 "보안 그룹 생성" 버튼을 눌러서 새 보안 그룹을 만들어봅시다.

4.3. 보안 그룹 생성

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_17_00_28_46.png

먼저 보안 그룹의 이름과 설명을 추가하고 인바운드 규칙과 아웃바운드 규칙을 편집합니다.

4.4. 인바운드 규칙

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_17_01_54_03.png

인바운드는 외부에서 EC2 로 요청할 때 허용할 IP 대역을 설정할 수 있습니다.

원하는 규칙을 추가하려면 "규칙 추가" 버튼을 누릅니다.

유형을 먼저 선택하면 자동으로 그에 맞는 프로토콜과 포트 범위가 고정됩니다.

웬만한 유형들이 이미 존재하기 때문에 편하게 설정할 수 있습니다.

우선 로컬 PC 에서 서버에 접속할 수 있게 SSH 를 추가하고 소스를 내 IP 로 추가합니다.

"소스" 를 선택하면 우측에 알아서 IP 가 추가되며, 특정 IP 나 대역을 넣으려면 "사용자 지정" 으로 추가할 수 있습니다.

만약 여러 사람이 함께 작업하는 프로젝트라면 각각의 로컬 PC IP 를 전부 추가해줘야 합니다.

SSH, HTTP, HTTPS 와 같은 기본 포트들을 열고 스프링 부트 프로젝트트까지 사용자 지정으로 추가해줍니다.

4.5. 아웃바운드 규칙

아웃바운드 규칙은 딱히 설정할 필요 없기 때문에 "모든 트래픽" 그대로 둡니다.

4.6. 인스턴스에서 보안 그룹 변경

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_17_02_04_12.png

다시 인스턴스로 돌아와서 "보안 그룹 변경" 버튼을 눌러줍니다.

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_17_02_06_30.png

방금 생성한 MySecurityGroup 을 추가해줍니다.

보안 그룹은 여러 개를 동시에 설정할 수 있기 때문에 기존에 설정된 launch-wizard-1 보안 그룹은 제거해줍니다.

4.7. 변경된 보안 그룹 확인

https://github.com/ParkJiwoon/PrivateStudy/raw/master/ci-cd/images/screen_2022_01_17_02_09_06.png

다시 인스턴스 설정을 보면 보안 그룹이 적용된 것을 볼 수 있습니다.

만약 제대로 보이지 않는다면 새로고침을 한번 해주세요

5. ⚡️배포파일을 올리기 전에 생성한 EC2 인스턴스에 자바 프로젝트 구동을 위한 JDK를 설치하기

SSH로 접속한 상태에서 아래와 같이 명령어를 쳐서 설치하면 된다.

sudo apt-get update // 동기화한번 해주가
sudo apt-get install openjdk-8-jdk // 자바 8 설치
java -version //버전 확인 (나오면 설치된 것)

나의 경우는 17 버전임으로 17로 설치해야한다.
1. 적용
① sudo 권한으로 apt 업데이트하고 openjdk v17을 설치한다.

      -$ sudo apt update
      -$ sudo apt install openjdk-17-jdk

② 설치한 java 버전을 확인한다.

 - $ java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+7-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 17.0.3+7-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)
cs

③ 설치된 java 경로를 확인한다.

리눅스 명령어중 해당 파일의 경로를 알려주는 명령어는 which 입니다

jdk 설치후 java의 경로를 알고 싶을때는 which 명령어를 사용하시면 됩니다

ex)  which java 

혹시 나오지 않는다면 find를 사용하시면 전체를 다 뒤져줍니다

/usr/bin/java

6. ⚡️다음으로 FileZilla 라는 프로그램을 이용해서 EC2 인스턴스로 배포파일을 전송하기

(1) 인텔리제이 우측 그라들 클릭 -[build]더블 클릭 하면

(2) 좌측 gradle -libs 아래에 .jar파일이 생김

(3) build 밑에 libs를 보면 ~~~.jar 파일이 있다. 이게 빌드된 배포파일이다. EC2에 올려서 실행시키면 서버가 돌아가는 것이다.

AWS에 Spring Boot 프로젝트 배포 2 - EC2 세팅&배포 , 도메인 연결

아래사진은 ec2서버에 프로그램이 올라갔다~~


옮긴 파일이 있는 디렉터리로 이동해서 ls 명령어를 쳐보면

다음과 같이 파일이 정상적으로 옮겨진 것을 확인할 수 있다.

그리고 다시 git bash에서

java -jar 파일이름.jar
우리꺼) java -jar final-8-team-project-0.0.1-SNAPSHOT.jar

쳐주면 익숙한 구동화면이 나오게 된다


~ 성공 기부니째져~~😄

7. ⚡️퍼블릭IP:8080 치고 접속을 해보자!하지만 접속이 안된다..

  • 3차 시도 다시 컴터 끄고 켜서 시작
  • 포스트맨으로 서버연동이 됐는지 check 성공 😍

⚠️ ubuntu java 17 설치 및 설치과정 오류 해결 법

ubuntu@ip-172-31-12-223:~$ ls
8team  final-8-team-project-0.0.1-SNAPSHOT.jar
ubuntu@ip-172-31-12-223:~$ java -jar final-8-team-project-0.0.1-SNAPSHOT.jar
Error: LinkageError occurred while loading main class org.springframework.boot.loader.JarLauncher
	java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/JarLauncher has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
ubuntu@ip-172-31-12-223:~$

17버전 없어서 11 버전 설치 했는데 그게 문제인듯

[IntelliJ Error] Spring boot 개발 중 LinkageError occurred while loading main class _ JAVA 버전으로 인한 에러 - Easy is Perfect

[AWS] EC2 에 Spring boot 올리는 과정 및 삽질 (with java 17 + spring boot3.0)

55 = Java 11
52 = Java 8
61 = Java 17

해결 방법

1. 기존 자바 sdk 제거 ( 명령창)
2. ubuntu 17 버전 설치
3. jar 실행 명령어 
  1. ubuntu 17 버전 설치

Ubuntu JDK(JAVA Development Kit) 17 설치

위의 링크 보고 17버전 설치함
결과

서버 종료 명령어

Ctrl + c 

8. ⚡️ 포트포워딩 및  nohup 무중단서비스 만들기

8-1. 80→8080 포트포워딩 (스프링 부트)

⚠️ 현재 프론트 연결 하지 못해 포스트맨으로 확인 중입니다.

(1)

$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

(2) 다시 서버를 재접속하여 8080을 떼주고 접속해보면,

$ java -jar final-8-team-project-0.0.1-SNAPSHOT.jar

변경 전

변경 후 ( 8080 제거함)

8-2. Nohup 설정

서버를 껐더라도 , 계속 유지 할 수 있도록 설정 함

배포 후 명령어로 서버 구동
java -jar final-8-team-project-0.0.1-SNAPSHOT.jar

(1) 서버를 종료 시킨 후 
ctrl+c 
(2) 무중단서버 실행
sudo nohup java -jar final-8-team-project-0.0.1-SNAPSHOT.jar &

아까 실행시킬 때 수행했던 명령어 앞에 nohup을 붙이고, 뒤에 &을 붙이면 백그라운드에서 실행이 되어, 터미널을 종료해도 EC2상에서는 계속 돌아간다, 뒤에 > /dev/null은 log를 저장하지 않겠다는 뜻이고, 설정하지 않으면 nohup.out으로 저장되는 것으로 알고있다

& 을 붙여서 백그라운드에서 실행하는 이유?
그냥 콘솔창에서 서버를 실행시키면 콘솔창이 하나의 프로그램으로 구동되어 버림으로, 뒷단에 있는 백그라운드를 활용하여 프로그램을 구동시킨다고 하심... 좀더 공부 해볼필요를 느낌 >.<ㅎ
nohup 확인

그리고 나서

ps -ef

해주면 test.sh가 떠있는걸 확인할 수 있다.

8-3. 프로세스 종료

이제 nohup으로 백그라운드에서 실행중인 프로세스를 종료시켜보자!

  1. PID를 알고있다면

sudo kill -9 {PID}
명령어를 이용하여 프로세스를 중단시키면 되고,

  1. PID를 잊어버렸다면

ps -ef | grep {실행시켰던 파일이름}

🎈참고
스파르타코딩클럽 강의 자료

profile
개발자꿈나무

0개의 댓글