들어가기 앞서 . . .
웹 서비스를 운영하면서 보안을 강화하는 것은 선택이 아닌 필수이다. 특히 사용자의 데이터가 오가는 API 서버에서는 HTTPS 적용이 필수적이다. 저번 강의에서 ELB 셋팅 후 ELB에 별칭을 설정해 도메인 연결까지 해주었다. 이번 글에서는 AWS의 ELB와 ACM(AWS Certificate Manager)를 활용하여, 도메인에 SSL 인증서를 발급하고 HTTP → HTTPS 리디렉션까지 설정하는 전체 과정을 진행해보고자 한다.
RDS란?
RDS(Relational Database Sevice)란 관계형 데이터베이스 서비스이다. MySQL, MariaDB등 여러 관계형 데이터베이스 서비스를 AWS로부터 빌려서 사용하는 형태이다.
RDS를 왜 사용해야할까?
로컬환경에서 개발할 때는 백엔드 서버를 구축하고, 로컬 환경에 설치된 DB를 연동하여 사용한다.
하지만 서버를 배포하면 배포된 서버에서 내 로컬 컴퓨터에 설치된 DB에 접근할 수 있는 방법이 없다. 때문에 DB도 외부 인터넷에서 접근할 수 있게 같이 배포해주어야 한다.
이러한 이유로 AWS RDS라는 데이터베이스를 빌려서 사용하는 것이다. 이 외에도 AWS RDS는 여러 편리한 부가기능(자동 백업, 모니터링, 다중 AZ 등)을 가지고 있다.
EC2에 DB를 직접 설치해서 운영하긴 힘들까?
RDS를 사용하지 않고 EC2에 DB(MySQL 등)를 직접 설치해서 사용하기도 한다.
EC2에 MySQL을 설치하면 별도의 RDS 비용이 나오지 않기 때문에 비용을 절감할 수 있지만 실제 현업에서는 하나의 EC2에 백엔드 서버와 MySQL을 같이 사용하지 않는다.
백엔드 서버의 장애로 인해 EC2 컴퓨터가 죽을 경우, 애꿎은 MySQL도 같이 죽기 때문이다.
정리하자면 현업에서는 EC2와 RDS를 분리해서 인프라를 구성하는 경우가 대부분이다. 하지만 비용이 부담된다면 하나의 EC2에 백엔드 서버와 MySQL을 직접 설치해서 사용해도 무방하다.
EC2와 RDS 간의 아키텍처

사용자가 EC2에 요청을 보내면, EC2 인스턴스 안에 있는 백엔드 서버가 RDS에 직접적으로 요청을 보내는 식의 형태로 설계 할 예정이다.
RDS를 설정해보자.
AWS에 RDS를 검색한 뒤 데이터베이스 생성을 해보자.

필자는 보통 많이 사용하는 MySQL로 실습을 진행하였다.
설정 과정이 많이 다르지 않으니 각자 맞는 DB를 선택하면 된다.


우리가 설계한 RDB에 아무나 접근해선 안된다.
권한이 있는 사용자만 값에 Insert,Update등을 해줄 수 있어야 하기 때문에 그 마스터 자격 증명을 설정하는 부분이다.
DB 인스턴스 식별자와 마스터 사용자 이름, 암호등을 작성해주자.
실습 이후에도 사용할 것이라면 까먹지 않도록 메모장에 적어두는 것을 추천한다.

나중에 보안에 조금 더 신경써서 구성하고 싶을 때는 퍼블릭 액세스를 아니오로 체크하고 RDS를 만들 때도 있다.
하지만 입문할 때는 불편하기 때문에 퍼블릭 액세스를 예로 두고 많이 사용한다.
이렇게 설정하면 보안적으로 치명적인 위험이 있지 않을까 걱정하는 분들이 있다. 생각보다 그렇진 않다. 그러니 안심하고 퍼블릭 액세스를 예로 체크하고 RDS를 만들어서 연습하자.

이후 생성을 누르면 RDS 생성완료!
보안그룹 설정하기
RDS도 결국 하나의 컴퓨터이기 때문에 보안그룹을 필수로 설정해주어야한다. 보안그룹을 설정해주자
EC2 → 보안그룹 으로 들어간 뒤 보안그룹 생성을 눌러주자.

아웃바운드 규칙은 그대로 냅두고, 인바운드 규칙을 생성하여 유형을 MySQL로 둔 뒤에 보안 그룹을 생성하자.

