본문 바로가기

SpringBoot

[스프링 부트 3 백엔드 개발자 되기] ch 11. AWS에 프로젝트 배포하기

1. AWS

 

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

- 배포는 서버용 PC를 구매해서 배포하는 방법과 AWS와 같은 클라우드 컴퓨팅 서비스를 이용해 배포하는 방법이 있다. 

- AWS는 컴퓨팅 서비스, 네트워크 서비스, 데이터베이스 서비스, 스토리지 서비스 등 다양한 서비스를 제공한다. 

 

- 서비스를 AWS에 배포하려면 AWS 상에서 서버를 구성해야 한다. 쉽게 말해 AWS 상의 가상 PC를 마련해야 한다. 

 

EC2

 

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

 

오토 스케일링 그룹

 

- 유동적으로 EC2를 관리

- 사용자의 요청 횟수에 따라 EC2를 늘이거나 줄인다. 

 

로드 밸런서

 

- 요청들을 분산시키는 역할

- 로드 밸런서를 만들 때는 요청을 어디로 분산시킬지 그룹을 정해야 하는데, 이러한 그룹을 대상 그룹(Target Group, TG)라고 한다. 

 

RDS

 

- 범용 데이터베이스인 아마존 관계형 데이터베이스(amazon relational database service)

- 데이터베이스도 클라우드에 올려야 한다. 

- AWS에서 제공하는 클라우드 데이터 서비스는 RDS, Redshift, DocumentdB, ElastiCache 등이 있다. 

 

 

1) 일래스틱 빈스토크 

 

- 개발자가 애플리케이션을 쉽게 배포하고 확장할 수 있도록 해주는 Pass(Platform as a Service)이다. 

- 개발자가 애플리케이션 코드를 업로드하면, Elestic Beanstalk는 배포, 프로비저닝, 로드 밸런싱, 확장, 모니터링 등을 자동으로 처리해준다. 

 

 

일래스틱 빈스토크를 사용하는 과정

 

  • 애플리케이션 생성
  • 애플리케이션의 소스를 번들 형태, 예를 들어 Java .war 파일로 애플리케이션 버전을 일래스톡 빈스토크에 업로드한다. 
  • 그 뒤에는 일래스틱 빈스토크가 자동으로 환경을 실행하고 코드 실행에 필요한 AWS 리소스를 생성하고 구성한다. 
  • 환경 실행 후에는 환경을 직접 관리하고 필요한 경우 버전 업데이트를 하거나 새로운 앱 버전을 배포할 수 있다. 

 

2. 일래스틱 빈스토크로 서버 구축하기 

 

1) 일래스틱 빈스토크 서비스 생성하기 

 

- 우리가 만들 서버의 제공 위치 서울로 지정 

 

- 검색 창에서 IAM을 검색해서 들어간다. 

- IAM은 AWS 리소스에 접근하는 권한을 관리하는 서비스 

- 일래스틱 빈즈토크 서비스에 부여할 역할을 IAM에서 만들어야 한다. 

 

- IAM 화면으로 이동한 다음에는 [역할 -> 역할 생성]을 누른다. 

- '신뢰할 수 있는 엔티티 유형' 항목은 [AWS 서비스]를 선택하고 '사용 사례' 항목은 [EC2]를 선택 

 

 

- '2단계 권한 추가' 화면에서 다음 3개의 권한을 검색하여 체크하고 [다음] 클릭

  • AWSElasticBeanstalkMulticontainerDocker
  • AWSElasticBeanstalkWebTier
  • AWSElasticBeanstalkWorkerTier

- 역할 이름은 [aws-elasticbeanstalk-ec2-role]로 적고, 신뢰할 수 있는 엔티티와 권한이 잘추가되었는지 확인한 후에 [역할 생성] 버튼을 눌러 역할을 생성 

 

- 검색 창에 Elastic Beanstalk를 입력하여 서비스에 들어간다. 

- [환경-> 환경생성] 을 누른 다음 '환경 구성' 화면이 나타나면 아래 목록을 참고하여 메뉴를 선택하거나 입력 

 

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

 

