[AWS] SpringBoot 프로젝트 배포 (Feat. Nginx, PostgreSQL)

준우·2023년 3월 29일
1

AWS

목록 보기
1/3
post-thumbnail

나의 SpringBoot 프로젝트는 Jar, Gradle을 사용하고, DBMS는 Postgresql을 사용했다.
이 프로젝트를 AWS EC2에 배포하고, nginx와 ACM, Route53, LoadBalacer 를 사용해서 도메인과 인증서까지 적용하는 방법을 정리한다.
이후에는 Jenkins를 사용해서 자동 배포하는 법까지 알아볼 것이다.

(1) AWS EC2 생성

  • https://aws.amazon.com/ko/
    위 사이트에서 회원가입을 하고 로그인 한다.

  • 로그인 후 우측 상단에서 위치를 서울로 설정한다.

  • 서비스 검색창에 EC2 를 검색하고 인스턴스 시작을 누른다.
    이름을 지정하고, 애플리케이션 및 OS 이미지는 Amazon Linux 2를 선택한다.

  • 인스턴스 유형은 프리티어 가능한 t2.micro를 선택한다.
    프리티어는 12개월 무료이지만, 메모리 4기가 이상이어야 좋다.

  • 키페어가 없다면 새 키페어 생성을 누른다.
    키페어 이름을 적고 키페어 유형과 프라이빗 키 파일 형식을 설정한다.
    해당 키파일은 특정 디렉터리에 저장한 뒤, 해당 경로로 가서 sudo chmod 400 파일명 명령어로 권한을 줘야한다.

  • 네트워크 설정은 아래처럼 https, http 일단 다 허용하고 위치 무관 애니웨어(0.0.0.0/0)으로 해야 웹에서 접근 가능하다.
    ssh는 보안상 자신의 IP만 허용하는 것이 좋다.

  • 프리티어는 최대 30gb 지원되므로 스토리지 구성은 아래처럼 설정한 뒤 인스턴스 시작을 클릭한다.

(2) 탄력적 IP 연결

  • EC2 인스턴스를 다시 시작하게 되면 IP가 바뀔 수 있다. 탄력적 IP 할당을 통해 EC2에 고정 IP를 할당한다.
  • EC2 대시보드에서 탄력적 IP를 찾아 클릭하고, 탄력적 IP 주소 할당을 클릭한다.
  • 탄력적 IP가 생성 후 해당 IP를 클릭하고, [탄력적 IP 주소 연결]을 클릭한다.
    그리고 인스턴스와 프라이빗 IP주소를 선택하고 연결을 클릭한다.

(3) EC2 연결

  • 만들어진 인스턴스 클릭 후 [연결]을 누른다.
  • SSH 클라이언트 탭에서 맨 아래 ssh로 시작하는 명령어를 복사한다.
  • 터미널을 열고, pem키를 저장했던 디렉터리 위치에서 명령어 실행한다.

(4) 프로그램 설치

  • EC2 서버에 접속이 됐다면, 이제 내가 웹서버에 올릴 프로젝트의 환경에 따라 프로그램을 설치해줘야 한다.
  • 나는 git, java, postgresql 을 설치해야 한다.

자바 설치

curl -s "https://get.sdkman.io" | bash
  • 위 명령어로 sdkman이 정상 설치 되었다면 Ctrl+D 명령어로 ssh 연결을 끊었다가, 다시 ssh로 재접속한다.
sdk list java
sdk install java 17.0.4-amzn 
  • sdk list java 명령어로 본인 프로젝트에 맞는 버전의 jdk 명령어를 확인하고 sdk install 한다.
  • maven 프로젝트라면 아래 명령어를 입력하고,
sdk install maven 3.8.6
  • gradle 프로젝트라면 아래 명령어를 입력한다.
    프로젝트의 환경에 따라 이것도 맞는 버전으로 설치한다.
sdk install gradle 7.4.1

git 설치 및 프로젝트 clone

sudo yum install git
git clone 깃헙repo 주소
  • 이후 cd 명령어로 해당 프로젝트 위치로 이동한다.
gradle clean build -b build.gradle
  • 위 명령어로 프로젝트를 build 한다.
curl localhost:8080
  • curl 명령어로 프로젝트가 웹에서 잘 접속되는지 확인한다.

postgresql 설치

sudo amazon-linux-extras install postgresql10 epel -y
sudo yum install postgresql-server postgresql-devel -y
sudo /usr/bin/postgresql-setup --initdb
sudo su
cd /var/lib/pgsql/data
vim postgresql.conf
  • conf 파일이 열리면 아래 사진 처럼 listen_addresses와 port 부분 주석을 제거한다.
sudo service postgresql restart
  • 그리고 서비스를 재시작해야 변경한 설정이 반영된다.
vim /var/lib/pgsql/data/pg_hba.conf
  • 다시 위 명령어로 다른 설정파일을 열고 아래처럼 postgres 계정을 추가 해준다.
  • METHOD는 MD5로 해야 인증 관련 문제가 발생하지 않는다.
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5  # <-- 수정된 부분
# IPv6 local connections:
host    all             all             ::1/128                 md5  # <-- 수정된 부분
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    all             postgres(유저이름)        0.0.0.0/0               md5 # <-- 추가된 부분
host    replication     all             ::1/128                 ident
  • sudo su - postgres 명령어로 postgres에 접속한다.
    접속에 성공하면 아래처럼 계정 비밀번호를 설정하고, 프로젝트에서 사용하는 database 이름과 동일한 이름으로 db를 만들어준다.
alter user 유저이름 with password '비밀번호';
create database 데이터베이스이름 with owner postgres;

nginx 설치

sudo amazon-linux-extras install nginx1
sudo systemctl start nginx
curl localhost
  • 위 명령어를 입력해서 nginx를 설치하고 이번에는 포트번호 없이 웹이 잘뜨는지 확인한다.
 sudo su -
cd /etc/nginx
vim nginx.conf
  • 이번에는 위 명령어를 입력해서 nginx.conf 파일을 아래와 같이 수정한다.
    server 블록{} 안에 location / {}을 추가한다.
        location / {
            sendfile off;
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect default;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_cache_bypass $http_upgrade;
            proxy_max_temp_file_size 0;
        }
  • 파일을 저장하고 나온 뒤 아래 명령어로 nginx 를 재시작한다.
systemctl restart nginx
  • 이제 웹 브라우저에서 http://ec2의 ip를 입력하면 프로젝트에 접근할 수 있다.

앞으로 추가될 내용

  • ACM
  • Route 53
  • LoadBalancer
  • Docker + Jenkins 자동 배포

0개의 댓글