티스토리 뷰

상용 배포를 앞두고, dev 서버에서 잘 동작하던 Lambda에서 문제가 발생했다.

 

Dynamo DB(이하 DDB) 조회해서 데이터의 존재여부를 검증하는데, 분명 조회 데이터가 존재하는데도 Count가 계속 0으로 찍히는 문제였다.

 

dev에선 분명히 잘 동작했고 prod에서도 에러가 나지 않았기 때문에, 오류를 찾기가 너무 힘들었다. 

 

커넥션이 올바르게 되고 있는지부터 쿼리가 올바른지, 로직에 문제가 없는지 다 검증해봤는데,

 

의외의 곳에서 실마리를 얻었다.

 

prd DDB에 저장된 데이터는 3000개 이상이었는데, 위 조회 방법으로 조회하니 ScannedCount가 709개로 나왔다.

 

여기서부터 문제가 있음을 인지하게 되었다.

 

조회 쿼리를 날렸을 때 결과물이 아래와 같이 나왔다.

{
  '$metadata': {
    httpStatusCode: 200,
    ...
  },
  Count: 0,
  Items: [],
  LastEvaluatedKey: { id: 1091, time: '2023-07-06T05:46:07.474Z' },
  ScannedCount: 709
}

설정한 적이 없던 LastEvaluatedKey가 응답데이터에 포함되어 있었다.

 

LastEvaluatedKey를 검색하니 바로 문제를 해결할 수 있었다.

https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Query.Pagination.html

 

위 사이트의 내용을 요약하면 DDB의 Query(조회)는 1MB 이상을 넘을 수 없으니, 그 이상의 데이터들은 LastEvaluatedKey를 파라미터로 넣고 다시 조회하라는 것이었다.

 

dev DDB에 저장된 데이터는 대략 300개 정도였기 때문에 이 제약조건에 걸리지 않았던 것이었다.

 

위 사이트에서 언급한 구현 방법에 따라 구현하면 된다.

const queryDDBForAbuse = async (...) => {
  let params = {
    TableName: DDB_TABLE,
    FilterExpression: "...",
    ExpressionAttributeValues: {
      ...
    }
  };

  let items;
  
  while (true) {
    items = await ddbClient.send(new ScanCommand(params));
    params.ExclusiveStartKey = items.LastEvaluatedKey;

    if ((items && items.Count > 0) || typeof items.LastEvaluatedKey === "undefined") {
      break;
    }
  }

  return items;
};

내 개발 시나리오에서는 한번이라도 접근한 이력이 있으면 중복처리되어 접근 불가 상태로 두면 되기 때문에 

 

Count > 0 일때 중단되는 경우를 추가했다. 

 

중단 조건 없이 전체 조회를 하고 싶으면, 서비스로직은 다 위로두고 아래의 조건만 남기면 된다.

typeof items.LastEvaluatedKey === "undefined"

간단한 방법이므로 별도의 코드는 공유할 필요없을 것 같다.

 

마치며

dev서버와 prod서버의 ddb 데이터가 일치하지 않아서 생겼던 문제라고 생각하면 될 것 같다.

 

이 일이 생긴 이후로 바로 마이그레이션을 해줬다.

 

정확히는 ddb에 대한 이해가 부족해서 발생한 문제기도하다.

 

아직 sort key partition key 같은 키워드도 적절하게 사용해보지 못했는데, 이런 기회를 통해 하나씩 알아가는 것 같다.

(문제를 해결하는데 걸린 시간과 고통은 별개다.)

 

가볍게 언급하고 넘어갔지만, 이번 이슈는 상용 배포 직전 스테이징 테스트 중에 발견된 정말 식은땀이 났던 경우다.

 

다음엔 조금 더 여유를 두고 스테이징 테스트를 해야할 것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함