[Spring Boot] 11. AWS에 프로젝트 배포하기

김민경·2024년 7월 25일
post-thumbnail

'스프링 부트3 백엔드 개발자 되기' 책을 참고하며 작성 중 입니다.


사전 지식

AWS?

다른 PC에서도 서비스에 접속하려면 실제 서버에 스프링 부트 서버를 올려 실행 해야 한다. 이런 행위를 실무에서는 배포 라고 한다.

  1. 서버용 PC를 구매
  2. AWS와 같은 클라우드 컴퓨팅 서비스 이용

컴퓨팅 서비스, 네트워크 서비스, 데이터베이스 서비스, 스토리지 서비스 등 다양한 서비스를 지원하는
AWS 를 사용하여 배포해보자.

AWS 서비스로 우리의 서비스 배포하기

우리가 사용할 AWS의 서비스 ⬇️

EC2 : AWS에서 제공하는 원격 서버
- 오토 스케일링 그룹
- 타깃 그룹
- 로드 밸런서
RDS : AWS에서 제공하는 원격 데이터베이스

가상의 PC 또는 서버 EC2

EC2는 AWS에서 제공하는 클라우드 컴퓨팅 서비스로 가상의 PC 즉, 서버 한 대를 임대하는 서비스

유동적으로 EC2를 관리해주는 오토 스케일링 그룹

사용자의 요청이 많아지면 서버 하나로는 처리가 어렵기 때문에 여러 EC2가 필요!
그때 사용자의 요청 횟수에 따라 EC2를 유동적으로 늘이거나 줄여주는 서비스

요청을 분산시켜주는 로드 밸런서

사용자의 요청이 한 경로로 들어오는 것을 분산시켜주는 서비스

그때 요청을 어디로 분산시킬지 그룹을 정해야 하는데,
이러한 그룹을 대상 그룹 이라고 한다.

데이터 저장소 RDS

AWS에서 제공하는 클라우드 데이터베이스 서비스 중 범용 데이터베이스

AWS에서 제공하는 서비스는 굉장히 많기 때문에, 서비스를 이해하고 사용하는 방법을 파악하기 어렵다.
이러한 어려움을 해결하고자 일래스틱 빈스토크 (Elastic Beanstalk) 서비스가 등장!


AWS 계정 생성

AWS는 계정 생성 후 1년 동안 프리티어 자격을 준다!
계정 생성은 알아서 셀프

https://aws.amazon.com/ko/


일래스틱 빈스토크로 서버 구축

일래스틱 빈스토크 서비스 생성

1. 서버를 서울로 변경

혹시나 다른 서버에 만들어서 쓸데없는 결제가 되지 않도록 조심하자 ..

2. IAM에서 AWS 접근 권한 생성

[IAM -> 역할 -> 역할 생성]

3. 역할 생성

  • 신뢰할 수 있는 엔터티 유형 : AWS 서비스
  • 사용 사례 : EC2

4. 2단계 권한 추가

  • AWSElasticBeanstalkMulticontainerDocker
  • AWSElasticBeanstalkWebTier
  • AWSElasticBeanstalkWorkerTier

5. 역할 이름 작성 및 생성

  • 역할 이름 : [aws-elasticbeanstalk-ec2-role]

6. Elastic Beanstalk 서비스

[Elastic Beanstalk -> 환경 -> 환경 생성]

  • 애플리케이션 이름 : springboot-developer
  • 플랫폼 : Java (Corretto 17)

7. 서비스 액세스 구성

  • 서비스 역할 : 새 서비스 역할 생성 및 사용 > [aws-elasticbeanstalk-service-role] 기본 값 그대로 두기 (다른 이름 사용해도 무방)
  • EC2 인스턴스 프로파일 : [aws-elasticbeanstalk-ec2-role] (위에서 만든 IAM)

8. 도메인 접속

현재 제작한 환경에 들어가 [도메인] URL을 눌러 아래와 같은 창이 뜨면 성공!


일래스틱 빈스토크에서 RDS 생성

1. 데이터베이스 생성

[Elastic Beanstalk -> 환경 -> (방금 만든 환경) -> 구성 -> 네트워킹 및 데이터베이스 편집]

2. 데이터베이스 정보 입력

  • 데이터베이스 활성화 토클 ON
  • 엔진 : mysql
  • 엔진 버전 : 8.0.33
  • 인스턴스 클래스 : db.t2.micro (프리티어 지원)
  • 사용자 이름 & 암호 : (개인적으로 입력)

3. 데이터베이스 확인

생성한 데이터베이스에 들어가 엔드포인트 복사
엔드포인트는 RDS 연결 시에 사용한다.

4. Elastic Beanstalk에 데이터베이스 연결

[Elastic Beanstalk -> (내가 만든 환경) -> 구성 -> 업데이트, 모니터링 및 로깅 편집]

환경 속성 추가

이름
SPRING_DATASOURCE_URLjdbc:mysql://(엔드포인트)/blog
SPRING_DATASOURCE_USERNAME전에 입력한 값
SPRING_DATASOURCE_PASSWORD전에 입력한 값

5. application.yml 수정

