AWS Lightsail연동

뚜우웅이·2024년 8월 2일

아마존 라이트세일(Amazon Lightsail)은 AWS에서 만든 가상 프라이빗 서버(VPS)다.
라이트세일은 복잡한 EC2에 비해 직관적으로 인스턴스를 생성할 수 있으며 사전에 구성된 번들을 사용한다면 클라우드 구성의 핵심을 이해하지 않고도 애플리케이션, 웹 사이트 및 개발 환경을 빠르게 배포할 수 있다.

서버

사용자가 sbb 서비스를 사용하라면 항상 켜져 있는 서버가 필요하다.
클라우드 시스템이 등장하면서 서버를 구입할 필요 없이 관리할 수 있게 됐다.

인스턴스 생성

인스턴스는 앞서 설명한 서버(하드웨어) 역할을 하는 라이트세일의 서비스를 말한다.


3개월 무료 요금제를 사용할 것이다.

서버 접속 설정

고정 IP 생성

AWS 서버에 접속하려면 고정 IP가 필요하다.

네트워킹 -> 고정 IP 생성 클릭

방화벽 해제하기

sbb 프로젝트는 8080번 포트를 사용해 왔다. 이제는 AWS에 설치할 sbb 서비스를 외부에서 접속할 수 있어야 하므로 이 8080번 포트의 방화벽을 해제하려고 한다.

인스턴스 클릭 - 네트워킹 - 규칙 추가

서버 접속 프로그램 설치

private key 생성

SSH(Secure Shell) 또는 SFTP(SSH File Transfer Protocol) 프로그램으로 서버에 접속하기 위해서는 AWS 계정의 SSH 키가 필요하다. SSH 키는 private key로 서버에 안전하게 접속하기 위해 필요하다.
SSH는 네트워크상의 다른 컴퓨터에 로그인하거나 원격 시스템(서버)의 명령을 수행하는 프로토콜 또는 프로그램을 가리킨다.
SFTP는 SSH 프로토콜 위에서 파일을 안전하게 전송하고 관리하는 역할을 한다. 원격 서버 간에 파일을 업로드하거나 내려 받을 때 SFTP를 사용한다.

계정(이름) -> 계정 - SSH키 - 다운로드 버튼 클릭

mysite.pem으로 이름 변경 후 c 아래에 붙여 넣는다.

SSH 클라이언트 설치

SSH 클라이언트는 SSH 프로토콜을 사용하여 원격 시스템 또는 서버에 접속하여 명령을 실행할 수 있는 프로그램이다. 단말기 역할을 하므로 터미널 프로그램이라고도 한다.

SSH 키를 준비했으므로 SSH 클라이언트를 내려받고 설치할 수 있다.
무료로 사용할 수 있는 MobaXterm을 다운 받는다.

실행 - session - SSH

  • Remote host: 고정 IP 주소 입력
  • username: ubuntu
  • private key: 다운 받은 mysite.pem

설정값을 모두 입력하면 AWS에서 생성한 인스턴스 서버에 접속할 수 있다.

SFTP 클라이언트 설치

sbb 서비스는 JAR 형태로 서버에 배포할 것이다. 즉 배포 파일로 만든 jar 파일을 서버에 전송해야 한다. 이렇게 파일을 서버에 전송하려면 SFTP 클라이언트 프로그램도 별도로 필요하다
FileZilla를 사용한다.

client free 버전을 다운한다.
왼쪽 상단 파일 아래 아이콘 클릭 후 - 새 사이트

이제 파일질라를 통해 특정 파일을 드래그 앤 드롭하거나 마우스 오른쪽 버튼을 눌러 업로드하거나 내려받을 수 있다.

SBB 배포

서버 환경 설정하기

터미널(mobaXterm)을 사용하여 서버에 접속한다.

호스트 이름 변경

sudo hostnamectl set-hostname jumpto
sudo reboot

호스트 이름이 변경 된 것을 확인할 수 있다.

서버 시간 설정

한국 시간(KST)으로 설정하기 위한 명령어

sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

서버에 자바 설치

sudo apt update

먼저 우분투 패키지를 최신으로 업데이트한다.

sudo apt install openjdk-17-jdk

프로젝트 디렉터리 생성

mkdir sbb

SBB 배포파일 생성

Intellij 오른쪽 그래이들 클릭 후 bootJar 더블 클릭


{프로젝트명}/build/libs/위치에 jar 파일 생성

SFTP로 SBB 배포 파일 전송

서버의 /home/ubuntu/sbb 디렉터리로 드래그앤드롭 한다.

MobaXterm을 사용하여 다시 서버에 접속 후 아래 명령어를 입력하여 배포 파일을 실행한다.

cd sbb
java -jar sbb-0.0.1-SNAPSHOT.jar

http://고정IP:8080으로 접속 시 웹 페이지에 접속이 된다

