본문 바로가기
개발/AWS

AWS Lambda 시간관련 에러

by 문둘기 2020. 2. 11.

호출되면 호출된 시간 기준으로 가장 최근 데이터를 꺼내오는 람다 함수를 새로 만들었다.
잘 동작하는 거 같았고, 뭔가 버그가 생길 정도로 복잡한 함수도 아니었다

그런데! 해당 데이터는 시간이 지날수록 점점 커져야 되는데, 일정시간 후에 실행해봐도 계속 같은 값을 반환하는 현상이 발생했다. DB를 확인해보니 DB에 저장된 값은 정상적으로 계속 커지고 있었다.

잠깐 멍 때리다가 cloudwatch에 있는 로그를 보니, 함수가 호출된 시간으로 값을 뽑아 오는 게 아니라 특정 시간의 값만 계속 꺼내오고 있었다. 아마도 currentTime을 exports.handler = async(event) => { } 밖에 선언해서, 람다가 새로 호출되어도, 이전에 저장해 두고 잇던 currentTime을 계속 갖다 쓰는 거 같았다..

여기서 의문이 생긴 게 aws lambda는 함수니까, 새로 호출될 때마다 시간도 그때그때 새로 뽑아야 되는 게 정상 아닌가? 라는것이었다. 지금은 그게아니라는것을 알게됐지만, 당시 lambda를 제대로 공부 안해서 이런 어이없는 문제가 생겼다. 그래서 직접 테스트를 해봤다.

실험에 사용한 코드.

let testTime = new Date(Date.now());

exports.handler = async (event) => {
  let testTime2 = new Date(Date.now());

  console.log(testTime + '\n');
  console.log(testTime2 + '\n');
};

exports.handler 바깥에 testTime 변수를 선언하고, 내부에는 testTime2 변수를 선언했다. 그리고 출력해봤다.

※ 실제로는 시간이 더 길게 출력되지만 편의상 시간 부분만 잘라서 올렸다 ※

1번째 실행했을 때, 시간이 동일하게 나왔다

06:13:26
06:13:26

 

2번째 실행했을 때..

06:13:26
06:14:00

exports.handler 내부에 선언한 변수는 의도한 대로 현재시간이 제대로 나오는데바깥에 선언한 건 값이 그대로다! 계속 같은 값을 꺼내왔던 문제는 바로 이것 때문이다.

 

3번째

06:13:26
06:16:21

 

4번째

06:13:26
06:18:38

 

5번째

06:13:26
06:26:39

이제 람다가 warm 에서 cold start 상태로 돌아가게 10분 이상 기다렸다가 실행해봤다.
약 12분 후 람다가 cold start 상태가 된 뒤 실행했더니 위아래 값이 다시 같아졌다

06:38:02
06:38:02

예상대로 warm start가 유지되는 동안에는 exports.handler 밖에 선언된 전역 변수가 계속 유지되는 것을 알 수 있다.
알고보면 별거 아닌데 람다를 제대로 알고 있는 상태가 아니었기때문에, 전혀 예상하지 못한 문제였다.