서버리스 함수, 서버 관리 없이 코드를 실행하는 방법
서버리스 함수란 무엇인가
서버리스 함수는 서버를 직접 빌리거나 관리하지 않고 코드 조각 단위로 실행하는 클라우드 방식이다. 개발자가 함수 하나를 올려두면 요청이 들어올 때만 그 함수가 깨어나 실행되고, 일이 끝나면 다시 잠든다. 비용은 함수가 실제로 돌아간 시간과 호출된 횟수에 따라 매겨지는 것이 일반적이다.
이름은 서버리스지만 서버가 사라진 것은 아니다. 서버는 그대로 있고, 다만 그 서버를 준비하고 운영하는 몫을 클라우드 사업자가 대신 맡는다. 그래서 개발자는 서버 사양이나 운영체제, 확장 설정을 손보기보다 함수 안에 담을 로직에 집중할 수 있다. 이런 방식은 FaaS, 즉 서비스형 함수라는 이름으로도 불린다.
어떻게 실행되고 요금은 어떻게 매겨지나
서버리스 함수는 평소에 꺼져 있다가 특정 사건이 신호를 보낼 때 실행된다. 웹 요청이 들어오거나 파일이 업로드되거나 정해진 시각이 되거나 메시지 큐에 새 항목이 쌓이는 순간이 그 신호가 된다. 이렇게 사건에 반응해 코드가 도는 구조를 이벤트 기반 실행이라고 부른다.
요금은 대체로 두 가지를 곱해 계산된다. 함수가 호출된 횟수와, 한 번 돌 때 쓴 실행 시간 및 메모리다. 요청이 없는 시간에는 함수가 놀고 있으므로 그 시간에는 비용이 붙지 않는 편이다. 서버를 한 대 빌려 하루 종일 켜 두는 방식과 견주면, 사용량이 들쭉날쭉한 서비스에서는 요금을 아끼기 유리하다고 알려져 있다.
서버리스 함수는 여러 대형 클라우드 사업자가 각자의 이름으로 내놓은 상품으로 쓸 수 있다. 다만 세부 요금 체계와 실행 한도는 사업자마다 다르므로, 실제 도입 전에는 각 서비스의 공식 문서에서 최신 조건을 확인하는 편이 안전하다.
언제 쓰면 좋고 언제는 맞지 않나
서버리스 함수는 요청량이 일정하지 않은 작업, 가끔씩만 도는 작업, 짧게 끝나는 작업에 잘 어울린다. 이미지 크기를 바꾸는 처리, 알림 발송, 정기적으로 도는 배치 작업, 웹훅 응답 같은 경우가 여기에 든다. 갑자기 요청이 몰려도 함수가 필요한 만큼 늘어나 받아 내고, 조용할 때는 자원을 붙잡아 두지 않는다.
반대로 오래 이어지는 연결이나 상태를 계속 들고 있어야 하는 작업, 실행이 아주 긴 작업에는 잘 맞지 않는 편이다. 서버리스 함수는 한 번 실행에 걸 수 있는 최대 시간이 정해져 있고, 함수끼리 상태를 나눠 갖지 않는 것을 전제로 설계되기 때문이다. 트래픽이 늘 높고 고르게 유지되는 서비스라면 오히려 서버를 상시 운영하는 쪽이 비용 면에서 나을 수도 있다.
콜드 스타트는 무엇인가
서버리스를 이야기할 때 자주 나오는 말이 콜드 스타트다. 한동안 호출이 없어 완전히 잠들어 있던 함수가 다시 불려 나올 때, 실행 환경을 새로 준비하느라 첫 응답이 평소보다 조금 늦어지는 현상을 가리킨다. 사용자가 느낄 만큼 지연이 나타나는 경우도 있어, 응답 속도가 중요한 서비스라면 이 지점을 미리 살펴 두는 편이 좋다.
도입 전에 짚어 둘 점
서버리스로 옮기면 운영 부담은 줄지만 대신 신경 쓸 자리가 바뀐다. 우선 특정 사업자의 방식에 맞춰 코드를 짜다 보면 나중에 다른 환경으로 옮기기 어려워질 수 있다. 함수가 잘게 쪼개질수록 전체 흐름을 따라가며 문제를 찾아내는 일도 까다로워지는 편이다.
그래서 처음부터 모든 것을 서버리스로 바꾸기보다, 요청이 뜸하거나 독립적으로 떼어 내기 쉬운 기능부터 함수로 옮겨 보고 요금과 응답 속도를 지켜보는 방식이 무난하다. 작은 함수 하나로 시작해 감을 잡은 뒤 범위를 넓히면 위험을 줄일 수 있다.
- 요청량이 일정하지 않거나 가끔만 도는 작업에 유리하다
- 실제로 실행된 시간과 호출된 횟수에 따라 비용이 매겨진다
- 한 번 실행에 걸 수 있는 시간과 상태 공유에는 제약이 있다
- 콜드 스타트로 첫 응답이 늦어질 수 있어 미리 확인하는 편이 좋다