로컬에서 생성한 데이터는 보이지 않는다. 왜냐하면 서버에서도 H2 DB의 데이터 파일인 local.mv.db 파일이 새로 만들어지기 때문이다. 서버에도 다음과 같이 홈 디렉터리에 local.mv.db 파일이 생성된 것을 확인할 수 있다.

서버 스크립트 생성

지금과 같이 실행하면 서버에 접속한 터미널 프로그램을 종료할 경우 SBB 서비스도 중단된다. 이를 방지하기위해서는 백그라운드로 서비스를 실행해야 한다.

SBB 시작 스크립트 작성하기

백그라운드에서 SBB 서비스를 실행하려면 시작 스크립트를 작성해야 한다. 이때 서버에서는 nano 편집기를 사용해야 한다. nano 편집기란 리눅스 기반 OS에서 사용할 수 있는 간단한 터미널 텍스트 편집기이다.

MobaXterm에서 sbb 디렉터리로 이동

nano start.sh
#!/bin/bash

JAR=sbb-0.0.1-SNAPSHOT.jar
LOG=/home/ubuntu/sbb/sbb.log

nohup java -jar $JAR > $LOG 2>&1 &

JAR 변수는 배포 파일 이름이고, LOG 변수는 로그를 출력할 파일 이름이다. start.sh에서 nohup는 프로세스를 실행한 터미널의 연결이 끊어지더라도 프로세스가 지속적으로 동작 할 수 있게 해주는 명령어이고, 이어서 java -jar $JAR 변수에 저장된 JAR 파일을 실행하라는 명령어이다. 명령어 > $LOG는 자바로 실행된 프로세스의 출력을 로그 파일에 저장하라는 의미이다. 2>$1은 오류 출력(stderr)을 일반 출력(stdout)으로 전달하라는 의미이다.
따라서 일반 로그와 오류 로그가 모두 sbb.log 파일에 저장될 것이다. 그리고 마지막의 & 기호는 백그라운드로 명령을 실행하라는 의미이다.

Ctrl + O를 누른 후, 'File Name to Write:' 프롬프트가 등장하면 Enter를 눌러 저장한다. 그리고 Ctrl + X를 눌러 편집기를 종료한다.

편집기를 빠져나와 start.sh라는 스크립트명만 입력하더라도 실행될 수 있도록 실행 권한을 부여한다.

chmod +x start.sh

start.sh 파일을 실행하여 백그라운드로 서버 실행

./start.sh

SBB 중지 스크립트 작성

nano stop.sh

stop.sh

#!/bin/bash

SBB_PID=$(ps -ef | grep java | grep sbb | awk '{print $2}')

if [-z "$SBB_PID"]
then
	echo "SBB is not running"
else
	kill -9 $SBB_PID
    echo "SBB stopped"
fi

SBB_PID는 현재 실행 중인 SBB 서비스의 프로세스 아이디이다. 프로세스 아이디는 이와 같이 ps 명령어와 grep 그리고 awk 명령어를 조합하여 찾을 수 있다.
ps -ef 명령은 현재 실행 중인 프로세스 출력
grep java | grep sbb 명령은 출력된 문자열에서 java와 sbb라는 문장이 포함된 프로세스만 필터링 하여 출력
awk '{print $2}' 명령은 출력 문자열의 2번째 항목인 프로세스 아이디만 뽑아내는 역할을 한다.
만약 SBB 서비스의 프로세스가 없다면 "SBB is not running" 메시지를 출력, 프로세스가 있다면 kill - 9 명령문으로 해당 프로세스를 강제 종료한다.

chmod +x stop.sh
./stop.sh

jar 파일 업데이트시 아래 명령어를 순서대로 실행

./stop.sh
./start.sh

서버 환경으로 분리

SBB 서비스는 DB로 H2 데이터베이스를 사용해 왔다. 현재 편리하게 개발하기 위해 H2 사용자명은 sa, 비밀번호는 빈값으로 설정했지만 실제 운영 환경에서는 보안상 매우 위험하다.
따라서 서버 환경과 개발 환경을 분리하고, 서버 환경에서는 보안을 위해 DB에 비밀번호를 설정하는 것이 필요하다.

서버 환경 파일 생성

개발 편의를 위해 로컬 환경은 비밀번호 없이 사용하고 서버 환경에서만 비밀번호를 설정

java -Dspring.profiles.active=prod -jar sbb-0.0.1-SNAPSHOT.jar

-Dspring.profiles.active=prod 옵션을 주어 실행하게 되면 스프링 부트는 application.properties 파일 대신 application-prod.properties을 사용한다.

application-prod.properties

spring.application.name=sbb

# DataBase
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.h2.console.settings.web-allow-others=true
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=1234

# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update

#spring.jpa.properties.hibernate.format_sql=true
#spring.jpa.properties.hibernate.show_sql=true

