[장애 회고] prisma 메이저 업데이트 후 장애

June·2024년 5월 18일
0

장애 회고

목록 보기
1/1

장애 시기

2024.05.17 16:55 ~ 17:10

장애 상황

prisma 패키지 메이저 버전 업데이트 (4.13 -> 5.14) production 배포 직후 몇몇 api에서 prisma 관련 에러 발생

상세 원인

예시

Code level

  • query param validation 누락
    • 배열 타입의 query param에 validation 을 위한 데코레이터가 누락 되어 있어 단일 인자와 배열 인자가 모두 요청으로 들어올 수 있었던 상황이었으나 단일 인자의 transform 없이 비즈니스 레이어까지 인자가 전달
    • 4.13 버전의 prisma는 조회 시 where 조건의 in 의 값으로 배열단일 인자 가 모두 가능하고 업데이트 했던 5.14 버전의 경우 배열 만 가능하도록 변경됨
    • 단일 인자로 요청한 경우 그대로 prisma 의 인자로까지 해당 요청 값이 전달되어 장애 발생
// 문제 상황 예시 query dto
export class TestDto {
  @IsOptional()
  // 배열임에도 validation 누락 
  status?: TestStatus[];
}
  • findUnique 함수의 버그 (?)
    • 이전 버전에는 custom unique 제약 조건 (ex @unique('fileName', 'constraint_name') ) 이 설정된 필드를 쿼리 조건으로 설정해도 문제가 없었으나 업데이트 후 custom unique 설정된 필드의 경우 에러가 나고 장애가 발생
# 문제 상황 예시 스키마
model Test {
	userId @Int
    
    @unique(['userId']. 'test_unique_user_id')
}
prisma.test.findUnique({
  where: { userId } // 여기서 에러 발생
});

Operation level

  • QA의 부재
    • 패키지의 메이저 버전 업데이트라는 위험도가 높은 작업이었으나 qa 없이 바로 프로덕션에 적용
  • QA 이전 e2e 테스트의 부재
    • 본래 QA 프로세스로 넘어가기 이전 e2e 테스트에서 필터링 됐어야 하는 문제였고, 해당 작업 없이 PR 과 merge 작업이 이뤄지고 있어 개발 단계에서 런타임에러를 걸러내지 못함

장애 해결

장애 발생 직후 패키지 업데이트 커밋 drop 후 재 커밋 진행으로 rollback

대처에 아쉬운 점

  • 위험도가 높은 작업이었으나 컴파일타임 에러만 처리하고 런타임 에러 체크없이 배포 시도한게 첫번째 원인
  • 배포가 롤링 업데이트로 구성되어 있어 장애 시 빠른 rollback에 어려움이 있음
  • orm 관련 혹은 application 내부 에러 발생 시 알림 혹은 모니터링 시스템의 부재

0개의 댓글

Powered by GraphCDN, the GraphQL CDN