애플리케이션 실행 시 위에 설정한 환경 속성 값으로 yml 값을 덮어쓰게 된다.

spring:
    ~~datasource:
    	url: jdbc:h2:mem:testdb~~ 삭제

로컬에서 RDS 사용하기

1. 데이터베이스 보안 그룹 설정

[RDS -> 데이터베이스 -> VPC 보안 그룹]

2. 인바운드 규칙 편집

  • 유형 : MYSQL/Aurora
  • 소스 : 내 IP

3. Intellij 플러그인으로 데이터베이스 연결

[File -> Setting -> Plugins -> Databse Navigator]

설치 후 Intellij Restart

왼쪽 도구 메뉴에서 DB Browser 선택
만약 보이지 않으면 [View -> Tool Windows -> DB Browser]

[ + 버튼 -> Data Source -> MySQL]

  • Host : (RDS 엔드포인트)
  • Port : 3306
  • User & Password : 전에 입력한 값

Test Connection으로 연결 테스트 후 아래와 같이 잘 연결된 모습!

4. Database와 Table 생성

[ Connection 우클릭 -> Open SQL Console ]

Connection

!! 실행 시 내가 원하는 만큼 드래그 후 RUN 버튼 누르기

create database blog;
use blog;

create table article(
    id bigint not null AUTO_INCREMENT,
    author varchar(255) not null,
    content varchar(255) not null,
    created_at timestamp,
    title varchar(255) not null,
    updated_at timestamp,
    primary key (id)
);

create table refresh_token (
    id bigint not null AUTO_INCREMENT,
    refresh_token varchar(255) not null,
    user_id bigint not null,
    primary key(id)
);

create table users(
    id bigint not null AUTO_INCREMENT,
    created_at timestamp,
    email varchar(255) not null,
    nickname varchar(255),
    password varchar(255),
    updated_at timestamp,
    primary key (id)
);

show tables;

실행 후 Schemas Reload

show tables 로 테이블 확인

5. 의존성 추가

build.gradle

dependencies {
     implementation 'com.mysql:mysql-connector-j'
}

일래스틱 빈스토크에 서비스 배포

애플리케이션 배포하기

1. build 실행

[Gradle -> Tasks -> build -> build 더블 클릭]

> 만약 Test 오류가 난다면?

[Gradle -> Tasks -> build -> build 우클릭 -> Run 환경 수정하기]

  • Run : build -x test
    로 설정해주면 test를 제외하고 빌드를 진행한다.

2. libs에 jar 파일 확인

[build -> libs] 를 확인하면 jar 파일이 두 개가 생긴다.
그 중에서 plain이 아닌 것을 배포한다.

3. 업로드 및 배포

[Elastic Beanstalk -> 환경 -> (내가 만든 환경) -> 업로드 및 배포]


파일 선택 후 아까 위에서 봤던 jar 파일을 업로드 하여 배포한다.

4. 환경 변수 설정

아까 데이터베이스의 환경 변수를 설정하는 것과 동일하게 환경 변수를 설정한다.
[(내가 만든 환경) -> 구성 -> 업데이트, 모니터링 및 로깅 -> 편집 -> (아래) 환경 속성 ]

이름
SERVER_PORT5000
JWT_SECRETKEYapplication.yml에서 설정한 값
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_IDgoogle에서 발급받은 아이디
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRETgoogle에서 발급받은 비밀키
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_SCOPEemail,profile

5. /login 화면 확인

(도메인) + /login 으로 접속하여 로그인 화면 확인하기

6. google 로그인 redirect url 추가

해당 도메인으로 반환하는 url이 없기 때문에 google 로그인에 액세스 거부 에러 메세지가 발생한다.
아래처럼 추가해주자!

7. 서비스 확인

전에 구성했던 화면들과 기능들이 잘 동작되는 것을 확인한다!


참고) 오류 확인하는 법

로그 살펴보기

[(내가 만든 환경) -> 로그 -> 로그 요청 -> 전체]

로그 파일 다운로드 후 var/log/web.stdout.log 를 확인하면 intellij에서 보던 화면들을 확인할 수 있다.

Jul 25 12:53:08 ip-172-31-12-250 web[6530]:  .   ____          _            __ _ _
Jul 25 12:53:08 ip-172-31-12-250 web[6530]: /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
Jul 25 12:53:08 ip-172-31-12-250 web[6530]: ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
Jul 25 12:53:08 ip-172-31-12-250 web[6530]: \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
Jul 25 12:53:08 ip-172-31-12-250 web[6530]:  '  |____| .__|_| |_|_| |_\__, | / / / /
Jul 25 12:53:08 ip-172-31-12-250 web[6530]: =========|_|==============|___/=/_/_/_/
Jul 25 12:53:08 ip-172-31-12-250 web[6530]: :: Spring Boot ::                (v3.2.0)

AWS의 일래스틱 빈스토크를 사용해 실제 서버에 배포하는 방법을 실습했습니다.

배포, 클라우드 서비스, AWS, EC2, RDS, 일래스틱 빈스토크
profile
뭐든 기록할 수 있도록

0개의 댓글