본문 바로가기

Dot Programming/DevOps

[Spring 배포 #0-2] AWS RDS 인스턴스 생성하기 및 EC2와 연동하기

    AWS RDS(MariaDB) 인스턴스 생성하기

    웹 서비스의 백엔드를 다룬다고 했을 때 애플리케이션 코드를 작성하는 것 만큼 중요한 것이 데이터베이스를 다루는 일이다. 백엔드 개발자가 직접 데이터베이스를 설치해서 다루게 되면 모니터링, 알람, 백업, HA 구성 드을 모두 직접 해야만 한다. 처음 구축할 때 며칠이 걸리는 일이다. 

     

    AWS에서는 앞에서 언급한 작업을 모두 지원하는 관리형 서비스 RDS(Relational Dababase Service)를 제공한다. RDS는 AWS에서 지원하는 클라우드 기반 관계형 데이터베이스이다. 하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같이 지원하는 서비스이다. 추가로 조정 가능한 용량을 지원하여 예상치 못한 양의 데이터가 쌓여도 비용만 추가로 내면 정상적으로 서비스가 가능한 장점도 있다.

     

     

    1. RDS 인스턴스 생성하기

    1) rds에 접속 > 데이터베이스 생성 버튼 클릭

    데이터베이스 생성

     

     

    2) 표준 생성 > 엔진 : MariaDB 선택 > 템플릿 : 프리 티어 선택 >

    MariaDB선택 이유는 다음 글에 정리했다. 간단하게 정리하면 다음과 같다.

    • 첫 번째 이유로는 MySQL은 사용 경험이 있지만 MariaDB는 아직 사용해본 적이 없기 때문이다.
    • 두 번째 이유로는 MySQL과 많은 기능이 흡사하기 때문에 익숙했기 때문이다. PostgreSQL은 한번도 접해보지 않은 DB라서 뭔지 모를 거부감이 들었다.
    • 세 번째 이유로는 미래적인 관점으로 MariaDB가 더 발전가능성이 많아 보였기 때문이다. 프로젝트를 길게 끌고간다면 당연히 개발 커뮤니티가 활발한 DB를 택하는 것이 맞다고 생각한다. (커뮤니티가 활발하면 구글링만으로도 에러 해결이 풀리는 경우가 많아 아주 편리하다. ㅎㅎㅎ)

     

    엔진 옵션, 템플릿 설정

     

     

    3) 설정 > DB 인스턴스 식별자 입력 > 마스터 사용자 정보 (마스터 사용자 이름, 암호) 등록 

    본인만의 DB 인스턴스 이름과 사용자 정보를 등록한다. 여기서 사용된 정보로 실제 DB에 접근하게 되니 꼭 마스터 정보는 기억해야 한다.

     

    설정 

     

     

    4) DB 인스턴스 db.t2.micro > 스토리지 > 할당된 스토리지 : 20

    해당 부분은 기본으로 설정되어 있으므로 확인만하고 넘어가면 된다. db.t2.micro  - 1 vCPU, 1GiB RAM/ 할당된 스토리지 : 20

     

    인스턴스, 스토리지

     

     

    5) 네트워크 설정 > 퍼블릭 액세스 :  

    이후 보안 그룹에서 지정된 IP만 접근하도록 막을 예정이다.

     

    네트워크 및 보안

     

    6) 추가 구성 > 데이터베이스 옵션 > 초기 데이터베이스 이름 입력 > 데이터베이스 생성

    추가구성은 초기 데이터베이스 이름만 입력해주고 데이터베이스 생성 버튼을 눌러서 DB 설정을 마무리한다.

     

    추가 구성

     

     

    rds 인스턴스가 생성될 때까지 기다렸다가 생성되면 다음 단계로 넘어가 운영환경에 맞는 파라미터를 설정해보도록 하자.

     

    RDS 인스턴스 생성중

     

     

    2. RDS 운영환경에 맞는 파라미터 설정하기

    RDS를 처음 생성하면 몇 가지 설정을 필수로 해야 한다. 우선 다음 3개의 설정을 차례로 진행해보자. 왼쪽 카테고리에서 [파라미터 그룹] 탭을 클릭해서 이동하자.

     

    파라미터 그룹 생성하기

    1) 파라미터 그룹 탭으로 이동 > 파라미터 그룹 생성 버튼 클릭

    파라미터 그룹 생성

     

     

    2) 파라미터 그룹 세부 정보 > 파라미터 그룹 패밀리 : maridadb10.4 선택 > 그룹 이름, 설명 입력 후 생성

    파라미터 그룹 패밀리는 방금 RDS에서 생성한 MariaDB와 같은 버전으로 맞춰야 한다.

     

    파라미터 그룹 세부 정보 설정

     

    3) 파라미터 > 수정 버튼 클릭

    생성한 파라미트 그룹을 선택하여 파라미터를 하나씩 변경해주자.

     

    파라미터 편집

     

     

    2-1. 타임존

    파라미터 필드에 time_zone을 입력한 후 Asia_Seoul을 입력 후 선택한다.

     

    타임존 설정

     

     

    2-2. Character Set

    다음으로 Character Set을 변경한다. Character Set은 항목이 많다.총 8개 항목으로 character 항목들은 모두 utf8mb4로, collation 항목들은 utf8mb4_general_ci로 변경한다. utf8과 utf8mb4의 차이는 이모지 저장 가능 여부이다.

     

    characet_set 설정
    collation 설정

     

     

    2-3. Max Connection

    마지막으로 Max Connection을 수정한다. RDS의 Max Connection은 인스턴스 사양에 따라 자동으로 정해진다. 현재 프리티어 사양으로는 약 60개의 커넥션만 가능해서 좀 더 넉넉한 값을 지정한다.

     

    max_conncetion 설정

     

     

    4) 계속 버튼 클릭 > 변경 사항 검토  > 변경 사항 적용 버튼 클릭

     

    변경 사항 적용

     

     

    5) 데이터베이스 이동 > RDS 인스턴스(spring-deploy-test) 선택 >  수정 클릭 > 추가 구성 > DB 파라미터 그룹 변경 > 즉시 적용 선택 > DB 인스턴스 수정 버튼 클릭

     

    DB에 파라미터 그룹 적용
    DB 인스턴스 수정

     

     

    간혹 그룹이 제대로 반영되지 않는 경우도 있으므로 정상 적용을 위해 한 번 더 재부팅을 진행한다. 재부팅 까지 성공했다면 로컬에서 RDS에 한 번 접속해보자.

     

    재부팅

     

     

    3. 로컬에서 RDS 접속하기

    1) RDS 보안그룹 클릭

    로컬에 접속하기 위해서 RDS의 보안 그룹에 본인 PC의 IP를 추가해줘야 한다. RDS 세부정보 페이지에서 [보안 그룹] 항목을 클릭한다.

     

    연결 & 보안

     

     

    2) EC2 인스턴스 보안 그룹 ID 복사 

    RDS의 보안 그룹 정보를 그대로 두고, 브라우저를 새로 열어 본다. 그래서 브라우저 다른 창에서는 보안 그룹 목록 중 EC2에 사용된 보안 그룹의 그룹 ID를 복사한다.

     

    EC2의 보안 그룹 복사

     

     

    3) 보안그룹 생성 > 복사된 보안 그룹 ID본인의 IPRDS 보안 그룹의 인바운드로 추가 > 생성

    기존에 디폴트 보안 그룹에 적용해도 되고 만약 해당 보안 그룹이 다른 RDS에서 사용중이라면 새로 생성해도 된다. 나는 기존에 있던 보안 그룹은 다른 RDS가 사용중이기 때문에 새롭게 생성해주었다.

     

    인바운드 규칙에 추가

     

     

    새롭게 보안그룹을 생성한 경우에만 다시 RDS 인스턴스로 가서 보안 그룹을 수정해주고 즉시 적용 해준다.

     

    보안 그룹 선택

     

     

    로컬에서 원격 DB로 붙을 때 GUI 클라이언트를 많이 사용한다. MySQL의 경우 대표적으로 Workbench, Sequel Pro(Mac 전용) 등이 있다. 각각의 도구마다 큰 차이가 없으니 본인에게 맞는 툴을 사용하면 된다. 이번에는 IntelliJ에 기본적으로 내장되어있는 Database를 사용할 것이다. (해당 기능은 인텔리제이 유료 버전만 지원된다.)

     

    4)  인텔리제이 오른쪽 탭 Database 클릭 > + 버튼 클릭 > MariaDB 선택

     

    IntelliJ > MariaDB

     

     

    5) RDS 엔드포인트 복사

     

    RDS 엔드포인트

     

     

    6)  Databse 설정 > Name 입력 (spring-deploy-test) > Host에 RDS 엔드포인트 입력 > User/ Password 항목에 마스터 정보 입력 > Database 항목에 추가 구성에서 입력한 초기 데이터베이스 이름 입력 

    모든 입력이 끝난 후 Test Connection을 눌러서 통과가 되면 생성해준다.

     

    DB 설정 후 생성

     

    7) RDS 설정 정보 확인하기

    RDS에서 설정한 정보들이 잘 입력됐는지 확인해보자. 

    show variables like 'c%';

     

    만약 적용이 안된 부분이 있다면 직접 변경해주면 된다.

    alter database spring_deploy_test
        character set = 'utf8mb4'
        collate = 'utf8mb4_general_ci';

    show variables like 'c%';

     

     

    성공적으로 모든 항목이 적용되었으면 타임존도 확인해보자.

    select @@time_zone, now();

    select @@time_zone, now();

     

     

    마지막으로 한글명이 잘들어가는지 간단한 테이블 생성과 insert 쿼리를 실행해보자.

    create table test(
        id bigint(20) not null auto_increment,
        content varchar(255) default null,
        primary key (id)
    ) engine =InnoDB;
    
    insert into test(content) values ('테스트');
    
    select * from test;

     

    다음과 같이 한글 데이터도 잘 등록되는 것이 확인된다. 이제 모든 설정이 끝났으므로 EC2와 RDS가 잘 연동되는지 확인해보면 된다.

     

    select 쿼리 실행 결과

     

     

    4. EC2에서 RDS 접속하기

    #0-1 AWS EC2 인스턴스 생성 후 접속하기에서 진행한대로 EC2에 ssh로 접속한다. 접속되었다면 MySQL 접근 테스트를 위해 MySQL CLI를 설치한다.

    * 실제 EC2의 MySQL을 설치해서 쓰는게 아닌, 명령어 라인만 쓰기위한 설치이다.

    • sudo yum install mysql

     

    설치가 다 되었으면 로컬에서 접근하듯이 계정, 비밀번호, 호스트 주소를 사용해 RDS에 접속한다.

    • mysql -u 계정 -p -h Host주소
    • 나의 경우 다음과 같이 입력하였다.
      • mysql -u loosie -p -h spring-deploy-test.cnyobjdzyehq.ap-northeast-2.rds.amazonaws.com

     

    패스워드를 입력하면 다음과 같이 EC2에서 RDS에 접속되는 것을 확인할 수 있다.

     

    ec2에서 rds 접속

     

     

    RDS에 접속되었으면 실제로 생성한 RDS가 맞는지 간단한 쿼리를 한 번 실행해보자.

    show databases;
    use spring_deploy_test;
    show tables;
    select * from test;

     

    IntelliJ DB 기능을 통해서 생성했던 테이블과 칼럼이 EC2에서도 잘 조회되는 것을 확인할 수 있다.

     

    쿼리 테스트

     

     

     

     


    [Spring 배포 #0-1] AWS EC2 인스턴스 생성 후 접속하기

    [Spring 배포 #0-2] AWS RDS 인스턴스 생성하기 및 EC2와 연동하기

    [Spring 배포 #1] AWS EC2 서버에 스프링 프로젝트 수동으로 배포하기

    [Spring 배포 #2-1] Travs-ci, S3 생성 및 연동하기

    [Spring 배포 #2-2] CodeDeploy 생성 및 연동하기 (Travs-ci, S3)

    [Spring 배포 #3] 스프링 프로젝트 실제 배포 자동화하기

    [Spring 배포 #4] Nginx로 스프링 프로젝트 블루-그린 무중단 배포하기

     


    참고

    스프링 부트와 AWS로 혼자 구현하는 웹 서비스