-
[AWS + Spring] EB + Spring Boot + Aurora RDS 연동 및 Read/Write 분산 처리 (1)Spring 2023. 1. 4. 11:50반응형
이번 포스팅에선 Spring Boot에 Aws Aurora RDS를 연동하고 Read와 Write의 부하 분산 처리를 구성하여
Elastic Beanstalk에 배포(jar)하는 예제를 진행한다 .
+ 추가적으로 Intellij Database Tool에 SSH 터널링으로 Aurora 연동까지 진행한다.
시작하기 전에 Database Replication의 간단한 개념을 살펴보자.
Database Replication
- Database Replication은 데이터베이스를 복제하는걸 말하는데 기준이 되는 서버가 Primary, 복제 서버는 Secondary라고 한다.
- 기준이 되는 Primary는 1대로 구성되며 복제된 Secondary는 N대로 구성된다.
Database Replication 구성하는 이유
- 트래픽이 급증할 경우 1대의 데이터베이스에 쓰기(insert, update, delete)와 읽기(select)를 모두 처리하게될 시 많은 부하가 발생되는데 이러한 부하를 분산하기위해 Primary에서는 쓰기를 Secondary에서는 읽기를 처리하게끔 구성한다.
- Secondary를 N대로 구성하는 이유는 어플리케이션에서 데이터베이스에 액세스할 때 쓰기보단 읽기가 더 많이 발생되고 처리시간도 더 오래 걸릴 수 있기 때문이다.
실습환경
- Intellij Ultimate
- JAVA 17
- Spring Boot 2.7.3
- Maven
- AWS RDS Aurora(MySQL)
- 개발 서버 환경 기준 (Not Local)
📌 시작하기
1. AWS Key Pair 생성
EC2 SSH 연결을 위해 Key Pair를 생성한다.
EC2 > 네트워크 및 보안 > 키 페어 클릭
이름을 입력하고 키 페어를 생성하면 pem file을 다운 받을 수 있다. 이 pem file을 잃어버리면 연결을 할 수 없기 때문에 주의하자.
2. Elastic BeanStalk 생성
애플리케이션, 환경 이름을 입력한다.
jar 배포를 할 예정이기 때문에 플랫폼은 Java 선택 후 하단에 '추가 옵션 구성'클릭
위에서 생성한 Key pair를 등록 하기 위해서 '보안' Tab에 편집 클릭
EC2 키 페어에 test-key를 선택해주고 '환경 생성'을 클릭하여 Elastic Beanstalk 환경을 생성한다.
3. Bastion Host EC2 생성
💡 Bastion Host
- 보안을 위해 고안된 Host로 외부 네트워크와 내부 네트워크 사이에서 일종의 게이트웨이 역할을 수행하는 호스트를 뜻한다.
특히 Private IP로만 접근이 허용된 서버를 외부에서 접속하고자 할 경우, Bastion Host를 경유해 Private IP 서버에
접근하도록 설계 된다.
- 이 포스팅에선 추후 bastion host를 이용한 SSH 터널링으로 Intellij Database Tool(BI)에 연동하기 위해서 구성한다.
* BI 연동이 필요하지 않거나 직접 Aurora Server에 접속할 필요가 없으신 분은 넘어가셔도 됩니다.
EC2 > 인스턴스 시작 클릭
인스턴스 이름 입력, Amazon Linux 2 AMI 선택
인스턴스 유형은 테스트 용도이기 때문에 t2.micro를 선택한다.
위에서 만든 키 페어를 지정해준다.
보안 그룹 생성 > SSH 트래픽 허용 체크 (규칙은 테스트이기 때문에 0.0.0.0/0 선택)
인스턴스 시작 클릭 (보안 그룹은 추후 설정 예정)
4. AWS Aurora Cluster 생성
RDS > 데이터베이스 생성 화면에서 Amazon Aurora MySQL 호환 버전 클릭
본인 환경에 맞춰 프로덕션 & 개발/테스트 중 선택 (본 포스팅에선 프로덕션 선택)
DB 클러스터 식별자를 입력한다.
그리고 마스터 사용자(관리자) 의 아이디 와 패스워드를 지정해야 하며 admin 이라는 계정 대신 다른 계정을 설정해서 사용해도 된다.
인스턴스 메모리는 테스트를 위해 낮은 용량 선택 (버스터블 클래스 선택시 가장 낮은 용량 사용 가능)
Aurora 복제본은 따로 생성할 예정이기 때문에 현재는 생성하지 않는다.
EC2 컴퓨팅 리소스 연결을 클릭 하여 위에서 생성했던 Elastic Beanstalk EC2와 연결한다.
(보안그룹 자동 연결 위해)
Default VPC, SubNet 선택
퍼블릭 액세스 차단 (EC2 연결을 설정했기 때문에 Default로 '아니요'가 체크 되어 있다)
테스트이기 때문에 모니터링 체크해제
초기 데이터베이스 이름 입력
default parameter group 선택 (추후 파라미터 그룹 생성 예정)
장애 조치 우선 순위는 마스터 인스턴스의 장애시 다수의 읽기 복제본 중에서 기본 인스턴스로 승격 시킬 인스턴스에 대한 우선 순위를 지정하는 옵션이다. 우선 순위가 가장 높은 복제본(티어 0으로 시작)을 새로운 기본 인스턴스로 승격시킨다. 본 포스팅에서는 현재 읽기 복제본이 없으므로 가장 높은 우선 순위(티어 0)로 설정하고 진행한다.
테스트 환경이므로 추가구성 하단에 '삭제 보호 활성화', '암호화 활성화' 해제
데이터베이스 생성 클릭
생성 완료된 화면 확인 (리전, 라이터 인스턴스 생성)
보안그룹 수정 (인바운드 규칙 3306 PORT 추가)
5. Bastion Host EC2, RDS Security Group 수정
- Aurora RDS를 생성할 때 연결한 EC2는 Bastion-Host EC2가 아닌, ElasticBeanStalk의 EC2이다.
- 추후 SSH 터널을 사용하여 DataBase BI에 연동 하려면 Bastion Host, Aurora RDS간의 보안그룹을 수정해주어야 한다.
EC2 > bastion-host 클릭하여 보안 Tab에서 보안 그룹 클릭
보안그룹 아웃바운드 편집하여 3306 Port 및 Aurora RDS 보안그룹 지정 추가
수정 화면 확인
Aurora RDS 보안그룹의 인바운드 규칙을 보면 EB의 보안그룹만 연결되어 있다.
Bastion Host의 보안그룹도 지정해주어야 한다.
수정 하면 최종적으로 Aurora의 인바운드에는 EB EC2, Bastion Host EC2 두 가지의 보안그룹이 연결 되게 된다.
6. bastion-host 연결 확인
EC2 > bastion-host > 상세 페이지 > '연결' Tab 클릭
'예' 에 나와있는 ssh 명령문을 복사한다.
~/.ssh chmod 400 test-key.pem ~/.ssh ssh -i "test-key.pem" ec2-user@[Your ec2 endpoint]
pem key 권한 수정 및 복사한 ssh 명령문을 터미널에서 입력하여 bastion host EC2에 접속한다.
sudo yum install mysql
접속한 EC2에서 Mysql을 다운로드 한다.
RDS > 데이터베이스 화면에서 '라이터 인스턴스'의 엔드포인트를 확인한다.
[ec2-user@ip-address ~]$ mysql -h [cluster endPoint Url] -u admin -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 21 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
mysql 명령문을 이용하여 Aurora Writer Instance에 성공적으로 접속한 것을 확인할 수 있다.
이어서 다음 포스팅에선 Aurora Reader Instance 생성 후, Intellij Database Tool(BI)에 연동까지 할 예정이다.
Reference: https://hoing.io/archives/24482
반응형'Spring' 카테고리의 다른 글
[AWS + Spring] EB + Spring Boot + Aurora RDS 연동 및 Read/Write 분산 처리 (3) (0) 2023.01.14 [AWS + Spring] EB + Spring Boot + Aurora RDS 연동 및 Read/Write 분산 처리 (2) (0) 2023.01.04 [Spring] Spring에서 CORS 처리(설정)하는 방법 (0) 2022.10.27 [Spring] Spring에서 Scheduler 처리하기 (0) 2022.10.26 Spring Boot 공통 Global Exception Handler (0) 2022.10.23