서버리스란 무엇인가?

전통적으로 우리는 웹 애플리케이션을 구축하고 배포할 때 서버로 들어오는 HTTP 요청을 어느 정도 제어할 수 있었습니다. 애플리케이션은 해당 서버에서 실행되며, 우리는 서버의 리소스를 프로비저닝하고 관리할 책임이 있었습니다. 이 방식에는 몇 가지 문제가 있습니다.

  1. 요청을 처리하지 않을 때도 서버를 계속 유지하는 데 비용이 발생합니다.

  2. 서버와 모든 리소스의 가동 시간과 유지보수를 우리가 책임져야 합니다.

  3. 서버에 적절한 보안 업데이트를 적용하는 것도 우리의 책임입니다.

  4. 사용량이 증가하면 서버를 확장해야 하고, 사용량이 줄어들면 다시 축소해야 합니다.

작은 회사나 개인 개발자에게는 이러한 작업이 부담스러울 수 있습니다. 이는 더 중요한 작업인 애플리케이션을 구축하고 유지보수하는 데 방해가 됩니다. 대규모 조직에서는 인프라 팀이 이를 처리하지만, 개별 개발자의 책임은 아닙니다. 그러나 이러한 과정은 개발 속도를 늦출 수 있습니다. 인프라 팀과 협력하지 않고는 애플리케이션을 바로 구축할 수 없기 때문입니다. 개발자로서 우리는 이러한 문제를 해결할 방법을 찾아왔고, 여기서 서버리스가 등장합니다.

서버리스 컴퓨팅

서버리스 컴퓨팅(줄여서 서버리스)은 클라우드 프로바이더(AWS, Azure, Google Cloud 등)가 코드 실행을 위해 리소스를 동적으로 할당하고, 실제로 사용된 리소스 양에 대해서만 요금을 청구하는 실행 모델입니다. 코드는 일반적으로 상태를 유지하지 않는 컨테이너 내에서 실행되며, HTTP 요청, 데이터베이스 이벤트, 큐 서비스, 모니터링 알림, 파일 업로드, 예약된 이벤트(크론 잡) 등 다양한 이벤트에 의해 트리거될 수 있습니다. 클라우드 프로바이더에 전달되는 코드는 보통 함수 형태로 제공되기 때문에, 서버리스를 _“Functions as a Service(FaaS)”_라고 부르기도 합니다. 주요 클라우드 프로바이더의 FaaS 서비스는 다음과 같습니다:

서버리스는 개발자로부터 하부 인프라를 추상화하지만, 여전히 함수를 실행하기 위해 서버가 사용됩니다.

여러분의 코드가 개별 함수로 실행되기 때문에, 몇 가지 주의할 점이 있습니다.

마이크로서비스

서버리스 환경으로 전환할 때 가장 큰 변화는 애플리케이션을 함수 형태로 설계해야 한다는 점입니다. 기존에는 Rails나 Express 같은 모놀리식 앱으로 애플리케이션을 배포하는 데 익숙했을 겁니다. 하지만 서버리스 환경에서는 일반적으로 마이크로서비스 기반 아키텍처를 채택해야 합니다. 물론, 전체 애플리케이션을 하나의 함수 안에서 모놀리식으로 실행하고 라우팅을 직접 처리하는 방법도 있습니다. 하지만 이 방법은 권장되지 않습니다. 함수의 크기를 줄이는 것이 더 나은 접근 방식이기 때문입니다. 이에 대해서는 아래에서 자세히 다루겠습니다.

상태 비저장 함수

여러분의 함수는 일반적으로 안전한 (거의) 상태 비저장 컨테이너 내에서 실행됩니다. 이는 이벤트가 완료된 후 오랫동안 실행되는 코드를 애플리케이션 서버에서 실행하거나, 이전 실행 컨텍스트를 사용하여 요청을 처리할 수 없다는 것을 의미합니다. 함수가 매번 새로운 컨테이너에서 호출된다고 가정해야 합니다.

이와 관련된 몇 가지 미묘한 차이점이 있으며, 다음 장에서 자세히 논의할 예정입니다.

콜드 스타트

여러분의 함수는 이벤트에 응답하기 위해 필요할 때마다 실행되는 컨테이너 내부에서 동작합니다. 이로 인해 약간의 지연 시간이 발생하는데, 이를 _콜드 스타트_라고 부릅니다. 함수 실행이 완료된 후에도 컨테이너는 잠시 동안 유지될 수 있습니다. 이 시간 동안 다른 이벤트가 발생하면 훨씬 더 빠르게 응답할 수 있으며, 이를 일반적으로 _웜 스타트_라고 합니다.

콜드 스타트의 지속 시간은 특정 클라우드 프로바이더의 구현에 따라 다릅니다. AWS Lambda에서는 수백 밀리초에서 몇 초 사이의 범위를 가질 수 있습니다. 이는 사용된 런타임(또는 언어), 함수의 크기(패키지로), 그리고 당연히 해당 클라우드 프로바이더에 따라 달라질 수 있습니다. 콜드 스타트는 클라우드 프로바이더들이 낮은 지연 시간을 위해 최적화를 개선하면서 최근 몇 년 동안 크게 개선되었습니다.

함수를 최적화하는 것 외에도, 몇 분마다 함수를 호출하여 웜 상태를 유지하기 위해 별도의 스케줄링된 함수를 사용하는 간단한 방법도 있습니다. 이 튜토리얼에서 사용할 SST는 이를 돕기 위해 사전에 구축된 Cron 컴포넌트를 제공합니다.

이제 서버리스 컴퓨팅에 대해 잘 이해했으니, Lambda 함수가 무엇인지 그리고 여러분의 코드가 어떻게 실행되는지 더 깊이 알아보겠습니다.