- 서비스 액세스 구성에서 아래와 같이 선택. 그 이후에는 검토 단계로 건너뛰기 후 검토 화면에서 [제출]을 선택하여 마무리 

 

  • 서비스 역할 : 새 서비스 역할 생성 및 사용 > [aws-elasticbeanstalk-service-role] 기본 값 그대로 두기
  • EC2 인스턴스 프로파일 : [aws-elasticbeanstalk-ec2-role] 선택 

- [환경]을 눌러 일래스틱 빈즈토크 환경 목록을 본다. 환경 목록에 방금 생성한 환경의 상태가 OK로 보이는지 확인하고, URL을 클릭해 해당 URL에 잘 접속되는지 확인 

 

 

2) 일래스틱 빈스토크에서 RDS 생성하기 

 

- 아마존 RDB 서비스를 사용하여 클라우드에 올릴 데이터베이스 생성 

 

- 일래스틱 빈스토크 [환경-> <내가 만든 환경>]을 눌러 들어간 다음 [구성]을 눌러 환경 설정 메뉴에 들어갇나. 

그 다음 스크롤바를 내려 네트워킹 및 데이터베이스 메뉴에서 [편집]을 눌러 데이터베이스 설정을 추가 

 

 

- 데이터베이스 활성화 토글을 클릭한 다음 사용할 데이터베이스 엔진으로는 [mysql]을 선택하고 용량은 프리티어를 지원하는 [db.t3.micro]를 선택한다. 사용자 이름과 암호를 채운 다음 [적용] 버튼을 눌러 데이터베이스 생성 

 

- 데이터베이스가 얼마나 생성되었는지 상태를 확인하기 위해 검색 창에 RDS를 검색하여 들어간 다음 [데이터베이스-> <DB 식별자>]를 눌러 상태를 확인한다. DB 식별자를 누르면 생성된 데이터베이스의 정보를 확인할 수 있다. 특히 앤드포인트 정보는 RDS로 연결할 때 사용한다. 

 

 

- 데이터베이스가 생성되었으니 애플리케이션도 생성한 데이터베이스를 사용하게 변경

- AWS 일래스틱 빈스토크에서 만들었던 환경으로 이동한 다음 [구성]을 누르고 업데이트 및 로깅에서 [편집]을 선택해 데이터베이스의 정보를 입력한 다음 [적용] 버튼을 눌러 마무리한다. 그러면 일래스틱 빈스토크가 환경을 업데이트한다. 

 

 

SPRING_DATASOURCE_URL jdbc:mysql://엔드포인트 입력/blog
SPRING_DATASOURCE_USERNAME 사용자 이름
SPRING_DATASOURCE_PASSWORD 비밀번호 

 

 

- 이렇게 설정한 환경 속성 값은 애플리케이션 실행 시 스프링 부트의 환경 변수, 즉, properties.yml 파일의 설정값의 역할을 한다. application.yml에서 spring 항목의 datasource 항목들만 지운다. 

 

 

3) 로컬에서 RDS 연결하기 

 

- 지금까지 로컬에서 사용하던 H2 대신에 AWS의 RDS를 사용 

- 로컬에서만 동작하는 H2와 달리 RDS는 클라우드 위에 띄어져 있기 떄문에 로컬에서 접속하려면 몇 가지 설정을 해주어야 한다. 

 

- RDS 메뉴로 이동한 다음 [데이터베이스]로 이동하여 생성한 데이터베이스의 DB 식별자를 누르고 VPC 보안 그룹 링크를 클릭

 

 

 

- security group ID를 누르고 보이는 화면에서 인바운드 규칙 탭을 눌러 이동한 뒤 [인바운드 규칙 편집] 버튼을 클릭한다. 인바운드 편집 메뉴에서는 데이터베이스 인스턴스의 트래픽을 관리할 수 있다. 

 

