AWS RDS란 관계형 데이터베이스를 간편하게 클라우드에서 설정, 운영, 확장이 가능하도록 지원하는 웹 서비스이다.
RDS는 MySQL이나 오라클 같은 데이터베이스의 설치, 모니터링, 백업, 알람 등 관리를 대신해주며, 하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같이 잦은 운영 작업을 자동화하여 비용 효율적이고 크기 조정 가능한 DB 서비스를 제공한다.
따라서 RDS를 통해 개발자는 DB 인프라를 구성하는데 힘을 들이지 않고, 개발이라는 본질적인 작업에 집중할 수 있게되는 장점이 있다.
물론 EC2 자체가 컴퓨터니까 EC2 인스턴스에 직접 데이터베이스를 설치해서 사용해도 된다.
하지만 AWS RDS는 EC2에 RDB(관계형 데이터베이스)를 직접 구축하여운영할 때보다 더 많은 부분을 자동으로 관리할 수 있어 편리하기 때문에 많이 애용된다.
RDS의 데이터베이스의 제공 방식은 EC2와 비슷하다.
EC2 인스턴스를 생성해서 컴퓨팅을 사용하듯이, RDS 인스턴스를 생성해서 DB를 사용하는 원리이다.
하지만 EC2같이 유저가 시스템에 직접 로그인은 불가능하다.
그래서 RDS 인스턴스의 OS패치, 관리 등은 AWS가 전담 한다.
또한 RDS는 데이터베이스 모니터링 기능을 지원해주는데, DB에서 발생하는 여러 로그 (Error Log, General Log 등)를 CloudWatch와 연동하여 확인도 가능하다.
RDS는 기본적으로 VPC 안에서 동작하며, 기본적으로 public IP를 부여하지 않아 외부에서 접근 불가능하다.
다만, 설정에 따라 public으로 오픈 가능하며 대신 로드밸런서 같이 DNS로만 접근이 가능하다.
VPC 내에서 동작하는 서비스이니 당연히 서브넷과 보안그룹 지정도 필요하다.
EC2 인스턴스를 생성할때 EC2 타입과 EBS 타입을 고르듯이,
RDS 인스턴스를 생성할때도 인스턴스 타입을 지정해주어야 하며, 스토리지는 EBS를 그대로 활용하기 때문에 EBS 타입의 선택도 필요하다.
그리고 RDS는 유동적으로 데이터 저장소 용량을 증설하는게 아닌, 생성시 EBS의 용량을 지정해서 생성한다. (추후에 용량 증설 가능)
cf) AWS 데이터베이스 서비스인 Amazon Aurora는 용량지정 X, 사용한만큼만 비용 지불
RDS의 가장 큰 특징은 파라미터 그룹(Paramater Group) 시스템인데, 이는 DB의 설정값들을 모아 그룹화한 개념이다.
이 DB 설정들을 모은 그룹을 각 DB 인스턴스에 적용시켜 DB의 설정값을 적용하는 시스템인이다.
왜냐하면 위에서 말했듯이 직접 RDS 인스턴스 수정이 불가능 하기 때문에 이런 우회적인 방법으로 설정값을 세팅하는 원리이다.
Tip
AWS 프리티어로는 RDS를 12개월동안 단일 AZ, db.t2.micro 인스턴스를 750시간 무료 사용할 수 있다.
RDS에서는 Amazon Aurora, PostgreSQL, MySQL, MariaDB, Oracle, MS SQLServer 총 6개의 데이터베이스 엔진 중에서 원하는 DBMS를 선택할 수 있다.
또한 AWS Databae Migration Services를 사용하여 기존 데이터베이스를 Amazon RDS로 손쉽게 마이그레이션 또는 복제 할 수 있다.
Info
- Amazon Aurora는 MySQL 및 PostgreSQL호환 관계형 데이터베이스로, 오픈 소스 데이터베이스의 간편 성과 비용 효율성을 결합한 것이다. Amazon Aurora의 속도는 표준 MySQL 데이터베이스보다 5배, PostgreSQL 데이터베이스보다 3배 빠르다고 한다. 또한 상용 데이터베이스의 보안, 가용성 및 안전성을 1/10의 비용으로 제공하기도 한다.
- PostgreSQL은 오픈 소스 관계형 데이터베이스 중 기능도 많고 성능도 좋은 거의 원탑의 데이터베이스이다.
- MySQL은 세계적으로 가장 많이 사용되는 오픈 소스 관계형 데이터베이스다. Amazon RDS를 통해 비용 효율적이고 크기 조정이 가능한 MySQL 서버를 몇 분 안에 생성할 수 니다. 백업, 소프트웨어 패치, 모니터링, 확장 & 축소, 복제 같은 시간이 걸리는 작업은 모두 관리되므로 사용자는 개발에만 집중할 수 있다.
- MariaDB는 MySQL을 개발한 개발자가 만든 오픈 소스 관계형 데이터베이스 이다. MySQL 업그레이드 판 이라고 봐도 된다. MySQL과 동일하게 Amazon RDS를 통해 효율적인 MariaDB 데이터베이스를 생성할 수 있고, 모든 시간 소모적 작업을 대신 처리해 준다.
- Oracle는 오라클사의 유료 관계형 데이터베이스로서, RDS를 사용해 클라우드에서 손쉽게 배포, 설정, 운영 할 수 있는 완전 관리형 상용 데이터베이스이다. 다만 유료 데이터베이스라 라이선스 비용이 든다.
- SQL Server(MSSQL)는 Microsoft에서 개발한 관계형 데이터베이스 관리 시스템으로 Amazon RDS를 통해 손쉽게 배포, 운영, 확장이 가능하다.
사용한 만큼만 비용 지불
자동 백업(Automated Backups) 줄여서 AB는 매일마다 스냅샷과 트랜잭션 로그를 참고하여 자동으로 백업을 해준다.
RDS에서는 디폴트로 AB 기능이 설정되어 있다.
그리고 AB를 통해 데이터베이스를 Retention Period(1~35일) 안의 과거 특정 시간으로 되돌아갈 수도 있다.
단, 롤백 동작은 과거 상태로 그대로 돌아가는게 아닌, 다른 DB 인스턴스를 새로 생성해서 스냅샷을 적용 시키는 형식임을 유의하자.
RDB 백업 정보는 S3에 저장되며, AB동안 약간의 I/O suspension(딜레이)이 존재할 수 있다.
그나마 Multi-az로 하면 Standby를 통해 백업을 수행하기 때문에 딜레이가 덜하다.
AB(자동 백업)이 자동으로 스냅샷을 떠서 백업하는 것이라면, 수동 백업은 유저 혹은 다른 프로세스로부터 요청에 따라 만들어지는 DB 스냅샷이다.
즉, EC2 스냅샷을 뜨듯이 사용자에 의해 수동적으로 진행되는 백업이다.
만약 원본 RDS를 삭제한다고 하더라도, 스냅샷은 S3 버킷에 그대로 존재한다. 따라서 스냅샷만으로 RDS 인스턴스를 복원시킬 수 있다.
반대로 AB 백업 기능은 인스턴스를 삭제할 때 스냅샷도 모두 없어진다는 특징이 있다.
이 역시 스냅샷의 복구는 항상 새로운 DB Instance를 생성 하여 수행되며,
만약 데이터베이스를 복구해야 한다면, 새로운 DB를 만들고 기존 DB의 연결을 끊고 새로 만든 DB에 연결해주는 작업이 필요하다.
원본 RDS 인스턴스를 가지고 새로운 DB를 복원시 새로운 인스턴스와 Endpoint가 생성된다.
원본 DNS는 앞에 original인 반면, 복원된 것은 앞에 restored가 붙게된다.
EC2 인스턴스 생성
디비 관리 및 접속 테스트를 위한 인스턴스를 생성하고 테스트에 필요한 어플을 설치한다
sudo yum install -y mysql-community-client
IAM을 통한 인증은 SSL 통신이 필수이므로 테스트 EC2에 인증서를 설치
sudo mkdir -p /var/mysql-certs
cd /var/mysql-certs
wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
RDS를 생성할 때 아래와 같은 선택항목이 보인다면 IAM Authentication을 지원하는 RDSdlek. 만약 아래 항목이 보이지 않는다면, 디비 엔진의 종류나 버전 혹은 인스턴스 사양을 변경하여 봐야 한다고 한다.
RDS가 생성되었다면 테스트용 EC2에서 RDS로 정상적으로 디비 접속이 이루어지도록 네트워크 및 보안그룹을 조정한다.
테스트용 EC2에서 RDS에 DB 관리자로 접속하여 다음과 같이 DB 사용자를 생성해보자 ㅎ
mysql> CREATE DATABASE testdb;
mysql> CREATE USER dbuser1_iam@`%` IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
mysql> GRANT ALL PRIVILEGES ON testdb.* TO dbuser1_iam@'%';
mysql> FLUSH PRIVILEGES;
아래와 같은 인-라인 정책을 가진 iam-access-to-rds 란 이름의 정책과 iam-access-to-rds-role 란 이름의 역할을 만들어 정책을 역할에 연결하고, 역할을 테스트용 EC2 인스턴스에 부여한다고 한다..
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:ap-northeast-2:123456789123:dbuser:db-FGRFXSIXQ5ABCOPJRQQM7BSPZXJI/dbuser1_iam"
]
}
]
}
위의 리소스 항목에서 db-FGRFXSIXQ5ABCOPJRQQM7BSPZXJI는 RDS의 리소스 ID이고 dbuser1_iam는 IAM 인증방식으로 접속을 허용할 DB 사용자이다.
테스트용 EC2에서, 먼저 임시 인증 토근을 발급받는다.
RDS_HOST="database-2.c3tmz7ki9hed.us-west-2.rds.amazonaws.com"
DB_NAME="testdb"
DB_USER="dbuser1_iam"
TOKEN="$(aws rds generate-db-auth-token –hostname $RDS_HOST –port 3306 –region us-west-2 –username $DB_USER )"
이제 발급받은 토큰을 패스워드로 하여 DB 접속을 한다.
mysql –host=$RDS_HOST –port=3306 –ssl-ca=/var/mysql-certs/rds-combined-ca-bundle.pem –enable-cleartext-plugin –user=$DB_USER –password=$TOKEN $DB_USER