일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 정보처리기사필기요약
- 자바
- 프론트엔드
- 프로그래머스 SQL
- select문
- Linux
- 반복문
- SQL
- html
- 메서드
- JavaScript
- StringBuilder
- String클래스
- 자바스크립트
- github
- for문
- 형변환
- 입출력
- Java
- DML
- 프로그래머스 sql 고득점 kit
- order by
- select
- 정보처리기사
- 개발자
- 클래스
- 백준
- 데이터 조회
- sql문
- 웹개발
- scanner
- MySQL
- Git
- 백엔드
- BufferedReader
- 알고리즘
- 프로그래밍
- 예외처리
- 리눅스
- where
- Today
- Total
ToBe끝판왕
[ AWS ] SpringBoot 프로젝트 AWS EC2 인스턴스 WAR 배포 정리 본문
💡 AWS EC2 서버 인스턴스를 하나 구매해서 서버 배포해보기 !
※ EC2Amazon EC2는 Amazon Web Services(AWS)의 클라우드 컴퓨팅 서비스 중 하나이다.
EC2는 Elastic Compute Cloud의 약자로, 가상서버를 제공하여 사용자가 필요에 따라 확장하거나
축소할 수 있는 유연한 컴퓨팅 환경을 제공한다.
※ 인스턴스인스턴스는 Amazon EC2에서 실행되는 가상 서버이다. 하나의 VM이라고 이해해도 무방하다.
원하는 운영체제(OS)를 선택할 수 있으며, 용량, 성능, 스토리지 등을 설정할 수 있다.
인스턴스는 고유한 식별자인 인스턴스 ID를 가지며, IP 주소와 DNS 이름을 할당받아
네트워크에 연결된다.
✅ AWS 세팅하기
1) 인스턴스 시작
▶️ AWS 홈페이지
• AWS 홈페이지에서 지역은 아시아 태평양(서울) 로 지정
• AWS 에서 EC2 항목으로 들어간다.
• [ 인스턴스 시작 ] 버튼 클릭
▶️ 인스턴스 생성
• 생성할 EC2 인스턴스의 이름을 정해주는 항목
• 프리티어가 제공되는 OS인 Ubuntu LTS 선택
※ 인스턴스 유형은 프리티어를 사용하고 있다면 t2.micro 로 설정해주셔야 합니다.다른 유형으로 설정하면
과금요소가 추가됩니다.
▶️ 키페어 생성
• EC2에 원격으로 접속하기 위한 필수 요소
• 한번 다운로드 받으면 재다운로드가 불가하므로 잘 보관하여야 함
• 키페어 생성을 눌러 이름과 설정을 하고 다운로드를 받도록 한다.
※ Windows 환경에서 Putty를 통해 EC2 인스턴스에 연결하기 위해선 .ppk 형식의 키페어 필요
▶️ 네트워크 및 스토리지 세팅
• 보안 그룹은 추후에 따로 생성해서 세팅해줄 예정이니 넘어갑니다
• SSH 통신으로 선택하며 이곳저곳에서 접속하기 위해서 IP 위치무관으로 선택
• 프리티어는 최대 30 GIB 까지 지원해주므로 30으로 설정해줍니다.
(옆의 어드밴스드 탭에서 상세 설정이 가능합니다.)
• 볼륨 유형은 범용 SSD 로 선택
❗ 만약 Provisioned IOPS SSD (프로비저닝된 IOPS SSD) 를 선택한다면 사용하지 않아도 활성화한 기간만큼
계속 비용이 발생하게 되므로 프리티어를 사용한다면 주의가 필요하다.
▶️ 인스턴스 최종 생성 및 확인
• [ 인스턴스 시작 ] 버튼 누르고 최종적으로 인스턴스 생성
• 인스턴스가 생성된것을 AWS 홈페이지 인스턴스에서 확인 가능하다.
※ 자신이 선택한 항목들이 적용되었는지 간단히 확인
2) 보안그룹 수정
💡 보안그룹이란 ?
- 인바운드 규칙 ( Inbound )
: 외부에서 EC2 나 RDS 등의 내부로 접근할때 사용되는 방화벽 규칙
- 아웃바운드 규칙 ( Outbound )
: EC2나 RDS 등의 내부에서 외부로 접근할때 사용되는 방화벽 규칙
▶️ 보안그룹 생성
• EC2에 접속해서 서버를 띄울것 이기 때문에 인바운드 규칙만 세팅하도록 한다.
• 아웃바운드 규칙 추가를 눌러 아래 사진과 같이 규칙을 추가한다.
• 스프링부트 기반 프로젝트이므로 포트번호를 8080으로 설정하고 url을 누구나 접근할 수 있도록
[ Anywhere-Ipv4 ] 로 설정
• SSH , HTTP , HTTPS 도 [ Anywhere-Ipv4 ]로 설정한다.
▶️ 보안그룹 설정
• EC2 인스턴스 페이지에 접속하여 위 [ 작업 ] 버튼 -> [ 보안 ] 탭 -> 보안그룹 변경을 누른다.
• 보안그룹 변경에서 [ 보안그룹 선택 ] 을 눌러 내가 생성해놓은 보안그룹을 선택
• 해당 보안그룹을 누르고 기존에 설정되어 있던 보안그룹은 제거하고 [ 저장 ] 버튼 클릭
3) Putty로 EC2 인스턴스 연결
▶️ PuTTY 설치
• Windows에서 우리가 만든 EC2 인스턴스 ( = 가상 임대컴퓨터 )에 접속하기 위해서는 PuTTY 라는 프로그램이 필요
• 아래 경로에서 msi 설치 파일을 받아 PuTTY 를 설치 ( 64-bit x86 설치 )
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
• PuTTY 파일을 실행
• Host Name( or IP address ) 안에 ubuntu@퍼블릭 IP DNS 이름 의 형식으로 기재
※ 퍼블릭 IP DNS 이름 은 AWS 인스턴스에서 해당 인스턴스를 클릭하면 하단에 나오게 된다.
• [ SSH ] -> [ Auth ] -> [ Credentials ] 에서 다운받은 ppk를 검색하여 넣어준다.
• [ Session ] 으로 돌아와 해당 연결정보에 부여할 별칭을 만들고 [ Save ] 를 누른다.
• 앞으로 해당 별칭을 사용하여 Load 가능
• [ Open ]을 눌러 연결하면 [ PuTTY Security Alert ] 팝업창이 뜨고 [ Accept ] 를 클릭
• 아래와 같이 나왔다면 정상적으로 접속이 완료된 것이다.
4) 배포하기
💡 배포하기
※ Jar 와 War 배포 차이
- JAR Java 애플리케이션 패키징
• JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일
• Class ( Java 리소스 , 속성 파일 ) , 라이브러리 파일을 포함하고 있다.
• JRE ( Java Runtime Environment ) 만 있어도 실행 가능하다.
- WAR Java 웹 애플리케이션 패키징
• Servlet / JSP 컨테이너에 배치할 수 있는 웹 애플리케이션 압축한 파일
• 웹 관련 자원을 포함한 ( JSP , Servlet , JAR , Class , XML , HTML , JavaScript )
• 사전 정의된 구조를 사용 ( WEB-INF , META_INF )
• 별도의 웹서버( WEB ) 혹은 웹 컨테이너 ( WAS ) 필요
※ War 와 Jar 개념 및 특징
https://baby9235.tistory.com/140#google_vignette
▶️ 로컬 PC에서 스프링부트 프로젝트 War 파일 생성
❗ 보통 SpringBoot 프로젝트의 경우 Jar ( 내장톰캣 사용 ) 파일 배포를 하지만 필자의 경우
SpringBoot + JSP 템플릿을 사용하였으므로 Jar를 사용할 경우 JSP 를 가져오지 못하기 때문에
War 파일 배포로 방법을 정했다.
- build.gradle 설정
• 플러그인 war 설정을 확인 ( 없을 경우 플러그인 추가 )
plugins {
// war 플러그인 추가
id 'war'
}
• war 배포시 파일명 지정
war {
archiveBaseName= "파일명"
archiveFileName="파일명.war"
}
- SpringBoot Application 설정
• SpringBootServletInitializer 상속 여부 확인
• configure 메서드 오버라이딩
💡 SpringApplicationServletInitializer 는 무엇이며 왜 상속받는걸까 ?
스프링부트 웹 애플리케이션을 배포할 때, 주로 Tomcat 이 내장된 Jar 방식을 사용한다.
하지만 War로 배포를 진행해야 하는 경우 SpringApplicationServletInitializer 을 상속받아
진행하게 된다.
스프링 웹 애플리케이션을 외부 Tomcat 에서 동작하게 하기 위해서는 web.xml에
애플리케이션 컨텍스트를 등록해야 한다. 이는 Apache Tomcat 이 구동될 때
/WEB-INF 디렉터리에 존재하는 web.xml을 읽어 웹 애플리케이션을 구성하기 때문이다.
web.xml 이 없는 SpringBoot 프로젝트의 경우, 외부 Tomcat에서 동작하게 하기 위해서
WebApplicationInitializer 인터페이스를 구현한 SpringApplicationServletInitializer 을
상속받는것이 필요하다.
package com.wsd.MyApp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class MyAppApplication extends SpringApplicationServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyAppApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyAppApplication.class, args);
}
}
- War 파일 생성
• InteliJ 우측의 Gradle > Tasks > build > war 실행
• 프로젝트 디렉터리 위치의 /libs/{파일명}.war 생성 확인
▶️ 인스턴스 접속 ( Java 설치 / Tomcat 설치 )
• PuTTY로 인스턴스 접속
• ubuntu 아래 명령어를 입력하여 Java 설치
• 배포할려는 프로젝트는 Java 17 사용
❗ 특정한 패키지를 다운 받기 전 apt 업데이트를 함으로써 설치 가능한 리스트를 업데이트 한다
( 최신 싱크 맞추기 )
// apt 업데이트
sudo apt-get update
// java 설치
sudo apt-get install openjdk-17-jdk
// java 버전 확인
java -version
• 프로젝트의 spring-boot-starter-tomcat 라이브러리의 버전을 확인한 후 mvnrepository 사이트에 들어가서
해당 라이브러리의 Tomcat 버전을 확인한다. ( 배포 후 버전으로 인한 오류 예방 차원 )
• tomcat 다운로드 페이지에 가서 링크 주소 복사를 해줍니다.
https://tomcat.apache.org/download-10.cgi#10.1.34
• ubuntu 아래 명령어 입력 ( = 주소 복사 + Tomcat 압축 해제 )
// 링크 주소 복사
wget [ 마우스 우클릭 ]
// 톰캣 압축 파일 해제
sudo tar xvfz apache-tomcat-10.1.34.tar.gz
• Tomcat 실행 / 실행 종료 명령어
// Tomcat 폴더 / bin 으로 이동
cd apache-tomcat-10.1.34/bin
// Tomcat 실행
./startup.sh
// Tomcat 실행 종료
./shutdown.sh
▶️ war 파일 이동 및 프로젝트 실행 확인
- FileZila 다운로드
• 배포한 war 파일을 apache-tomcat-10.1.34/webapps 에 옮기기 위해 FileZila 를 사용했다.
아래 링크에 들어가서 FileZila 를 다운로드 받는다.
https://filezilla-project.org/download.php?type=client
- FileZila 실행 및 연결
• FileZila 를 실행하여 왼쪽 상단의 파일 > 사이트관리자 를 클릭하여 연결정보를 입력하여 연결한다.
• 프로토콜 : SFTP - SSH File Transfer Protocol
• 호스트 : AWS 해당 인스턴스 퍼블릭 IPv4 DNS
• 로그온 유형 : 키 파일
• 사용자 : ubuntu
• 키 파일 : 저장해놓은 .ppk 키페어
- WAR 파일 이동
• 해당 프로젝트 디렉터리/build/libs 디렉터리 안에 있는 WAR 파일 확인
• 해당 WAR 파일의 이름을 ROOT.war 로 변경해준다.
• 우측 Tomcat 폴더/webapps 안으로 ROOT.war 를 이동한다. ( 드래그 앤 드롭 )
• webapps 안에 WAR 파일과 WAR파일이 해제되어 같은 이름의 폴더가 생성되는것을 확인할 수 있다.
- 프로젝트 실행
❗ 해당 URL 를 쳤을때 만약 프로젝트의 웹페이지가 CSS 가 깨지면서 나온다면 아래 자료를 참고하면 된다.
https://baby9235.tistory.com/141
• ubuntu에서 Tomcat 폴더/bin 으로 이동하여 Tomcat을 실행한다.
• 웹브라우저에 [ 할당된 IP 주소:8080/ ] 를 쳐본다.
※ [ IP:8080/ ] URL 로 입력했을 경우 /user/main 이 보이게 redirect 를 시키기 위해서 HomeController 소스 추가
package com.wsd.invest.config;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
/**
* ip:8080/ URL 요청시 메인페이지로 리다이렉트
* @return
*/
@GetMapping("/")
public String redirectMain() {
return "redirect:/user/main";
}
}
👉 프로젝트의 메인 페이지가 정확히 나오는것을 확인할 수 있었다.
'■ Programming Skills > AWS' 카테고리의 다른 글
[ AWS ] AWS 개념 / 클라우드 컴퓨팅 / AWS 이점 (0) | 2022.05.30 |
---|