[AWS] 백엔드 배포

김주언·2022년 6월 21일
0

TODO LIST

목록 보기
16/18
post-thumbnail

환경 설정

  • AWS 사용법
  • AWS CLI
  • EB CLI
  • 백엔드 배포

1. AWS CLI

AWS를 사용하는 방법은 아래와 같다.

  • AWS 콘솔
  • AWS CLI
    터미널이나 파워셸에서 명령어 사용해서 AWS 리소스에 접근
  • AWS SDK
    라이브러리.
    예를 들어 자바에서 현재 실행 중인 모든 EC2 인스턴스를 출력하려면 AWS SDK 라이브러리를 사용해야한다. build.gradle에 구아바 라이브러리 추가한 것 처럼 aws-java-sdk-ec2를 추가해줘야 한다.

이번에는 CLI 써본다~~

1.1 설치

파이썬 설치

AWS CLI는 파이썬 기반이라서... 파이썬이 있어야한다..
파이썬 공부를 해야되니까...^^ 즐겁다..!

brew install python3
python3 --version

근데 나 아나콘다 환경 대체 어떻게 된겨

AWS CLI 설치

pip3 install awscli
aws --version

1.2 AWS CLI 설정

  1. IAM 생성하고 액세스 키와 시크릿 액세스키 발급
    AWS는 IAM을 제공하여 사람마다 다른 접근 권한을 배정할 수 있다. 각 사람에게는 아이디와 비밀번호, 사람이 아닌 프로그램에는 액세스키와 시크릿 액세스키를 제공하는 것.
    AWS 콘솔에 아이디와 비밀번호를 사용하는 것처럼 AWS CLI가 나의 AWS 계정에 접근하기 위해서는 액세스키와 시크릿 액세스키가 필요하다.

  2. AWS Credential 설정

aws configure
AWS Access Key ID [None]: <액세스  ID>
AWS Secret Access Key [None]: <시크릿 액세스 >
Default region name [None]: us-east-1
Default output format [None]: json

2. EB CLI

AWS CLI는 AWS의 모든 서비스를 위한 CLI. 그래서 AWS CLI 사용 시 EC2, 로드밸런서 등 다 사용 가능하다.

EB CLI는 일라스틱 빈스톡만을 위한 CLI

2.1 EB CLI 설치

pip3 install awsebcli
eb --version


배포

색칠된 부분을 구현할것이다~..

  • 환경별 애플리케이션 프로퍼티 파일 설정
  • RDS
  • EC2
  • 오토 스케일링 그룹
  • 로드밸런서

일라스틱 빈스톡?

일라스틱 빈스톡은 위 사진의 노란 점선 부분을 생성해준다.

현재 프로젝트의 백엔드 애플리케이션은 RDS에 MySQL을 데이터베이스로 사용하고 서버는 로드밸런서에 오토스케일링 그룹을 연결하는 형태

진행 순서는 아래와 같다.

  1. 데이터 베이스 설정
  2. 오토 스케일링 그룹 생성
  3. 오토 스케일링 그룹 내의 EC2 인스턴스들이 애플리케이션 실행할 수 있도록 스크립트 작성
  4. 로드밸런서에 오토 스케일링 그룹을 타깃 그룹으로 지정

일련의 과정을 일라스틱 빈스톡을 사용하면 간단하게 수행 가능하다.
[예시]

eb create --database --elb-type application --instance-type t2.micro

1. 애플리케이션 생성

백엔드 애플리케이션 프로젝트로 이동
eb init 명령어를 사용하여 애플리케이션을 생성해준다

eb init TodoApp-BE

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
// 생략
(default is 3): 10

Select a platform.
// 생략
6) Java
7) Node.js
8) PHP
9) Packer
10) Python
11) Ruby
12) Tomcat
(make a selection): 6

Select a platform branch.
1) Corretto 11 running on 64bit Amazon Linux 2
2) Corretto 8 running on 64bit Amazon Linux 2
3) Java 8 running on 64bit Amazon Linux (Deprecated)
4) Java 7 running on 64bit Amazon Linux (Deprecated)
(default is 1): 

Do you want to set up SSH for your instances?
(Y/n): n
  1. 리전 선택
  2. 해당 애플리케이션이 사용할 플랫폼 선택
  3. EC2 접근을 위한 SSH 설정 여부

설정 완료 시 .elasticbeanstalk 디렉터리 생성되고 이 안에는 config.yml파일이 생성된다.


2. 백엔드 애플리케이션 설정

애플리케이션 프로퍼티 파일을 개발용과 배포용으로 분리해준다

2.1 ⚙️ 프로퍼티 파일 생성

/src/main/resources 아래에 application-prod.yaml과 application-dev.yaml 파일을 생성한다. 기존 프로퍼티 파일은 삭제

2.1.1 application-prod.yaml

server:
  port: 5000

