AWS

[2/2] AWS DMS 마이그레이션 후, PostgreSQL 버전 차이로 인한 primary key constraint 버그 (DB 마이그레이션)

2donny 2021. 11. 26. 04:36

 

문제 상황

데이터가 정상적으로 마이그레이션됐는데 예약이 안 되는 버그가 발생했다.

 

> eb logs --debug

 

 

eb cli인 위 커맨드로 로그를 확인했다.

그리고 다음과 같은 SQL failed 에러를 발견했다.

 

500 error log

 

 

id가 default로 생성되지 않아서 생긴 500번 에러였다.

좀 이상했다 users.id는 원래 아래 TypeORM 데코레이터에 의해 Auto generated 돼야 하는데 말이다.

 

@Entity({ name: 'users' })
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;
}

 

 

그래서 postico로 DDL을 찾아보기 시작했다.

 

그리고 머지않아 정답을 발견했다.

 

 

 

Table DDL 관찰

원본 RDS의 Reservation 테이블 DDL

 

 

 

새로 생성한 RDS의 Reservation 테이블 DDL

 

 

 

마이그레이션하면서 모든 테이블의 Primary key에 대한 default 옵션인 uuid_generate_v4() 이 적용이 되지 않았던 것이다.

 

 

찾아보니 heroku로 프로비저닝 한 RDS의 PostgreSQL 엔진의 버전은 13.4였고, Beanstalk에 붙인 RDS PostgreSQL엔진 버전은 13.3이었다. 확실히 버전 차이인지는 모르겠으나 현 상황에서는 가장 유력하다.

 

 

 

문제 해결

 

일단 원인 규명보다는 문제 해결이 더 급하기에, 아래 SQL 문으로 모든 테이블의 id Column에 대한 Default를 옵션을 Update 해줬다.

 

ALTER TABLE reservations ALTER COLUMN id SET DEFAULT uuid_generate_v4();

 

 

다행히도 문제가 해결되어 예약 생성이 잘 되었다.

 

이렇게 Heroku 기반 서버에서 AWS 서버로 마이그레이션에 성공하였다.

 

AWS로부터 얻을 수 있는 모든 이점을 누리기 위해, CloudWatch를 좀 잘 붙여서 모니터링/알람 시스템 구축까지 하는 것이 나의 최종 목표이다.