이제 아까 생성한 RDB에 보안 그룹을 적용하기 위해 다시 들어가서 위에 수정을 눌러주도록하자!
보안 그룹에 있던 디폴트 값을 삭제하고 새로 만든 보안 그룹을 선택해준다.


즉시 적용으로 DB 인스턴스를 수정한다.

파라미터 그룹 설정
로컬에서 MySQL을 사용하다보면 설정값을 설정해야할 때가 있다.
이와같이 파라미터 그룹도 RDB 설정값을 파라미터 그룹이라는 것을 활용해서 화면에서 옵션 값을 설정할 수 있도록 만든 것이다.
파라미터 그룹을 생성해보자.

생성을 누르면 성공적으로 파라미터 그룹이 생성된다.
여기서 꼭!!! 엔진 유형을 MySQL Community로 해주어야한다. 필자는 A—-MySQL로 했다가 설정하고자 하는 옵션 값들이 안떠서 시간을 꽤나 날렸다......
생성한 파라미터 그룹의 편집을 눌러서 값들을 수정해주자.

1. 아래 속성 전부 utf8mb4로 설정하기
- character_set_client
- character_set_connection
- character_set_database
- characater_set_filesystem
- characater_set_results
- character_set_server
참고) utf8 대신에 utf8mb4를 사용하는 이유는 ‘한글’ 뿐만 아니라 ‘이모티콘’도 지원이 가능하도록 하기 위해서이다.
2. 아래 속성 전부 utf8mb4_unicode_ci로 설정하기
- collation_connection
- collation_server
참고) utf8mb4_unicode_ci은 정렬, 비교 방식을 나타낸다.
3. time_zone을 Asia/Seoul로 설정하기
다 수정하였으면 변경 사항을 저장한다.
파라미터 그룹이 잘 적용된 것을 확인할 수 있다!


이제 다시 만들었떤 RDB를 수정해서 파라미터 그룹을 적용해보자.
가장 아래에 추가 구성을 눌러 DB 파라미터 그룹을 디폴트에서 방금 만든 파라미터 그룹으로 수정 후 변경사항을 저장해주자.

수정이 성공적으로 됐다!
추가로 아까 Asia Seoul 시간으로 적용한 time_zone은 DB를 재부팅 해야지만 설정이 적용되기때문에 한 번 재부팅을 해주면 된다.
RDS에 접속하기
이제 성공적으로 RDS를 생성했으니 접속해보자.
데이터베이스 관리툴이면 아무거나 상관없다.
우선 만든 RDS에 들어가서 연결 및 보안을 보면 엔드포인트 및 포트를 확인할 수 있다.
엔드포인트란?
엔드포인트란 특정 리소스(ex. 서버, DB 등)에 접근할 수 있도록 해주는 URL을 의미한다.
간단하게 DB의 주소라고 생각하면 된다. 아래의 DB를 참고해서 RDS에 접속해보자.

참고로 필자는 DBeaver를 사용하였다!
위에 콘센트 버튼을 눌러서 새 데이터베이스 연결을 해준다.

Server Host에 RDS의 엔드포인트를 입력하고, Username과 password는 RDS설정 시 마스터 사용자 이름과 비밀번호를 입력해주면 된다.


혹시나 이런 알림이 뜨면 MySQL 접속용 드라이버가 설치 되지 않았으니 다운로드를 해주자
근데 다 분명 맞는 정보를 기입했으나 Public Key Retrieval is not allowed라는 오류가 발생한다.
구글링해보니 MySQL의 8.x 버전 이후부터 발생하는 문제라고 한다.

Main 옆에있는 Driver properties로 들어가서 allowPublicKeyRetrieval을 TRUE로 변경해주자.

성공적으로 생성되었다!

들어가기 앞서 . . .
RDS를 써보니 확실히 편하다. 설치, 백업, 모니터링 같은 귀찮은 걸 AWS가 알아서 해준다.
EC2에 DB를 직접 깔아 쓰는 게 비용은 조금 덜 들 수 있다. 하지만 서버가 죽으면 DB도 같이 죽는다..
그리고 공부하면서 느낀게 파라미터 그룹을 만져서 UTF-8 세팅이랑 타임존을 맞추는 게 생각보다 중요하다. 안 해두면 한글이 깨진다거나 시간이 꼬이는 경우가 생긴다. 이번에 RDS 세팅부터 접속까지 해보니까 앞으로는 DB 환경 세팅에 덜 쓸데없는 시간 쓸 수 있겠다 싶다.