spring:
  jpa:
    database: MYSQL
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL8Dialect
    hibernate:
      ddl-auto: update
  datasource:
    url: jdbc:mysql://${rds.hostname}:${rds.port}/${rds.db.name}
    username: ${rds.username}
    password: ${rds.password}
  

서버 설정

  • server : 기본은 5000번

JPA 설정

  • database: MYSQL : 데이터 베이스 설정
  • show-sql: true : jpa 실행 후 sql 쿼리를 로그로 보여줄지 여부
  • database-platform: org.hibernate.dialect.MySQL8Dialect
    • 데이터베이스 플랫폼으로 MySQL8Dialect을 사용한다.
    • DB의 데이터형과 자바의 데이터형 매핑 (String -> Varchar)
    • @Id와 같은 어노테이션을 DB 키워드로 변환
  • hibernate:ddl-auto: update
    • 애플리케이션 시작 시 DB 테이블 설정 지정
    • create 지정 시 모든 테이블 삭제 후 생성
    • update 없는 테이블은 생성하고 바뀐 테이블은 업데이트
    • validate 현재 DB의 테이블 스키마가 애플리케이션에 정의된 모델과 일치하는지만 확인

datasource 설정

  • url: jdbc:mysql://${rds.hostname}:${rds.port}/${rds.db.name}
    • 데이터베이스 url 지정한다.
      데이터 베이스 url은 보통 jdbc:<DB타입>://<호스트>:<포트>/<DB이름> 형태이다.
      일라스틱 빈스톡이 DB를 만들어주기 때문에 일라스틱 빈스톡이 애플리케이션을 실행하면서 값을 지정해줄 수 있다. 변수 사용을 위해 ${} 지정
  • username: ${rds.username} : DB 사용자 이름
  • password: ${rds.password} : DB 패스워드

2.1.2 application-dev.yaml

공백으로 남겨두면 dev 사용 시 h2 DB, prod 사용시 mysql 사용가능


2.2 MySQL 사용

build.gradle의 dependencies에 코드 추가

runtimeOnly 'mysql:mysql-connector-java'

2.3 HealthCheck API

AWS 로드밸런서는 기본 경로인 "/"에 HTTP 요청을 보내서 애플리케이션이 동작하는지 확인한다. EB은 이를 기반으로 애플리케이션의 상태를 확인한다. 그리고 이 상태를 AWS 콘솔에 표시해준다

이를 위해서 "/"에 API를 생성해준다.

2.3.1 HealthCheck Controller 작성

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HealthCheckController {

    @GetMapping("/")
    public String healthCheck() {
        return "Service is up and running........";
    }
}

"/" API는 인증 없이 사용가능하다!
WebSecurityConfig에서 이미 "/"와 "/auth/**"는 인증하지 않아도 되도록 설정했기 때문에..
만약 이 설정 안 해두면 "/" 접근도 403코드를 리턴하고 따라서 로드밸런서는 이 애플리케이션에 에러가 있다고 판단한다.


2.4 target.jar 설정

EB가 애플리케이션을 자동으로 S3에 업로드하고 EB환경에 설정할 수 있도록 설정 해야한다.
업로드할 애플리케이션의 경로를 알려주면 이러한 설정이 가능하다.

애플리케이션의 경로 찾기

터미널에서 프로젝트 루트 디렉터리에서 빌드 커맨드를 실행하여 프로젝트를 빌드해준다

./gradlew build

빌드가 완료되면 build/libs 폴더 내부에 jar파일이 생성된다.

SNAPSHOT.jar의 경로를 복사해서 .elasticbeanstalk/config.yml에
deploy:artifact 부분에 추가해준다.



3. AWS에 환경 생성

eb create 커맨드를 이용하여 AWS에 환경 생성

 eb create --database --elb-type application --instance-type t2.micro
  • eb create : AWS에 일라스틱 빈스톡 환경 생성
  • --database : 생성하는 환경에 RDS 데이터베이스 만들기 위한 옵션
  • --elb-type <타입>
    • 일라스틱 로드밸런서 타입 지정해주는 옵션
    • 로드밸런서와 오토스케일링 그룹 사용시 해당 옵션 추가한다.
  • --instace-type : 애플리케이션이 동작할 인스턴스 타입 지정


4. 애플리케이션 배포

AWS 일라스틱 빈스톡 환경을 확인해보면 상태가 Severe하다.
생성만 하고 배포를 아직 하지 않아서 그렇다.

4.1 yaml파일 지정

eb setenv커맨드를 이용하여 환경이 사용할 애플리케이션의 yaml파일을 지정해준다.

eb setenv SPRING_PROFILES_ACTIVE=prod
  • SPRING_PROFILES_ACTIVE=prod
    application-prod.yaml 파일을 이용하라는 의미
  • SPRING_PROFILES_ACTIVE=dev
    application-dev.yaml 파일을 이용하라는 의미

재시작 완료되면 OK 된다


배포 완~~~ 😇

profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글