개발 이야기/인프라

[AWS에 Spring 초간단 배포하기] SSH 접속 및 Spring 배포

제이온 (Jayon) 2022. 4. 30.

 

안녕하세요? 제이온입니다.

 

초보자를 대상으로 하는 [AWS에 Spring 초간단 배포하기]의 세 번째 시간은 SSH 접속 이후 스프링을 배포하는 것입니다. 이전 포스팅을 통해 EC2 세팅은 완료되었다고 가정하겠습니다.

 

SSH 접속하기

SSH는 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 프로토콜을 의미합니다. 즉, SSH를 통해 우리는 이전 시간에 생성한 EC2 인스턴스로 원격 접속을 할 수 있게 됩니다.

 

윈도우

CMD

CMD를 사용하여 SSH 접속할 수 있습니다. 다만, SSH 클라이언트가 설치되어 있어야 합니다.

 

 

윈도우 설정에서 앱 설정의 선택적 기능에 들어갑니다.

 

 

설치된 기능에 OpenSSH 클라이언트가 이미 존재한다면 넘어가도 되고, 그렇지 않으면 [기능 보기] 버튼을 클릭하여 OpenSSH 클라이언트를 설치합니다.

 

 

이후 EC2 인스턴스에 접속할 pem 키가 존재하는 디렉토리 경로로 이동한 다음, [터미널에서 열기]를 눌러 줍니다. 그리고 아래 명령어를 실행하면 SSH 접속이 완료됩니다.

 

ssh -i [pem 파일 경로] [계정]@[탄력적 IP]

 

예를 들어, ssh -i KEY-TEST.pem ubuntu@13.xxx.xx.xx 을 입력하면 됩니다. EC2 ubuntu AMI의 기본 계정은 ubuntu로 설정이 되어 있습니다.

 

Git Bash

개인적으로 윈도우 환경에서는 Git Bash를 사용하여 SSH 접속을 하는 편입니다. 혹시 Git이 깔려 있지 않다면 해당 링크를 통해 설치해 주시길 바랍니다.

 

 

동일하게 pem 키가 존재하는 디렉토리 경로로 이동한 다음, Git bash를 실행하여 위의 SSH 명령어를 입력하면 됩니다.

 

MAC

MAC은 pem 키가 존재하는 디렉토리 경로로 이동한 다음, 기본 터미널을 실행하여 위의 SSH 명령어를 입력하면 됩니다.

 

스프링 배포하기

어느 방식이 되었든, SSH를 통해 원격 접속이 완료되었다면 본격적으로 스프링을 배포해 봅시다.

 

Java 설치

$ sudo apt update
$ sudo apt install default-jre
$ sudo apt install default-jdk

 

소스 코드 빌드 및 실행

// 배포할 소스 코드 clone
$ git clone [임의의 Repository]
$ cd <clone한 Repository가 있는 경로>

// Build
$ sudo chmod +x gradlew
$ ./gradlew clean build -x test

// Run
$ find ./* -name "*jar"
$ java -jar [jar 파일명] &

 

EC2 프리티어는 인스턴스 유형을 t2.micro밖에 사용할 수 없고, 해당 유형의 스펙은 싱글 코어 및 1GB의 RAM이므로 java 빌드를 수행할 때 테스트는 생략하는 것이 좋습니다.

 

소스 코드를 Run할 때 & 은 백그라운드로 실행한다는 명령어입니다.

 

예제

저는 AWS 테스트 용으로 개발한 초미니 Repository를 클론하여 배포해 보겠습니다. 어떠한 Spring 프로젝트를 사용하든 상관 없습니다.

 

다만 배포하실 프로젝트의 데이터베이스가 필요하다면, EC2 내부에서 main/resources/application.yml를 별도로 정의해야 합니다. AWS에서 데이터베이스를 제공하는 RDS 서비스 설정 및 스프링에서 RDS 연동하는 방법이 궁금하시다면 해당 포스팅을 참고하시길 바랍니다.

 

 

jar 파일은 Repository 이름이 들어가 있고, plain이 붙지 않은 파일로 선택하여 실행하면 됩니다.

 

$ curl localhost:8080
{"timestamp":"2022-04-29T03:38:12.406+00:00","status":404,"error":"Not Found","path":"/"}

$ curl localhost:8080/api/members
{}

 

구동이 잘 되었는지 확인하기 위해 테스트용 API를 날려 보았습니다. 위와 같이 응답이 오면 배포가 된 것입니다.

 

터미널 외부에서도 탄력적 IP와 같은 public IP를 사용하면, 배포된 스프링 애플리케이션에게 요청을 보낼 수 있습니다.

 

 

nohup 설정

터미널 세션이 끊어지면 백그라운드로 돌던 프로세스에 hang-up signal이 발생하여 종료가 되는 경우가 있습니다. nohup 명령어를 사용하면 터미널 세션이 끊어지더라도 배포 상태를 유지할 수 있습니다.

 

$ nohup java -jar [jar파일명] 1> [로그 파일명] 2>&1  &

 

로그 파일명은 자유롭게 log.txt 와 같이 작성하시면 됩니다.

 

프로세스 종료

// 프로세스 pid 찾기
$ pgrep -f java

// 프로세스 종료
$ kill -2 [PID]

 

정리

SSH 프로토콜을 통해 EC2에 원격 접속하고, 스프링 애플리케이션을 배포해 보았습니다. public IP와 포트 번호를 가지고 외부에서도 스프링 애플리케이션과 통신하게 된 것은 기쁘지만, public IP와 포트 번호를 외워야 한다는 단점이 있습니다.

실제로 우리가 주로 사용하는 네이버나 구글을 보면 naver, google과 같은 '도메인'이라는 것을 사용하며, 포트 번호는 입력하지 않고도 요청을 보낼 수 있습니다.

 

다음 시간에는 IP를 도메인으로 바꾸고, 도메인은 IP로 바꾸는 DNS 기술을 적용해 보겠습니다. 또한, 8080번 포트가 아니라 80번 포트로 요청이 오더라도 8080번 포트로 포워딩하는 방법을 살펴 보겠습니다.

댓글

추천 글