비밀번호를 설정하고, 외부에서도 H2 콘솔에 접근할 수 있도록 spring.h2.console.settings.web-allow-others=true로 설정한다.

빌드 버전 변경하여 배포 파일 생성

환경 파일을 생성했으므로 SBB가 업데이트 됐다. build.gradle 파일의 빌드 버전도 다음과 같이 변경한다. 빌드 버전을 바꾸지 않으면 이전 배포 파일과 동일한 jar 파일명으로 생성되므로 배포 파일을 생성할 때는 빌드 버전을 변경하는 것이 좋다.

version = '0.0.2-SNAPSHOT'

서버에 변경 내용 적용

데이터베이스에 비밀번호를 설정했기 때문에 기존에 있던 데이터베이스 파일을 지워야 한다. 기존에 생성된 데이터베이스의 비밀번호와 현재 접속하려는 데이터베이스의 비밀번호가 다르기 때문이다.

rm local.mv.db

start.sh


#!/bin/bash

JAR=sbb-0.0.2-SNAPSHOT.jar
LOG=/home/ubuntu/sbb/sbb.log

nohup java -Dspring.profiles.active=prod -jar $JAR > $LOG 2>&1 &

0.0.2 버전 적용 후, -Dspring.profiles.active=prod 옵션을 준다.

SBB 서비스 재시작

./stop.sh
./start.sh

아래처럼 코드를 사용해도 된다.

start.sh


#!/bin/bash

JAR=sbb-0.0.2-SNAPSHOT.jar
LOG=/home/ubuntu/sbb/sbb.log
export spring_profiles_active=prod
nohup java -jar $JAR > $LOG 2>&1 &

서버의 H2 콘솔 접속하기

http://고정IP:8080/h2-console

JDBC URL명을 jdbc:h2:~/local로 설정한다
설정한 비밀번호를 입력하여 연결을 해준다.

80번 포트로 웹 서비스 운영하기

그동안 개발 단계에서는 웹 프로그램을 개발하고 테스트하기 위해 로컬 서버의 8080번 포트를 사용했다. 하지만 운영 환경에서는 실제 가장 많이 사용하는 80번 포트를 사용해야한다.
Nginx나 Apache와 같은 웹 서버를 사용해 80번 포트로 웹 서비스를 제공하려고 한다. 그중에서도 Nginx는 높은 성능을 위해 개발된 웹 서버로, 설정이 간단하고 쉽게 사용할 수 있다.

Nginx 설치 및 설정

sudo apt install nginx

설치 완료 후 /etc/nginx/sites-available 디렉터리로 이동한다.

cd /etc/nginx/sites-available

처음 설치했을 때는 디렉터리 안에 'default'라는 설정 파일만 존재한다.

SBB 서비스의 엔진엑스 설정 파일을 다음과 같이 루트 권한으로 생성한다.

sudo nano sbb
server {
	listen 80;
    server_name localhost;
    
    location / {
    	proxy_pass http://localhost:8080;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
   	}
}

80번 포트로 서비스를 하고 이제 포트 번호를 생략 후 고정 IP 주소로만 웹 브라우저에 접속할 수 있다. 아직은 ip와 연결된 도메인을 구입하지 않았으므로 server_name에는 localhost를 입력했다.

  • porxy_pass: 엔진엑스 웹 서버가 받은 모든 클라이언트 요청을 http://localhost:8080으로 리다이렉트

  • proxy_set_header: 브라우저에서 SBB 서비스를 호출하면 엔진엑스를 통해서 스프링 부트의 톰캣 서버로 요청이 전달된다. proxy_set_header 설정은 이 과정에서 클라이언트 주소가 실제 IP 주소가 아닌 엔진엑스가 설치된 서버의 주소로 톰캣 서버에 전달되는 것을 방지하기 위해 사용한다.

작성한 sbb 파일을 엔진엑스가 SBB 서비스의 설정 파일로 읽을 수 있도록 sbb 파일을 /etc/nginx/sites-enabled 디렉터리에 링크해야 한다.

cd /etc/nginx/sites-enabled/

sites-enabled 디렉터리는 site-available 디렉터리에 있는 설정 파일 중 활성화하고 싶은 것을 링크로 관리하는디렉터리이다.

defalt 삭제

sudo rm default

/etc/nginx/sites-available/sbb 파일을 /etc/nginx/sites-enabled/sbb 파일로 링크한다

sudo ln -s /etc/nginx/sites-available/sbb

이제 ls 명령어 입력시 sbb 링크만 남은 것을 확인할 수 있다.

엔진엑스 실행 및 적용

sudo systemctl restart nginx

엔직엑스 웹 서버를 적용했으니 웹 브라우저에서 고정IP만으로 접속한다.

profile
공부하는 초보 개발자

0개의 댓글