AWS RDS 생성 후 EC2 인스턴스 내 서비스와 연동
이번 글에서는 AWS RDS(Relational Database Service)를 MariaDB로 생성 후 EC2 인스턴스 내에 있는 스프링부트 서비스에서 해당 RDS를 호출하도록 할 것이다. 이 글의 순서는 다음과 같다.
- RDS란 무엇인가?
- 실습 전 준비사항
- RDS(MariaDB) 생성 후 로컬PC 및 EC2 인스턴스와 연동하기
- EC2 인스턴스 내 스프링부트 서비스에서 RDS 연동
1. RDS란 무엇인가?
Amazon Relational Database Service(Amazon RDS)는 AWS 클라우드에서 관계형 데이터베이스를 더 쉽게 설치, 운영 및 확장할 수 있는 웹 서비스다. Amazon RDS는 업계 표준 관계형 데이터베이스에 필요한 용량을 제공하면서 비용이 효율적이며 크기 조정이 가능하고 데이터베이스 관리를 위한 공통작업까지 관리한다.
만약 온프레미스 서버를 구입하면 CPU, 메모리, 스토리지, IOPS가 한데 묶여 제공되지만, Amazon RDS를 사용하면 이 모두가 따로 분할되므로 독립적으로 확장할 수 있다. 또한 필요할 때 자동화된 백업을 수행하거나, 고유한 백업 스냅샷을 수동으로 만들 수 있다. 이러한 백업을 통해 데이터베이스를 복원할 수 있으며, 복원프로세스는 안정적이고 효율적이다.그리고 이미 친숙한 MySQL, MariaDB, PostgreSQL, Oracle 및 Microsoft SQL Server 같은 데이터베이스제품을 사용할 수 있다.
2. 실습 전 준비사항
실습을 하기 전에 다음과 같은 준비가 되어 있어야 한다.
- 로컬 PC내 git bash 설치(로컬PC 스프링부트 소스를 CodeCommit에 올리기 위함)
- 로컬 PC내 스프링부트 프로젝트 생성(gradle 활용)
- CodePipeline/S3 및 EC2 인스턴스 생성(EC2 인스턴스에 서비스 배포를 위함. https://twofootdog.tistory.com/39 참고)
사실 필자가 위와 같은 준비가 된 상황에서 이 글을 쓰고 있으므로 준비사항을 작성해 본 것이다. 위와 같은 준비가 되어 있지 않아도 스프링 프로젝트를 빌드한 후 jar파일을 EC2 인스턴스로 올린 후 RDS와 연동 테스트를 진행해도 상관은 없다.
3. RDS(MariaDB) 생성 후 로컬PC 및 EC2 인스턴스와 연동하기
그럼 RDS를 만들어보자.
AWS 홈페이지에서 [콘솔에 로그인] -> [RDS] -> [Dashboard] -> [데이터베이스 생성]을 선택한다.
[데이터베이스 생성 방식 선택]에서는 [표준 생성]을 선택하고, [엔진 유형]에서는 [MariaDB]를 선택하고 밑에 [버전]을 선택한다.
[템플릿]에서는 [프리 티어]를 선택하고, [DB 인스턴스 식별자]에서는 DB명을 임의로 넣어주고, [마스터 사용자 이름]과 [마스터 암호]에 원하는 이름과 암호를 넣어준다.
[DB 인스턴스 크기]와 [스토리지] 모두 기본값으로 설정한다(프리티어니깐 ㅠ).
[연결]에서 [Virtual Private Cloud]는 EC2 인스턴스와 동일한 VPC를 셋팅해주고, 퍼블릿 엑세스 가능 여부는 [예]를 선택해서 외부에서 접속 가능하도록 설정한다. [VPC 보안 그룹]은 RDS용으로 신규 보안그룹을 생성해준다. 설정이 완료되었으면 [데이터베이스 생성]을 클릭한다.
그리고 몇 분 기다리면 RDS가 생성되게 된다(상태가 생성중->백업중->사용가능으로 변경되면 접속 가능하다).
생성된 RDS를 선택하고 들어가면 RDS 상세정보를 확인할 수 있다.
상세정보에서 나온 [엔드폰인트 및 포트] 정보로 DB에 접속할 수 있다.
[엔드포인트]에 작성된 [db명].[임의문자].[리전].rds.amazonaws.com이 호스트명이고 포트는 3306이다.
[연결 & 보안]에서 조금 밑으로 가보면 [보안 그룹 규칙]이 있고 밑에 [보안 그룹] 리스트가 있다.
추가적으로 할 일은 생성한 RDS에 접속하기 위해 해당 보안 그룹에 접속할 source의 정보를 입력해야 한다.(로컬PC 및 EC2 인스턴스)
클릭해서 보안 그룹으로 들어가보자.
보안그룹에서 [인바운드]탭을 클릭하고 [편집]버튼을 누른다. 그리고 해당 RDS에 접속할 source의 정보를 넣어준다. 첫번째 줄은 필자의 로컬PC 주소이고, 두번째 줄은 RDS에 접근할 EC2 인스턴스가 속해있는 보안그룹의 그룹ID다.
그리고 로컬PC에서 DB 접속 테스트를 해보자. 정상적으로 접근이 된다. 로컬PC->RDS 연결은 성공이다.
다음으로 EC2 인스턴스에서 RDS로 접근해보자. 정상적으로 접근이 된다. EC2 인스턴스 -> RDS 연결도 성공이다.
4. EC2 인스턴스 내 스프링부트 서비스에서 RDS 연동
이제 스프링부트 서비스를 생성한 후 조금 전 생성한 RDS와 연동해 보도록 하자.
스프링부트 서비스는 간단하게 DB와 연동하는 서비스를 구현하면 된다(gradle과 jpa 활용).
RDS와 연동하는 정보를 담은 application.yml파일은 아래와 같이 작성했다.
src/main/resources/application.yml :
spring:
profiles:
active: local
---
spring:
profiles: local
datasource:
url: jdbc:mariadb://gajoa-db.cklyw6tgbrhb.ap-northeast-2.rds.amazonaws.com:3306/gajoa_test_db
username: xxxx
password: xxxxxxxx
driver-class-name: org.mariadb.jdbc.Driver
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: update
[url]은 jdbc:mariadb://[RDS 엔드포인트]:[포트]/[데이터베이스명] 이며, [username/password]는 RDS 생성 시 작성한 username/password다.
위와 같이 작성한 후 빌드한 다음 생성된 jar파일을 EC2 인스턴스에 올려서 java -jar 명령어로 서비스를 수행하거나, 로컬PC와 연동된 CodePipeline이 생성되어 있으면 CodeCommit으로 소스를 push하게 되면 해당 스프링부트 서비스는 수행하게 된다. 해당 스프링부트 서비스가 수행하게 되면 RDS와 연동하여 데이터를 정상적으로 조회해 오는것을 확인할 수 있다.
테스트를 진행한 스프링부트 소스코드는 https://github.com/TwoFootDog/aws_springboot_test_code 에서 확인할 수 있다.
5. 참고
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/Welcome.html