- [규칙 추가]를 눌러 값을 추가한다. 유형은 [MYSQL/Auroral], 소스는 [내 IP]를 선택하고 [저장]을 누른다. 

그러면 로컬에서 일래스틱 빈스토크 데이터베이스에 접근할 수 있다. 

 

 

 

- 로컬에서 일래스틱 빈스토크 데이터베이스에 연결할 수 있는지 확인 

- 인텔리제이 커뮤니티의 database navigator 플러그인을 설치해 데이터베이스르 ㄹ연결한다. 

- 설치 후에는 인텔리제이를 재시작해야 한다. 

 

 

 

- 인텔리제이를 켜고 왼쪽 도구 메뉴에서 [DB Browser]를 선택한다. 만약 보이지 않는다면 맨 위의 메뉴바에서 [View->Tool Windows->DB Browser]를 선택한다. 그 뒤에는 [+] 버튼을 누른 뒤 [Data Source->MySQL]을 선택한다. 

 

 

- 데이터베이스 정보 창에 RDS의 정보인 Host, Port, User, Password를 입력한다. 

- Host는 RDS 구성에서 보았던 엔드포인트이다. 

- Port는 자동으로 입력된 값인 3306이 맞는지 확인한다. 

- 데이터베이스 역시 자동으로 입력된 값인 mysql이 맞는지 확인한다. 

- 입력을 마치면 [TestConnection] 버튼을 눌러 데이터베이스 연결이 잘되는지 테스트 

 

 

- IDEA 화면의 [DB Browser] 탭에 연결항목이 나타날 것이다. 

 

 

- Connection에 마우스 우클릭을 하고 [Open SQL Console] 버튼을 눌러 콘솔을 연다. 

- 여기에 데이터베이스와 테이블을 생성하는 SQL문을 작성한다. 

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;를 입력하여 테이블 3개가 모두 생성되었는지 확인 

 

- 이제 아마존 서버에서 MySQL을 사용하므로 프로젝트를 빌드해 배포하기 전에 의존성을 추가 

- build.gradle 파일을 열어 의존성을 추가하고 새로고침을 눌러 의존성 추가 

 

...
 implementation 'com.mysql:mysql-connector-j'

 

 

3. 일래스틱 빈스토크에 서비스 배포하기 

 

1) 애플리케이션 배포하기 

 

- 인텔리제이를 실행해서 [Gradle] 탭을 누른 다음 [Tasks->build->build]를 더블 클릭해 빌드를 진행 

 

 

- 빌드가 끝나면 [build->libs]에 빌드 완성 파일이 생성된다. jar 파일은 -<버전>으로 끝나는 것과 -<버전>-plain으로 끝나는 것 두 가지 이다.  이 중 -<버전>으로 끝나는 것을 기억하기 쉬운 위치에 복사해둔다. 

 

 

 

- 일래스틱 빈스토크로 돌아가 생성된 환경의 이름을 선택하고 [업로드 및 배포]를 누른 다음 [파일 선택] 버튼을 눌러 jar 파일을 선택 

 

- 일래스틱 빈스토크의 [구성] -> 업데이트, 모니터링 및 로깅의 [편집]을 선택 

- 여기서는 애플리케이션을 실행하기 위한 하위 포트 값과 공개 사이트에 올리면 안되는  민감한 정보를 추가 

 

- 일래스틱 빈스토크에서 제공하는 서버의 URL에 접속하여 /login 패스를 붙여 로그인 화면에 제대로 접속되는지 확인 

 

 

2) OAuth 서비스에 승인된 URl 추가하기 

 

- 구글 클라우드 콘솔에 접속한 후 [API 및 서비스 -> 사용자 인증 정보 -> OAuth 2.0 클라이언트 ID]에 추가되어 있는 클라이언트 ID를 클릭한다. 

- [OAuth 클라이언트 수정 -> 승인된 리디렉션 URI] 에 일래스틱 빈스토크에서 띄어준 서버의 URL을 추가한다. 

 

ex) 승인된 리디렉션 입력 예

http://...생략...//login/oauth2/code/google