티스토리 뷰
상용 배포를 앞두고, 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 같은 키워드도 적절하게 사용해보지 못했는데, 이런 기회를 통해 하나씩 알아가는 것 같다.
(문제를 해결하는데 걸린 시간과 고통은 별개다.)
가볍게 언급하고 넘어갔지만, 이번 이슈는 상용 배포 직전 스테이징 테스트 중에 발견된 정말 식은땀이 났던 경우다.
다음엔 조금 더 여유를 두고 스테이징 테스트를 해야할 것 같다.
'개발 > AWS' 카테고리의 다른 글
AWS S3와 CloudFront 연동 끝까지 가보기 (1) | 2024.01.05 |
---|---|
AWS DynamoDB 효율적으로 조회하기 with 글로벌 보조 인덱스(Global Secondary Indexes) (0) | 2023.12.24 |
AWS IAM 파헤치기 - 역할과 정책, 신뢰관계 (0) | 2023.12.10 |
Serverless Framework의 다양한 기능 사용해보기 (2) | 2023.12.07 |
AWS Route 53 - API Gateway - Lambda 함께 사용하기(+ DynamoDB) (1) | 2023.12.04 |
- Total
- Today
- Yesterday
- CloudFront
- Log
- OpenAI
- AWS
- cache
- 오블완
- 스프링부트
- Elastic cloud
- terraform
- docker
- 후쿠오카
- springboot
- 티스토리챌린지
- S3
- lambda
- openAI API
- 람다
- EKS
- Spring
- java
- ChatGPT
- AWS EC2
- elasticsearch
- AOP
- MySQL
- serverless
- Kotlin
- GIT
- JWT
- OpenFeign
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |