해결된 질문
24.07.02 21:55 작성
·
82
1
안녕하세요. 4-10 강의를 보고 질문드립니다.
람다는 stateless 방식으로 실행된다고 알고 있었는데, 전역 변수가 캐싱이 된다고 설명해주신 이유는 해당 프로젝트 같은 경우 모든 알람이 발생할때마다 실행되니, coldstart가 발생하지 않는다라는걸 전제하에 말씀해주신걸까요? 아니면 람다 자체에서 내부적으로 어떠한 동작에 의해 캐싱이 이루어지는건가요?
===
이 프로젝트는 모든 알람이 발생할 때마다 람다가 실행되니 coldstart로 응답이 느려질거 같진 않은데요, 만약 5~10분마다 실행되는 람다 함수라면 coldstart에 대한 대책으로 3분정도 주기마다 eventbridge로 람다를 트리거해주는 것도 방법이 될까요?
답변 1
1
2024. 07. 02. 22:11
안녕하세요!
마침 집에 있어서 바로 답변 드릴 수 있네요.
일단, 링크의 내용을 참고하면 아래와 같은 내용이 있습니다.
To improve resource management and performance, the Lambda service retains the execution environment for a non-deterministic period of time.
간단히 얘기해서, "정해진 시간은 없지만, 리소스 관리와 성능 개선을 위해 실행 환경을 유지한다."라는 거죠.
람다는 등록된 핸들러를 실행하는 것이기 때문에 핸들러 외부에 전역 변수로 선언된 부분은 위 조건이 유지되는 동안에는 다시 호출이 되지 않습니다.(효율 향상)
그렇기 때문에, 지속적으로 호출이 필요하지 않은 시크릿 저장, 커넥션 풀 유지 등은 외부로 빼면 좋다는 거였구요.(물론 이렇게 선언한 변수가 소켓이라면 핸들러 내부에서 close 하면 안됩니다. 환경이 유지되는 동안은 전역적으로 선언된 내용이 다시 실행되지 않으므로.)
The broader serverless community provides open source libraries to “warm” Lambda functions via a pinging mechanism. This approach uses EventBridge rules to schedule invocations of the function every minute to help keep the execution environment active.
추가로 위와 같이 이벤트브릿지를 통해 매번 환경을 워밍 상태로 만드는 것도 소개되어 있습니다.(링크에도 표현되어 있지만 동시성이 늘어나게 되면, 보장 받을 수 있는 방법도 아니고 효율도 낮아질 순 있습니다.)
마지막으로 질문 주신 내용에 대해서는, 람다는 리전에 따라 다르지만 하루에 최소 1번은 무조건 환경이 초기화 되기 때문에(제 경험상 서울 리전은 2 ~ 3시간에 1번씩은 초기화 됐던 것 같아요.), 말씀하신 방법이 보장되는 방법은 아닙니다.(그래도 조금 더 빠르긴 하겠죠?)
결론적으로, 설명의 편의성을 위해 "캐싱"이라는 단어를 사용했지만 정확하게는 캐싱의 개념은 아닙니다.
조금 더 정확히 설명드리면,
"test.handler 라고 등록되어 있는 핸들러를 실행하고 난 뒤, 효율성을 위해 내부 컨테이너(=람다)를 죽이지 않고 일정 시간 유지하고 있기 때문에 전역 변수가 유지된다." 라고 봐주시면 좋을 것 같습니다.
위 동작을 테스트 해보고 싶으시면, 링크를 참고하셔서 실제 환경을 구성해보시면 어떤 의미인지 체감이 되실거라고 생각합니다.
2024. 07. 02. 22:29
3분 정도면에 대해서는 정확히 보장되는 내용이 없어서 답변 드리기가 어렵지만, 제 경험상 1분으로 하면 전체 리셋이 되기 전에는 잘 동작했던 것 같습니다!