본문 바로가기

인프라

쉽고 간단한 백엔드 인프라, 배포부터 보안까지 (3) - Amazon RDS

 

https://github.com/fineman999/simple_spring_mvc

 

GitHub - fineman999/simple_spring_mvc: Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(CI/CD) + Am

Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(CI/CD) + Amazon RDS(MySQL) - GitHub - fineman999/simple_spring_mvc: Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + ...

github.com


목차

    서론

    지난 시간에는 AWS Elastic Beanstalk을 이용해 서버를 구축하였다.

    이제 AWS Elastic Beanstalk에 Amazon RDS를 적용시켜 보자.

     

    아키텍처

    RDS 추가

    Amazon RDS

    RDS

    검색 창에 RDS를 입력하면 다음과 같은 화면 창이 보인다.

    Create database를 선택하자.

     

    Create database

    Engine options

    Create database

    Standard create와 MySQL를 선택하자.

     

    Templates

    Templates

    무료 버전을 이용할 거기 때문에 Free tier를 선택하자.

     

    Settings

    Settings

    DB 인스턴스를 식별하기 위해 유니크한 DB instance identifier를 입력하자.

    username과 password로 db에 접근할 수 있기 때문에 자신이 원하는 username과 password를 입력하자.

     

    Instance configuration

    매월 MySQL, MariaDB, PosrtgreSQL 데이터베이스를 실행하는 Amazon RDS 단일 AZ db.t2.micro, db.t3.micro 및 db.t4g.micro 인스턴스 사용량 750시간, 2개 이상의 인스턴스를 실행하는 경우 인스턴스 클래스 전체의 사용량이 집계되므로 3가지 중 한 가지를 선택하자.

     

    Storage

    범용(SSD) 데이터베이스 스토리지는 20GB 제한되므로 20GB 이하로 지정하자.

     

    Connectivity

    Connectivity - 1

    EC2 인스턴스는 Elastic Beanstalk가 배포를 할 때마다 새로운 인스턴스로 바뀐다. 그러므로 EC2 compute resource를 지정할 필요가 없다.

    VPC는 Elastic Beanstalk와 같은 VPC를 지정하자.

    Public access는 외부에서 접근가능하도록 해야 하기 때문에 YES를 선택하자.

     

    connectivity - 2

     

    Datanase authentication

    Database authentication

    최대한 단순하게 만드는 것이 목적이므로 데이터베이스 권한을 Password authentication으로 설정하자.

     

    Additional configuration

    Additional configuration - 1

    Inistial database name을 입력하면 Amazon RDS가 미리 database를 생성해 준다. 그러므로 추가하는 편이 더 편리하다.

    무료로 이용할 것이기 때문에 backup, encryption을 선택하지 말자.

     

    Additional configuration - 2

    무료로 사용할 것이기 때문에 모두 선택하지 말자.

     

    Esitimated Monthly costs

    Esitimated monthly costs

    만일 프리티어가 아닐 경우 첫 번째 costs처럼 비용이 발생한다. 프리티어에 충족하도록 적용하였으므로 비용 발생이 되지 않을 것이다.

     

    Create database

    database를 생성하자.

     

    Parameter groups

    Parameter groups

    대한민국 시간에 맞게 time zone과 한글 데이터가 깨지지 않게 Character를 수정해야 된다.

    방법으로 Paramter groups를 통해 수정할 수 있다.

     

    Create paramter group

    Create paramter group을 클릭하자.

     

    Create paramter group

    Paramter gorup family는 이전에 선택한 버전에 맞게 지정하자.

    Type은 클러스터를 이용하지 않기 때문에 DB Paramter Group을 선택하자.

    이름과 설명은 원하는 데로 작성하자.

     

    Paramter Groups

    수정을 하기 위해 새로 만든 simple-spring-mvc를 클릭하자.

     

    Edit 수정하기

    Edit를 클릭하자.

     

    time_zone

    time_zone

    Asia/Seoul로 입력한 후 Save Changes를 클릭하자.

     

    charater_set

    charater_set

    chrater_set에 해당되는 모든 parameter를 utf8mb4로 입력하자. utf8mb4는 UTF-8의 확장으로, 기본 UTF-8에서 지원하지 않는 특정 유니코드 문자를 나타내기 위해 4바이트 길이의 문자를 사용한다.(이모지 지원, 다국어 문자 지원 등)

    Save Chages를 눌러 저장하자.

     

    Modify

    Modify

    새로운 Paramter로 변경하기 위해 Modify를 선택하자.

     

    Additional configuration

    Additional configuration에서 DB paramter group을 새롭게 만들어진 simple-spring-mvc로 변경하고 continue 버튼을 누르자.

     

    Modify DB instance: simple-db

    Modify DB instance: simple-db

    즉시 수정을 선택하고 Modify DB instance를 클릭하자.

     

    Security Group

    아직 Security Group을 설정하지 않았다. 지금 Connect를 하려면 Connection timeout이 발생하므로 Security Group에서 해당 port를 열어줘야 된다.

     

    Simple-db

    Simple-db에 접속하여서 Security gorup rules의 Type이 EC2 Security Group-Inbound를 선택하자.

     

    Security-group

    Security group ID를 클릭하자.

     

    3306

    Inbound rules에 처음에 들어가면 All traffic 만 있을 것이다. Edit inbound rules에 접속하여 port로 3306, Source는 전체를 의미하는 0.0.0.0/0(Ipv4)를 선택하고 수정하자.

     

    DB Connection test

    Intellij를 실행시키자.

     

    Intellij Database

     Intellij 유로 버전에서는 Database 연결을 제공해 준다. 하지만 무료 버전에는 제공해주지 않지만 Database Navigator Plugin을 이용하여 Database를 연결할 수 있다. 아니면 MySQL Workbench를 설치하여 사용할 수 있다.

     

    Data Sources and Drivers

    Data Sources and Drivers

    Host는 simple-db의 Endpoint를 복사하여 붙여 넣기를 하면 된다.

    Authentication은 User & Password를 선택하고 RDS 생성할 때 입력한 User와 Password를 입력하면 된다. 미리 만들어진 simpleDB를 입력하고 TestConnection을 클릭한다. 초록색 체크 표시가 나면 정상적으로 연결되었다는 뜻이므로 Apply와 OK를 클릭하면 DB connection은 완료된다.

     

     

    Spring Boot

    이전 시간에 만든 프로젝트에 불러오자.

     

    dependency 추가

    build.gradle

    implementation구성은 컴파일 및 실행 클래스패스에 의존성을 추가하며, 이러한 의존성은 프로젝트 코드에 직접적으로 필요한 경우에 사용된다.

    org.springframework.boot:spring-boot-starter-jdbc 부분은 의존성의 그룹 ID와 아티팩트 ID를 지정한다. 이 경우, Spring Boot에서 제공하는 spring-boot-starter-jdbc 라이브러리를 가져올 것임을 의미한다.

    runtimeOnly 구성은 프로젝트를 실행할 때 필요한 라이브러리를 정의하는 데 사용된다.

    com.mysql:mysql-connector-j는 MySQL 데이터베이스와의 연결을 지원하는 라이브러리 중 하나인 MySQL Connector/J 라이브러리를 나타낸다.

     

    설정 정보 추가

    application.yml

    Spring 프레임워크에서는 설정 정보를 제공하는 데 주로 application.properties와 application.yml 두 가지 파일 형식을 사용한다. 이 두 파일은 비슷한 목적을 가지고 있지만 구문과 사용법의 차이가 있다.

     

    application.properties

    • 이 파일은 주로 프로퍼티(key-value) 형식으로 설정 정보를 작성하는 데 사용된다.
    spring.datasource.url=${DB_URL}
    spring.datasource.username=${DB_USERNAME}
    spring.datasource.password=${DB_PASSWORD}
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

     

    application.yml

    • 이 파일은 YAML(YAML Ain't Markup Language) 형식을 사용하여 설정 정보를 사용된다. YAML은 들여 쓰기를 통해 데이터를 계층 구조로 나타내므로 복잡한 설정을 더 읽기 쉽게 만들 수 있다.
      spring:
        datasource:
          url: ${DB_URL}
          username: ${DB_USERNAME}
          password: ${DB_PASSWORD}
          driver-class-name: com.mysql.cj.jdbc.Driver

     

    yml이 더 읽기 쉽고 편하기 때문에 yml으로 수정하자.

     

    application.yml

    • url: 데이터베이스 서버에 연결하기 위한 JDBC URL을 나타낸다.
    • username: 데이터베이스에 연결할 때 사용할 사용자 이름을 지정한다.
    • password: 데이터베이스에 연결할 때 사용할 암호를 지정한다.
    • driver-class-name: 사용할 JDBC 드라이버의 클래스 이름을 지정한다. MySQL 데이터베이스를 사용하려면 'com.mysql.cj.jdbc.Driver'를 사용하면 된다.
    • ${...}: 환경변수 또는 Spring 프로퍼티로부터 동적으로 설정된 값으로 대체할 수 있다. Elastic Beanstalk와 추후 Github Actions를 통한 CI/CD를 할 것이기 때문에 환경변수로 해야지 안전하고 쉽게 수정할 수 있으므로 ${}를 이용하자.

     

    DB Connection test

    Test code

    @SpringBootTest
    public class DatabaseConnectionTest {
    
        @Autowired
        private DataSource dataSource;
    
        @Test
        void testDatabaseConnection() {
            try (Connection connection = dataSource.getConnection()){
                System.out.println(connection.getMetaData().getURL());
            } catch (SQLException e) {
                throw new RuntimeException("DB 연결 실패");
            }
        }
    }

    DB connection 테스트를 위해 테스트 코드를 설정하자. 

     

    DB connection - fail

    아직 환경변수를 입력하지 않았으므로 테스트가 실패된다.

    Intellij는 환경변수를 프로젝트 별로 쉽게 적용할 수 있게 제공되어 있다.

     

    project settings

    맨 위 상단에 클릭 후 Edit Configurations을 클릭하자.

     

    Run/Debug Configurations

    Modify options를 클릭하면 Environment variables를 찾을 수 있다. 우리가 지정한 ${}에 따라 값을 입력한 후 OK 버튼을 누르자.

     

    테스트 성공

    테스트가 성공된 걸 확인할 수 있다.

     

    Build

    Gradle Build

    Gradle의 Build를 누르자.

     

    Build Result

    성공적으로 빌드가 완료되었으면 build/libs의 jar 파일이 업데이트되었을 것이다.

     

    Amazon Elastic Beanstalk에 RDS 적용하기

    Amazon Elastic Beanstalk

    이전 Step에서 만든 Elastic Beanstalk에 접속하자. 그리고 Configuration을 클릭하자.

     

    Configuration

    Updates, monitoring, and logging의 Edit를 클릭하자.

     

    environment properties

    Spring 프로젝트에서 했던 것처럼 똑같이 적용한 후 Apply를 누르자.

     

    Upload and deploy

    simple-spring-mvc-env

    RDS가 연결된 spring 프로젝트를 업로드하기 위해 Upload and deploy를 클릭하자.

     

    Upload and deploy

    file을 선택하고 version을 version2로 정하자. 그리고 Deploy를 클릭하자.

     

    Health Green

    정상적으로 연동이 되었으면 Gray 후 Green으로 상태가 변해져 있을 것이다.

     

    Next Step

    https://ppaekkomlog.tistory.com/20

     

    AWS Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + GitHub Actions(CI/CD) + Amazon RDS(MySQL)으로 백엔드 인프라

    https://github.com/fineman999/simple_spring_mvc GitHub - fineman999/simple_spring_mvc: Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(CI/CD) + Am Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(C

    ppaekkomlog.tistory.com


    참고

    https://luminitworld.tistory.com/94

     

    3. AWS RDS 구축 (MySQL)

    (1) 데이터 베이스의 분리 앞서 AWS EC2를 구축했을 때 EC2 안에 데이터 베이스 MySQL을 설치하고, EC2에서 데이터베이스를 사용하였습니다. 물론 EC2의 서버에 데이터 베이스를 구축해도 당장에는 문

    luminitworld.tistory.com

     

    반응형