kinesis firehose 로 로그 데이터를 쌓고 있었는데, 특정 시간대의 로그가 쌓이고 있지 않다는 문의가 발생
kinesis 쪽 destination error logs 에선 The Lambda function was successfully invoked but it returned an error result. 와 같은 에러가 발생하고 있었다. (해당 시간 대에는 대부분의 로그가 저장이 안 되고 있던 상태였고, 다른 시간 대에도 가끔씩 발생하고 있었다.)
cloud watch 에서 lambda 로그를 확인하니 http 413 (payload too large) 에러가 발생했다.
로그 데이터가 그냥 평범한 수준의 http request 정도라 payload 가 크다는 게 이해가 되진 않았고, 여러가지 검색을 해봤을 땐, lambda 문제라거나 전송 형식을 변경하라는 등의 내용이 많았다.
그런데 같은 로직을 사용하고 있는 다른 서비스에선 문제가 발생하지 않아서 의아한 상황이었다.
/*
사실 처음에는 같은 로직을 쓰고 있어서 로그 자체의 문제인가 하여 processing-failed/ 의 파일들을 확인했는데 큰 문제점은 없었다.
그래서 해당 서비스와 lambda를 분리시켜서 로그를 좀 더 명확히 나눠본 상태
*/
분리한 직후에는 문제가 발생하고 있지는 않았다. 일단은 세세한 설정값들을 맞춰보기 시작했는데, 그 중 lambda의 timeout을 분리했을 때 1분에서 기존 값인 3분으로 늘리자 해당 에러가 발생하기 시작했다. 그래서 다시 1분으로 바꾸고 모니터링을 해보니 평소엔 괜찮았고 해당 시간 대에 약간의 로그가 쌓이지 않았다. 그래서 트래픽과 관련된 문제라고 추측하고 kinesis의 buffer 크기를 기존 3MB -> 1.5MB로 낮추고 모니터링하니 문제가 발생하지 않았다.
현재까지 상황을 종합해보면 kinesis에서 lambda로 로그 데이터를 보낼 때, 여러 데이터들을 하나의 request로 변환하여 전송해서 트래픽이 몰릴 때는 데이터의 크기를 초과하는 게 아닌가 의심하고 있다.
의문 점은 기존 buffer 크기는 3MB이고 lambda 의 payload 크기 제한은 sync 방식일 때 6MB인데 왜 그런 발생하는 지 의문이다.
base64 인코딩의 차이인가 싶은데 base64 인코딩도 33% 증가라는데 문제가 발생하기엔 큰 변화는 아닌 것 같다.
lambda 스펙이 잘못된건가..?