[AWS] EC2 에 RDS 연동하기 (Feat. MySQL) 👑
개요 🔔
이전 포스팅을 확인 해 보면,
AWS
에서 생성한 EC2
인스턴스에 MySQL
을 설치하여 외부에서 접근이 가능한 환경을 구축했다.
다만 문제가 있었다.
프리티어 로 생성한 서버였기에
t2.micro
메모리로는 MySQL
까지 돌리기에는 버거웠는지 서버가 종종 터지는 경우가 발생했다.
Git
을 설치하여Node
서버가 존재함
보통 위와같은 화면이 지속되면 서버가 터졋다 라고 간주할 수 있다.
해당 문제를 해결하기 위해 조언을 구하고 얻은 답변을 통해
도커의 이미지로
EC2
와DB
를 분리하여 띄워도 보고,
조금 더 가벼운SQLite
로 마이그레이션 하여 환경을 구축 해 봤지만
해당 이슈를 해결할 수 없었다 😭
해당 포스팅에서는 마지막 최후의 방법인,
RDS
사용하여 데이터베이스를 구축하고 인스턴스와 연결하는 과정을 기록하고자 한다.
RDS ❓
RDS
란, AWS
에서 제공하는 관계형 데이터베이스이다.
클라우드 환경에서 제공하는 관계형데이터베이스를 통해 보다 쉬운 설정, 운영 및 확장의 기능까지 제공한다.
인스턴스 내부에
MySQL
을 설치하여 사용해도 무관하지만,
위에서 발생한 이슈도 존재할 뿐더러 여러 방면에서 효율적이지 못하다고 한다.
RDS
에서 제공하는 스냅샷
기능이 있는데,
이는 데이터베이스를 일정한 주기로 저장하여 예상치 못한 삭제나 버그 등으로 발생한 이슈에서 롤백이 가능하다.
예약 인스턴스
기능은,
데이터베이스를 실행하는 시간을 사전에 정의해둠으로써
프리티어로 제공된 시간 안에서 보다 많은 서버를 돌릴 수 있다.
RDS 생성 🚀
서비스 검색에서 RDS
를 검색 후 데이터베이스 탭에서 생성 가능하다.
다양한 데이터베이스를 제공하는데 해당 포스팅에서는 MySQL
환경을 선택 해 생성할 것이다.
Amazon Aurora
도MySQL
과 작동방식은 같지만 보다 우수한 성능을 자랑한다 라고 일단 알고있자 ❗❗
낮은 버전으로 생성 할 경우,
레거시코드를 사용하면 작동되지 않은 버전이 존재할 수 있기에 가급적 최신 버전을 유지하도록 하자.
지정한 식별자를 통해 데이터베이스에 접근하기 때문에,
가급적 식별자를 자세히 명시 해 주는것이 좋다.
이제 생성된 데이터베이스를 MySQL
에서 제공하는 GUI
프로그램인 워크벤치를 통해 연결 해 보려고 한다.
RDS 연결
사실 데이터베이스를 비쥬얼라이징 도구 (GUI) 에서 확인하는 방법은 매우 간단하다.
생성된 데이터베이스의 상세정보를 확인 해 보면,
엔드포인트가 생성 되어있을텐데 이를 워크벤치의 Host
부분에 넣어주면 끝이다.
음.. 근데 연결에 실패했다 🤦♂️
위와 같이 연결에 실패 할 경우 체크해야할 부분이 2️⃣ 개가 있다.
퍼블릭 엑세스
인바운드 규칙
예상했던 대로 인바운드 규칙
이 추가되지 않아 해당 포트(3306
) 으로의 접근이 불가능한 상태였고,
이를 보안그룹에서 추가 해 주었다.
Test Connection
을 해 보면 아래와 같이 정상적으로 연결 됨을 확인할 수 있다.
EC2 와의 연결 🔌
생성된 인스턴스
와 RDS
, 보안그룹
, 서브넷그룹
모두
같은 네트워크 안에서 사용해야 하기 때문에 해당 정보를 파악하고 있어야 한다.
빨간 네모 영역의 정보를 사용할 것이다.
EC2
와 RDS
를 연결하기 위해서는,
인스턴스를 생성할 때 사용된 VPC
를 기준으로 RDS
를 생성 해 주어야 한다.
해당 자료는 어떤 레퍼런스에서도 설명이 없어 굉장히 많은 삽질을 해서 얻은 결과이다.. 😭
나의 경우 각각 독립적으로 인스턴스
와 RDS
를 생성 해 놓은 상태였고,
VPC
또한 하나에 몰아서 생성하는 경우 보안적인 이슈가 발생할 수 있다 라고 인지하고 있는 상태였기에,
서비스마다 새 VPC
를 생성하여 분리 생성 해 놓은 상태였다.
이미 생성 한 서비스는
VPC
를 변경 할 수 없다.
보안그룹 생성 🚧
위에서 한 번 설명했듯,
EC2
와 연결하기 위해 인스턴스
에 연결 해 놓은 보안그룹에 RDS
보안그룹을 생성 해 줄 것이다.
이게 무슨 말이냐 ?
이런 형태로 통신이 이루어질 것이다.
먼저 인스턴스를 생성하면서 발급받은 VPC
아래에
인스턴스
와 보안그룹1
과 보안그룹2
가 존재 할 것이고,
그 VPC
를 기준으로 RDS
를 생성하여 종속되게끔 지정 해 주는 것이다.
기본 값으로 RDS
를 생성 할 때 정의한 default
보안그룹이 연결되어있을 것이다.
이 보안그룹에 접근하여 아래와 같이 추가 해 주면 된다.
소스
부분에는EC2
에 연결되어있는 보안그룹 ID 를 선택 해 주면된다.
해당 보안그룹 역시 하나의VPC
안에서 생성 했다면 선택할 수 있는 드롭다운박스에서 선택할 수 있을것이다.
MySQL 제거 🚫✅
먼저 인스턴스를 연결하여 터미널에 접근 해 ls
명령어로 현재 디렉토리상의 파일/폴더
를 확인한다.
아래 명령어를 실행하여 MySQL과 관련된 모든 패키지와 설정 파일들을 완전히 제거 해 준다.
sudo apt-get purge mysql* -y
-y
옵션은 사용자에게 확인 메세지를 표시하지 않고 강제로 제거하기 위해 추가
그리고 MySQL
관련 디렉토리를 모두 제거 해 준다.
sudo rm -rf /var/log/mysql
sudo rm -rf /var/log/mysql.*
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
이렇게 다시 ls
로 확인 해 보면 mysql
폴더가 사라졌음을 확인할 수 있다.
더불어 아래 명령을 통해 MySQL
이 제거되었는지 확인할 수 있다.
(만약 제거가 되지 않았다면 버전이 정상적으로 출력이 될 것임.)
특정 IP 주소 접근 🌐
기존에 설정한 보안그룹의 인바운드 규칙
에서는
테스트 목적으로 모든 접근을 허용하기 위해 0.0.0.0
으로 지정했었다.
하지만 이는 보안적으로 외부 침입에 대한 이슈가 발생할 수 있기에 안전하지 않다.
그렇기에 팀원들의 ip
주소만 허용하여
특정 주소만 DB
에 접근이 가능하게 설정 해 주려고 한다.
설정을 모두 마친 모습은 아래와 같다.
해당 ip 주소는 각 로컬 커맨드 창에서 ipconfig
명령으로 주소를 획득할 수 있으며,
이를 넣어주면 된다.
외부 접근 IP 💻
테스트 해 본 결과 ipconfig
로 획득한 ip 주소는,
말 그대로 로컬 컴퓨터 자체의 ip 주소 이며 외부와 통신이 불가능 한 형태였다.
해당
IPv4
주소를 인바운드 규칙에 추가 시MySQL
접근 안됨 ❗❗
검색 해 본 결과,
AWS
의 RDS
는 외부에서 운영중인 서비스 이므로 해당 서비스에 접근하기 위해서는
인터넷을 통해 접속 가능한 외부 IP 주소 를 획득하여 추가해야한다고 한다.
Window 환경
👉 https://www.whatismyip.com/
Linux 환경
👉curl ifconfig.me
Mac 환경
👉ifconfig
oripconfig getifaddr en0
문제는,
해당 IP 주소는 연결된 네트워크의 환경에 따라 동적으로 바뀌게 된다.
가장 쉬운 방법은
AWS
에서 팀원들에게 할당해준 IAM
유저로 인바운드 규칙에 접근하여 직접 내 IP 를 추가 해 주는것이다.
이를 통해
매번 다른 환경(장소 👉 집, 카페, 학교, etc..) 에서
접속한 네트워크 환경마다 다른 ip 주소를 추가하여 DB 에 접근할 수 있었다.
Reference 🌊
https://velog.io/@yoonth95/AWS-04.-RDS-MySQL-%EC%97%B0%EA%B2%B0-%EB%B0%8F-Workbench#1-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1
https://dooyeoung.tistory.com/31
https://deepmal.tistory.com/9
https://velog.io/@whytili/AWS-RDS%EC%99%80-EC2-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0