[1/2] AWS DMS를 사용하여 Heroku adds-on DB를 Beanstalk RDS로 migration하기 (DB 마이그레이션)
사용 동기
지난 2주 동안 Heroku 기반으로 돌아가는 서버를 AWS 인프라로 완전히 migration하기 위해 열심히 삽질을 하였다.
어떤 AWS 인프라를 사용하여 배포할지 자료도 많이 찾아봤는데, 그 중 고민됐던 서비스들은 ECS Fargate과 Elastic Beanstalk이었다.
최종적으로는 Elastic Beanstalk Node.js 플랫폼을 사용하여 배포하기로 하였다. 그 이유는 ECS Fargate와 Beanstalk(docker 플랫폼) 서비스들은 로컬에서는 분명 실행이되는데, Production 환경에서만 실행하면 컨테이너들끼리 depends_on이 잘 되지 않아 항상 Node.js 프로세스가 죽었다. 그래서 Docker를 프로덕션에서 사용하는 것은 조금 미루기로했다. 무튼 그래서 DMS를 사용하게 되었다.
DMS 란?
Database migration service 약어이다.
이름으로 예상 가능하듯이 데이터베이스 간에 마이그레이션을 해주는 서비스이다.
개념 설명
복제 인스턴스
원본(source) 데이터베이스는 매우 중요하다.
그렇기에 원본 데이터를 가지고 마이그레이션하는 것은 좋은 선택은 아닐 것이다.
그러므로 원본 데이터를 한 인스턴스에 그대로 copy(복제)해놓고, 그 인스턴스를 통해 마이그레이션을 진행한다
엔드포인트
소스 엔드포인트, 대상 엔드포인트가 있다.
나의 경우에는 소스 엔드포인트는 Heroku RDS이고, 대상 엔드포인트는 Elastic Beanstalk에 붙인 새로운 RDS이다.
DB 마이그레이션 시작
1. DMS 콘솔로 이동
2. 복제 인스턴스 생성 -> 디폴트로 선택하고 생성 클릭
3. 소스 엔드 포인트 생성
엔드 포인트 생성 클릭 -> 소스 엔드포인트 선택한다.
엔드포인트 데이터베이스에 액세스는 아래를 참조.
* 주의할 점은 SSL 모드를 요구로 체크해주자.
우리가 소스 엔드포인트인 heroku RDS에 접근하기 위해서는 SSL를 사용해 연결해야한다.
4. 대상 엔드포인트 생성
대상 엔드포인트 유형은 Beanstalk이 생성해준 RDS 인스턴스를 아래와 같이 선택한다.
또 아래와 같이 Target endpoint에 대한 정보를 입력한다.
Elastic Beanstalk이 만들어준 db라서 데이터베이스 이름은 디폴트가 ebdb 이다.
엔드포인트를 생성한다.
그럼 아래와 같이 2개 엔드포인트 생성이 완료되었다.
이제 소스 엔드포인트를 가지고 연결 테스트를 해야한다.
소스 엔드포인트 -> 작업 -> 연결 테스트 -> part 2에서 생성한 복제 인스턴스 선택 -> 테스트 실행
상태가 successfull이 되었으면 다음 단계로 간다.
5. 데이터베이스 마이그레이션 테스크를 생성.
데이터베이스 마이그레이션 테스크 탭 -> 테스크 생성 -> 복제 인스턴스, 소스/대상 엔드포인트 선택 -> 전부 디폴트로 선택하고 테스크 생성
진행율이 100%가 되면 성공적으로 마이그레이션이 되었다 ✅
대상 엔드포인트로 접근해서 테이블에 데이터가 정상적으로 있는지 확인해보면 있을 것이다!
DBMS version 차이로 인한 Bug
나의 경우 마이그레이션 후 데이터가 잘 복제되었지만 바로 프로덕션에 적용가능한 상태는 아니었다.
그 이유는 Source PostgreSQL 버전과, Target PostgreSQL 버전이 맞지 않아서 row를 Insert할 때, primary key가 Null이 되는 버그가 있었다. DDL을 확인해보니 id column의 uuid type default constraint가 기존 설정과 달랐었다. 관련하여 겪은 버그 사항은 다음 글에서 다루겠다.