서버리스 컴퓨팅 아키텍처는 개발자가 서버 인프라의 프로비저닝, 관리, 확장에 대한 책임을 거의 또는 전혀 지지 않고도 애플리케이션과 서비스를 구축하고 실행할 수 있게 하는 클라우드 네이티브 모델이다. '서버리스'라는 용어는 서버가 존재하지 않음을 의미하지 않는다. 대신, 서버 관리와 운영의 추상화를 의미하며, 개발자는 애플리케이션 로직에만 집중할 수 있다. 이 아키텍처는 클라우드 컴퓨팅의 진화된 형태로, 인프라스트럭처를 코드나 서비스 형태로 제공하는 IaaS나 PaaS와 구별된다.
이 아키텍처의 핵심은 이벤트 기반 실행과 함수형 서비스이다. 애플리케이션은 일반적으로 작은 단위의 코드인 함수로 분해된다. 이 함수들은 특정 트리거나 이벤트에 의해 실행된다. 예를 들어, 파일이 클라우드 스토리지에 업로드되거나, HTTP 요청이 도착하거나, 데이터베이스 레코드가 변경될 때 함수가 호출된다. 클라우드 제공자는 이러한 이벤트를 감지하고, 필요한 컴퓨팅 리소스를 자동으로 할당하여 함수를 실행한 후, 리소스를 회수한다. 사용자는 실제로 코드가 실행된 시간과 횟수에 대해서만 비용을 지불한다.
서버리스 컴퓨팅은 기존의 모놀리식 아키텍처나 마이크로서비스 아키텍처와도 다르다. 마이크로서비스가 지속적으로 실행되는 독립적인 서비스라면, 서버리스 함수는 순간적으로 실행되고 종료되는 일회성 작업 단위에 가깝다. 이는 스케일링 측면에서 큰 장점을 제공한다. 트래픽이 급증하면 플랫폼이 자동으로 함수 인스턴스를 수백, 수천 개까지 생성하여 처리하고, 트래픽이 줄어들면 인스턴스도 자동으로 감소한다. 결과적으로 개발팀은 용량 계획이나 서버 부하 모니터링에 대한 부담 없이 탄력적이고 비용 효율적인 애플리케이션을 구축할 수 있다.
서버리스 컴퓨팅의 핵심 개념은 서버의 프로비저닝과 관리에 대한 책임을 개발자로부터 클라우드 제공자에게 이전하는 데 기반을 둔다. 이는 주로 이벤트 기반 실행, 함수형 서비스(FaaS), 백엔드 서비스(BaaS)라는 세 가지 상호 연관된 개념으로 구성된다.
첫 번째 핵심은 이벤트 기반 실행이다. 서버리스 애플리케이션의 코드는 특정 트리거나 이벤트에 의해 실행된다. 이 이벤트는 HTTP 요청, 데이터베이스 변경, 파일 업로드, 메시지 큐 도착, 예약된 시간 등 다양할 수 있다. 코드는 이벤트가 발생할 때만 실행되고, 실행이 완료되면 리소스가 자동으로 회수된다. 이는 전통적인 상시 실행되는 서버 모델과 근본적으로 다르다.
두 번째 핵심은 함수형 서비스(Function as a Service, FaaS)이다. 이는 개발자가 애플리케이션 로직을 개별적인 함수 단위로 작성하여 클라우드 플랫폼에 업로드할 수 있게 하는 모델이다. 플랫폼은 이 함수들의 실행, 확장, 가용성, 패치 적용을 완전히 관리한다. 개발자는 서버 운영 체제나 런타임 환경을 관리할 필요 없이 비즈니스 로직에만 집중할 수 있다.
세 번째 핵심은 백엔드 서비스(Backend as a Service, BaaS)이다. 이는 서버리스 애플리케이션을 구성하는 데 필요한 다양한 관리형 서비스(예: 인증, 데이터베이스, 스토리지, 메시징)를 의미한다. 개발자는 이러한 서비스들을 API 호출을 통해 활용하며, 서비스 자체의 인프라 관리 부담을 지지 않는다. FaaS와 BaaS가 결합되어 완전한 서버리스 애플리텍처를 형성한다[1].
서버리스 컴퓨팅의 핵심 원리 중 하나는 이벤트 기반 실행이다. 이는 코드가 특정 이벤트가 발생할 때만 실행되고, 그 외의 시간에는 완전히 비활성화 상태를 유지하는 방식을 의미한다. 이벤트는 파일이 객체 저장소에 업로드되거나, HTTP 요청이 도착하거나, 메시지 큐에 새로운 메시지가 추가되는 것과 같은 다양한 외부 또는 내부적 변화를 말한다. 이 방식은 전통적인 서버가 항상 가동되어 요청을 기다리는 모델과 근본적으로 다르다.
이벤트 기반 실행 모델에서 함수는 특정 이벤트 소스에 연결된 트리거에 의해 호출된다. 예를 들어, 사용자가 웹 애플리케이션의 버튼을 클릭하면 API 게이트웨이가 HTTP 요청 이벤트를 생성하고, 이는 미리 정의된 함수를 실행하는 트리거로 작동한다. 함수는 이벤트에 담긴 데이터(예: 업로드된 파일 정보, 요청 본문)를 입력으로 받아 처리한 후 결과를 반환하고 실행을 종료한다. 이 과정에서 개발자는 서버 프로비저닝이나 런타임 관리에 신경 쓸 필요가 없다.
이러한 실행 모델은 몇 가지 중요한 특성을 가진다. 첫째, 실행은 매우 짧은 시간(보통 밀리초에서 몇 분) 동안만 지속되는 에피소딕 특성을 보인다. 둘째, 리소스 사용은 실제 실행 시간에만 과금되는 사용량 기반 과금 모델과 자연스럽게 결합된다. 셋째, 시스템은 수신되는 이벤트의 양에 따라 자동으로 수평 확장되어 병렬로 수많은 함수 인스턴스를 실행할 수 있다[2].
이벤트 소스 예시 | 트리거 유형 | 실행되는 작업 예시 |
|---|---|---|
Amazon S3 버킷 | 파일 업로드/삭제 | 썸네일 생성, 데이터 변환 |
HTTP 요청 (GET, POST 등) | RESTful API 로직 처리 | |
메시지 큐에 메시지 도착 | 비동기 메시지 처리 | |
일정한 시간 간격 | 예약된 배치 작업 실행 |
이 구조는 애플리케이션을 느슨하게 결합된 이벤트 생산자와 소비자의 집합으로 구성하게 하여, 확장성이 뛰어나고 효율적인 시스템 설계를 가능하게 한다.
백엔드 서비스(Backend as a Service, BaaS)는 애플리케이션 개발에서 필요한 서버 측 기능을 클라우드 제공자가 완전 관리형 서비스로 제공하는 모델이다. 개발자는 인증, 데이터베이스, 파일 저장소, 푸시 알림 등 공통적인 백엔드 인프라를 직접 구축하고 운영할 필요 없이 API를 통해 통합하여 사용한다. 이는 서버리스 컴퓨팅의 핵심 개념 중 하나로, 개발자가 비즈니스 로직과 프론트엔드 개발에만 집중할 수 있도록 한다.
BaaS는 주로 모바일 애플리케이션과 웹 애플리케이션의 백엔드 구축에 활용된다. 예를 들어, 사용자 가입 및 로그인을 위해 파이어베이스 인증(Firebase Authentication)을, 데이터 저장을 위해 파이어베이스 리얼타임 데이터베이스나 AWS 앱싱크(AWS AppSync)를 사용하는 것이 전형적인 BaaS 활용 사례이다. 이러한 서비스들은 확장성, 보안, 가용성을 제공자가 책임지므로, 개발 팀의 운영 부담을 크게 줄여준다.
서비스 카테고리 | 주요 기능 예시 | 대표 서비스 (예) |
|---|---|---|
인증 및 사용자 관리 | 사용자 등록, 로그인, 소셜 로그인, 접근 제어 | |
데이터베이스 | NoSQL 데이터 저장/조회, 실시간 동기화 | Firebase Realtime Database, AWS DynamoDB, Google Cloud Firestore |
파일 저장소 | 이미지, 동영상 등 정적 파일 업로드 및 호스팅 | |
푸시 알림 | 모바일 기기로의 메시지 발송 |
함수형 서비스(FaaS)가 이벤트에 반응하는 코드 실행에 초점을 맞춘다면, BaaS는 애플리케이션을 구성하는 상태 저장(stateful) 백엔드 구성 요소를 서비스화한다. 두 개념은 상호 보완적으로 결합되어 완전한 서버리스 애플리케이션을 구성하는 경우가 많다. 예를 들어, BaaS의 데이터베이스에 새로운 데이터가 입력되면 이를 이벤트 소스로 삼아 FaaS 함수를 트리거하여 추가 처리를 수행하는 아키텍처가 가능하다.
주요 구성 요소는 서버리스 컴퓨팅 시스템의 기본적인 빌딩 블록을 이루며, 함수형 서비스(FaaS)와 백엔드 서비스(BaaS)를 조합하여 애플리케이션을 구축하는 데 사용된다. 핵심 구성 요소는 함수(Function), 트리거(Trigger), 이벤트 소스(Event Source)로 구분할 수 있다.
첫 번째 구성 요소는 함수(Function)이다. 함수는 서버리스 애플리케이션의 실행 단위이며, 특정 이벤트에 대한 응답으로 실행되는 독립적인 코드 조각이다. 이 코드는 일반적으로 단일 목적을 수행하도록 설계되며, 클라우드 공급자가 제공하는 런타임 환경에서 실행된다. 함수는 상태를 저장하지 않는(stateless) 특징을 가지며, 필요에 따라 수평적으로 확장되어 병렬로 실행될 수 있다.
두 번째 구성 요소는 트리거(Trigger)이다. 트리거는 함수를 실행시키기 위한 규칙이나 조건을 정의한다. 이는 특정 이벤트가 발생했을 때 함수를 호출하는 매커니즘으로 작동한다. 예를 들어, 새로운 파일이 객체 저장소에 업로드되거나, API 엔드포인트에 HTTP 요청이 도착하거나, 데이터베이스 레코드가 변경되는 것이 트리거가 될 수 있다.
세 번째 구성 요소는 이벤트 소스(Event Source)이다. 이벤트 소스는 트리거를 발생시키는 실제 서비스나 리소스를 가리킨다. 주요 이벤트 소스의 예는 다음과 같다.
이벤트 소스 유형 | 설명 | 예시 |
|---|---|---|
스토리지 서비스 | 객체의 생성, 수정, 삭제 이벤트 | |
메시징/큐 서비스 | 큐에 메시지가 도착하거나 토픽에 게시되는 이벤트 | |
데이터베이스 | 데이터베이스의 변경 스트림 이벤트 | |
HTTP 게이트웨이 | HTTP 요청 이벤트 |
이 세 가지 구성 요소는 상호 연결되어 작동한다. 이벤트 소스에서 이벤트가 발생하면, 이는 트리거를 활성화시키고, 트리거는 정의된 함수를 실행시켜 비즈니스 로직을 처리한다. 이 구조는 개발자가 인프라 관리보다는 비즈니스 로직 자체에 집중할 수 있도록 한다.
함수는 서버리스 컴퓨팅 아키텍처의 핵심 실행 단위이다. 이는 특정 이벤트에 의해 트리거되어 실행되는 독립적인 코드 조각으로, 애플리케이션 로직의 가장 작은 배포 단위를 구성한다. 일반적으로 함수형 서비스(FaaS) 플랫폼에서 호스팅되며, 개발자는 서버 인프라를 프로비저닝하거나 관리할 필요 없이 비즈니스 로직 코드만 작성하여 업로드하면 된다. 함수는 트리거가 발생할 때마다 플랫폼에 의해 자동으로 인스턴스화되고 실행되며, 작업이 완료되면 자원이 해제된다.
함수는 특정한 목적을 가진 단일 책임 원칙에 따라 설계되는 것이 일반적이다. 예를 들어, 사용자 등록 API 요청을 처리하거나, 업로드된 이미지 파일의 크기를 조정하거나, 데이터베이스의 변경 사항을 기록하는 등의 작업을 수행한다. 이는 전통적인 모놀리식 애플리케이션을 여러 개의 작고 독립적인 함수로 분해하는 접근 방식을 가능하게 한다.
함수의 생명주기와 실행 환경은 플랫폼에 의해 완전히 관리된다. 주요 특징은 다음과 같다.
특징 | 설명 |
|---|---|
상태 비저장성 | 일반적으로 함수는 상태를 유지하지 않도록 설계된다. 필요한 상태 정보는 외부 데이터 저장소나 캐시 서비스에 위임한다. |
짧은 실행 시간 | 대부분의 플랫폼은 함수의 최대 실행 시간을 제한한다(예: 15분). 장시간 실행 작업에는 적합하지 않다. |
자동 확장 | 들어오는 요청이나 이벤트의 양에 따라 플랫폼이 자동으로 함수 인스턴스의 수를 조정한다. |
함수는 다양한 프로그래밍 언어(예: Node.js, Python, Java, Go)로 작성될 수 있으며, 필요한 라이브러리와 종속성을 패키징하여 배포한다. 실행 시 플랫폼은 코드와 구성을 로드하고, 런타임 환경을 제공하며, 지정된 핸들러 메서드를 호출한다. 이 모델은 개발자가 인프라 관리보다 애플리케이션 코드 개발에 집중할 수 있게 한다.
트리거는 서버리스 컴퓨팅 환경에서 함수(Function)의 실행을 시작시키는 사건 또는 규칙이다. 이는 이벤트 기반 실행 모델의 핵심 구성 요소로, 개발자가 명시적으로 서버를 관리하거나 실행 명령을 내리지 않아도 특정 조건이 충족될 때 자동으로 코드가 실행되도록 한다. 트리거는 이벤트 소스(Event Source)에 의해 생성된 이벤트를 수신하고, 이를 해당 함수에 전달하는 역할을 맡는다.
트리거의 종류는 연결된 이벤트 소스에 따라 다양하다. 대표적인 예로는 HTTP 요청, 데이터베이스의 변경 사항(CRUD 작업), 메시지 큐에 도착한 새 메시지, 객체 저장소에 파일이 업로드되거나 수정된 이벤트, 예약된 시간(크론 작업), 또는 다른 서비스의 상태 변화 등이 있다. 각 트리거는 특정 이벤트에 반응하도록 구성되며, 이벤트 발생 시 관련 데이터(페이로드)를 함수에 인자로 전달한다.
트리거와 함수의 관계는 일반적으로 일대다 또는 다대일로 구성될 수 있다. 하나의 트리거(예: 파일 업로드 이벤트)가 여러 함수를 동시에 실행시킬 수 있으며, 반대로 하나의 함수가 여러 종류의 트리거(예: HTTP 엔드포인트와 메시지 큐)에 의해 호출될 수도 있다. 이 연결은 클라우드 플랫폼의 관리 콘솔이나 구성 파일(예: 서버리스 프레임워크의 serverless.yml)을 통해 정의된다.
트리거의 설정은 함수의 실행 컨텍스트와 성능에 직접적인 영향을 미친다. 예를 들어, 트리거가 동시 실행 횟수를 제한하거나, 이벤트를 배치로 처리하도록 구성할 수 있다. 또한, 트리거는 보안 정책(예: 인증 및 권한 부여)의 적용 지점이 되기도 하여, 허가된 이벤트 소스로부터의 요청만 함수를 실행하도록 보장하는 역할을 한다.
이벤트 소스는 서버리스 컴퓨팅 환경에서 함수(Function)를 실행시키는 사건이나 상태 변화를 발생시키는 외부 시스템 또는 서비스이다. 이벤트 소스는 트리거(Trigger)와 밀접하게 연결되어 있으며, 특정 조건이 충족되면 트리거를 활성화하여 서버리스 함수의 실행을 시작한다. 이는 이벤트 기반 실행 모델의 핵심 구성 요소로, 애플리케이션 로직이 수동 호출이 아닌 외부 이벤트에 반응하도록 한다.
주요 이벤트 소스 유형은 다음과 같다.
이벤트 소스 유형 | 설명 | 예시 |
|---|---|---|
스토리지 서비스 | 객체의 생성, 수정, 삭제와 같은 변경 사항 | AWS S3 버킷에 새 파일 업로드, Azure Blob Storage 컨테이너 변경 |
메시징/큐 서비스 | 큐에 새 메시지가 도착하거나 토픽에 게시됨 | Amazon SQS 메시지, Apache Kafka 토픽, Google Pub/Sub 메시지 |
데이터베이스 | 데이터베이스의 레코드 변경(추가, 업데이트, 삭제) | Amazon DynamoDB 스트림, Azure Cosmos DB 변경 피드 |
HTTP 게이트웨이 | HTTP 요청 (REST API 호출, 웹훅) | |
스케줄러 | 지정된 시간 또는 일정에 따른 주기적 실행 | |
IoT 플랫폼 | IoT 디바이스로부터의 데이터 전송 또는 상태 변경 | AWS IoT Core 메시지, Azure IoT Hub 이벤트 |
이벤트 소스는 발생한 이벤트에 대한 컨텍스트와 데이터(페이로드)를 포함하는 이벤트 객체를 생성한다. 이 객체는 트리거를 통해 서버리스 함수에 전달되어 처리된다. 예를 들어, 사용자가 이미지 파일을 업로드(S3 버킷 이벤트 소스)하면, 해당 이벤트는 파일명, 크기, 생성 시간 등의 정보를 페이로드로 담아 AWS Lambda 함수를 트리거하여 썸네일 생성 작업을 수행할 수 있다. 이 구조는 애플리케이션을 느슨하게 결합된 이벤트 주도 구성 요소로 설계할 수 있게 한다.
서버리스 아키텍처는 특정 문제를 해결하기 위해 설계된 몇 가지 일반적인 패턴을 활용한다. 이러한 패턴은 함수형 서비스(FaaS)와 백엔드 서비스(BaaS)를 조합하여 애플리케이션 로직을 구성하는 방식을 정의한다.
가장 기본적인 패턴 중 하나는 API 백엔드 패턴이다. 이 패턴에서는 API 게이트웨이가 HTTP 요청을 수신하고, 이를 특정 함수(Function)를 실행하는 트리거(Trigger)로 사용한다. 함수는 비즈니스 로직을 처리한 후 응답을 반환한다. 이 방식은 마이크로서비스의 API 계층을 구현하거나 모바일 앱 및 웹 애플리케이션의 백엔드를 구성하는 데 적합하다. 각 함수는 단일 책임을 가지도록 설계되어 독립적으로 배포되고 확장될 수 있다.
데이터 흐름을 처리하는 데는 이벤트 스트림 처리 패턴이 널리 사용된다. 이 패턴은 메시지 큐, 스트리밍 데이터 플랫폼(예: Apache Kafka), 또는 객체 저장소의 파일 생성 이벤트 등을 이벤트 소스(Event Source)로 활용한다. 예를 들어, 새 파일이 업로드되면 함수가 트리거되어 해당 파일의 변환, 분석 또는 검증 작업을 수행한다. 이 패턴은 실시간으로 대량의 이벤트나 데이터 레코드를 순차적으로 처리해야 하는 배치 작업, ETL 파이프라인, 활동 로그 분석 등에 효과적이다.
또 다른 일반적인 패턴은 크롤러 및 워커 패턴이다. 이는 주기적 또는 예약된 작업을 실행하는 데 사용된다. 클라우드 플랫폼의 스케줄링 서비스(예: Cron 작업)가 정해진 시간에 함수를 트리거하여 데이터베이스 정리, 리포트 생성, 외부 API 폴링 등의 작업을 수행한다. 이 패턴은 전통적인 서버에서 실행되던 배치 잡이나 데몬 프로세스를 서버리스 방식으로 대체하는 모델이다.
패턴 이름 | 주요 트리거 | 주요 사용 사례 |
|---|---|---|
웹/모바일 백엔드, 마이크로서비스 API | ||
메시지 큐, 파일 업로드, 데이터베이스 변경 이벤트 | 실시간 데이터 처리, 파일 변환, ETL | |
시간 기반 스케줄러 (Cron) | 예약된 배치 작업, 데이터 정리, 주기적 폴링 |
API 백엔드 패턴은 서버리스 컴퓨팅에서 마이크로서비스나 API 서버를 구축하는 데 널리 사용되는 패턴이다. 이 패턴은 하나 이상의 서버리스 함수가 HTTP 요청을 처리하는 API 게이트웨이와 결합되어 완전한 백엔드 서비스를 구성한다.
클라이언트의 HTTP 요청은 API 게이트웨이에 의해 수신되고, 게이트웨이는 사전 정의된 라우팅 규칙에 따라 특정 함수(Function)를 트리거한다. 각 함수는 단일 목적의 비즈니스 로직(예: 사용자 조회, 주문 생성, 결제 처리)을 실행하고, 그 결과를 다시 API 게이트웨이를 통해 클라이언트에 응답으로 반환한다. 이 구조는 각 기능이 독립적으로 배포, 확장, 관리될 수 있는 세분화된 마이크로서비스 아키텍처를 구현하는 데 적합하다.
이 패턴의 구현은 전통적인 모놀리식 서버에 비해 몇 가지 특징을 보인다. 주요 구성 요소와 역할은 다음과 같다.
구성 요소 | 역할 |
|---|---|
HTTP 요청의 진입점. 라우팅, 인증, 속도 제한 등을 처리한다. | |
실제 비즈니스 로직을 실행하는 단위. 이벤트에 의해 실행되고 종료된다. | |
API 게이트웨이의 HTTP 엔드포인트가 함수 실행을 촉발시키는 역할을 한다. | |
함수가 데이터를 저장하거나 외부 서비스를 호출하기 위해 활용하는 관리형 서비스(예: 데이터베이스, 인증 서비스). |
이 패턴은 사용량에 따라 자동으로 확장되며, 함수가 실행되는 시간만큼만 비용이 발생하므로 변동성이 큰 트래픽을 처리하는 API에 비용 효율적이다. 그러나 여러 함수에 걸친 트랜잭션 관리와 함수 간 통신 설계, 콜드 스타트로 인한 지연 시간 증가 가능성 등은 고려해야 할 사항이다.
이벤트 스트림 처리 패턴은 서버리스 컴퓨팅 환경에서 연속적인 데이터 스트림을 실시간으로 처리하는 데 적합한 설계 방식이다. 이 패턴은 이벤트 소스에서 발생하는 지속적인 이벤트 흐름을 함수형 서비스를 통해 변환, 집계 또는 분석한다. 주로 Apache Kafka, Amazon Kinesis, Google Cloud Pub/Sub과 같은 메시징 서비스가 이벤트 스트림을 중계하는 역할을 담당한다.
이 패턴의 핵심은 트리거가 스트림의 새 메시지나 레코드를 감지하면 서버리스 함수를 실행시키는 것이다. 함수는 각 이벤트를 개별적으로 또는 일괄적으로 처리한 후, 결과를 다른 데이터베이스나 스토리지에 저장하거나 또 다른 이벤트 스트림으로 전달한다. 처리 흐름은 선형적일 수도 있고, 여러 함수가 순차적 또는 병렬로 연결된 파이프라인 형태를 구성할 수도 있다.
주요 사용 방식은 다음과 같다.
처리 유형 | 설명 | 예시 |
|---|---|---|
실시간 변환 | 데이터 형식이나 구조를 변환 | JSON 로그를 CSV 포맷으로 변환 |
실시간 집계 | 지표를 계산하거나 요약 | 분당 페이지 뷰 수 집계 |
실시간 필터링 | 특정 조건에 맞는 데이터만 선별 | 오류 로그만 감지하여 알림 전송 |
패턴 감지 | 스트림에서 특정 패턴이나 이상 징후 탐지 | 비정상적인 거래 활동 탐지 |
이 패턴은 서버리스의 자동 확장성 덕분에 데이터 유입량의 변동에 탄력적으로 대응할 수 있다. 그러나 처리 지연 시간이 매우 짧아야 하거나 상태를 유지해야 하는 복잡한 집계 연산의 경우, 설계상의 주의가 필요하다[3].
크롤러 및 워커 패턴은 주기적이거나 장시간 실행되는 배치 작업을 서버리스 컴퓨팅 환경에서 처리하기 위한 설계 방식이다. 이 패턴은 함수형 서비스(FaaS)의 짧은 실행 시간 제약을 우회하면서, 작업을 작은 단위로 분할하여 병렬 처리하는 데 중점을 둔다. 전통적인 상시 실행되는 크롤러 서버나 워커 프로세스를 함수의 집합체로 대체한다.
패턴은 일반적으로 두 가지 주요 구성 요소로 나뉜다. 첫 번째는 작업을 생성하고 조정하는 '크롤러' 또는 '오케스트레이터' 함수다. 이 함수는 주기적인 트리거(Trigger)(예: 클라우드 워치 이벤트)에 의해 실행되어 처리할 작업 목록(예: 처리할 파일 목록, 스캔할 URL 목록)을 생성한다. 두 번째는 실제 작업을 수행하는 '워커' 함수들이다. 오케스트레이터 함수는 각 작업 항목에 대해 별도의 워커 함수를 비동기적으로 호출하거나, 작업 메시지를 Amazon SQS나 Azure Queue Storage와 같은 메시지 큐에 넣는다.
이 패턴의 구현 방식은 다음과 같다.
구성 요소 | 역할 | 실행 트리거 예시 |
|---|---|---|
오케스트레이터 함수 | 작업 분할 및 워커 호출 조정 | 시간 기반 이벤트(예: 매일 자정) |
워커 함수 | 실제 데이터 처리 작업 수행 | 오케스트레이터의 직접 호출 또는 큐 메시지 |
메시지 큐 (선택사항) | 작업 항목을 저장하고 워커에 전달 | 큐에 새 메시지 추가 |
이 접근 방식의 주요 이점은 확장성과 비용 효율성이다. 수천 개의 작업 항목이 있어도 오케스트레이터는 그에 맞는 수의 워커 함수 인스턴스를 동시에 실행할 수 있으며, 작업이 없을 때는 비용이 발생하지 않는다. 또한, 개별 워커 함수의 실패가 전체 작업 흐름을 중단시키지 않도록 설계할 수 있다. 일반적인 사용 사례로는 대규모 데이터 집합의 일괄 변환, 정기적인 웹사이트 스크래핑, 그리고 일일 보고서 생성 작업 등이 있다[4].
서버리스 컴퓨팅을 구현하는 주요 상용 플랫폼으로는 AWS Lambda, Microsoft Azure Functions, Google Cloud Functions가 대표적이다. 이들은 모두 FaaS(Function as a Service) 모델을 제공하며, 개발자가 서버 인프라를 관리하지 않고도 코드를 실행할 수 있는 환경을 구축한다. 각 플랫폼은 특정 클라우드 생태계에 최적화되어 있으며, 지원하는 프로그래밍 언어, 트리거 통합, 실행 제한 사항에서 차이를 보인다.
플랫폼 | 제공사 | 주요 특징 |
|---|---|---|
가장 먼저 출시된 서비스로, AWS의 다양한 서비스(예: S3, API Gateway, DynamoDB)와의 통합이 깊다. | ||
.NET 생태계와의 강력한 통합을 제공하며, Microsoft Azure의 서비스와 자연스럽게 연동된다. | ||
Google Cloud Platform(GCP)의 서비스와 긴밀하게 연동되며, Firebase와의 통합이 용이하다. |
각 플랫폼은 코드를 패키징하여 업로드하면, 지정된 이벤트(예: HTTP 요청, 파일 업로드, 메시지 큐)가 발생할 때 해당 코드를 실행한다. 사용자는 코드가 실행된 시간과 횟수에 대해서만 비용을 지불하는 종량제 모델을 따른다. 또한, 오픈소스 진영에서는 Knative나 OpenFaaS와 같은 플랫폼 독립적인 솔루션도 존재하여, 하이브리드 클라우드나 온프레미스 환경에서 서버리스 기능을 구현할 수 있는 선택지를 제공한다[5].
AWS Lambda는 아마존 웹 서비스가 제공하는 서버리스 컴퓨팅 플랫폼이다. 사용자는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 함수 단위로 업로드하여 실행할 수 있다. Lambda는 코드 실행을 위한 모든 컴퓨팅 리소스를 자동으로 관리하며, 사용한 컴퓨팅 시간에 대해서만 비용을 지불하는 종량제 모델을 채택한다.
Lambda 함수는 다양한 이벤트 소스에 의해 트리거될 수 있다. 주요 트리거에는 Amazon S3 버킷의 객체 변경, Amazon DynamoDB 테이블 업데이트, Amazon API Gateway를 통한 HTTP 요청, Amazon Kinesis 데이터 스트림, 그리고 예약된 크론 작업 등이 포함된다. 함수는 Node.js, Python, Java, Go, .NET Core, Ruby 등의 런타임을 지원한다.
Lambda의 주요 특징은 탄력적인 확장성이다. 함수는 들어오는 이벤트나 요청 수에 따라 자동으로 확장되며, 각 요청은 별도의 실행 환경에서 처리된다. 이는 트래픽 급증 시에도 성능을 유지할 수 있게 해준다. 실행 환경은 함수가 비활성 상태일 때 재사용될 수 있어 성능을 최적화하지만, 초기 실행 시 발생하는 콜드 스타트 지연은 여전히 고려해야 할 요소이다.
사용자는 함수 코드, 메모리 할당량(128MB ~ 10GB), 최대 실행 시간(최대 15분)을 구성한다. Lambda는 함수의 성능 메트릭과 로그를 Amazon CloudWatch와 통합하여 제공하므로, 모니터링과 디버깅이 가능하다. 또한 AWS Identity and Access Management를 통해 함수에 대한 세분화된 접근 제어를 설정할 수 있다.
Azure Functions는 마이크로소프트의 클라우드 컴퓨팅 플랫폼인 Microsoft Azure에서 제공하는 서버리스 컴퓨팅 서비스이다. 이는 이벤트 기반으로 코드를 실행할 수 있는 함수형 서비스(FaaS) 플랫폼으로, 개발자가 인프라를 프로비저닝하거나 관리할 필요 없이 애플리케이션 로직에 집중할 수 있게 해준다. 함수는 다양한 프로그래밍 언어로 작성할 수 있으며, HTTP 요청, 데이터베이스 업데이트, 메시지 큐 항목, 타이머 등 다양한 트리거에 의해 실행된다.
Azure Functions는 여러 프로그래밍 언어와 런타임을 지원한다. 주요 지원 언어로는 C#, JavaScript, Python, Java, PowerShell 등이 포함된다. 함수는 소비 요금제, 프리미엄 요금제, 전용(App Service) 요금제 등 다양한 호스팅 계획을 통해 배포될 수 있다. 소비 요금제는 전형적인 서버리스 모델로, 함수가 실행되는 시간과 횟수에 대해서만 비용이 청구된다. 프리미엄 요금제는 미리 준비된 인스턴스를 제공하여 콜드 스타트 문제를 완화하고 VNet 연결과 같은 고급 기능을 제공한다.
이 플랫폼은 Azure Blob Storage, Azure Cosmos DB, Azure Event Hubs, Service Bus 등 다양한 Azure 서비스와의 통합을 기본적으로 지원한다. 또한 API Management, Application Insights와 같은 서비스와 쉽게 연동되어 API 게이트웨이 구성, 모니터링, 진단 기능을 활용할 수 있다. 개발자는 Visual Studio, Visual Studio Code, 또는 포털 내 통합 개발 환경을 사용하여 함수를 개발, 테스트, 배포할 수 있다.
Azure Functions는 마이크로서비스 아키텍처, 데이터 처리, 예약 작업, API 백엔드 구현 등 다양한 시나리오에 적합하다. 내장된 Durable Functions 확장을 사용하면 상태 저장 워크플로를 서버리스 환경에서 오케스트레이션할 수 있어 복잡한 비즈니스 프로세스를 구현하는 데 유용하다.
Google Cloud Functions는 구글 클라우드 플랫폼(GCP)에서 제공하는 완전 관리형 서버리스 컴퓨팅 서비스이다. 이 서비스는 개발자가 인프라 관리 없이 코드를 실행할 수 있게 하며, 클라우드 이벤트나 HTTP 요청에 의해 트리거된다. Node.js, Python, Go, Java, .NET, Ruby, PHP 등 다양한 런타임을 지원한다.
주요 특징으로는 이벤트 기반 아키텍처에 최적화된 통합이 있다. 함수는 Cloud Storage 버킷의 파일 변경, Cloud Pub/Sub 토픽의 메시지, Firestore의 데이터베이스 변경, 또는 HTTP 요청과 같은 이벤트에 의해 자동으로 실행된다. 또한 Google Cloud Build와의 통합을 통해 지속적 배포(CI/CD) 파이프라인을 쉽게 구성할 수 있다.
비용 모델은 사용한 컴퓨팅 시간, 함수 호출 횟수, 네트워크 대역폭 사용량에 따라 과금되는 종량제 방식이다. 무료 등급도 제공되어 소규모 애플리케이션 개발 및 테스트에 유용하다. 다른 GCP 서비스와의 긴밀한 통합은 Google Cloud Functions의 주요 강점으로, Cloud Logging과 Cloud Monitoring을 통한 로깅 및 관찰이 기본적으로 제공된다.
서버리스 컴퓨팅은 기존의 서버 중심 모델과 비교하여 몇 가지 뚜렷한 이점을 제공한다. 가장 큰 장점은 비용 효율성이다. 사용자는 서버를 프로비저닝하거나 관리할 필요 없이 코드가 실제로 실행된 시간과 리소스 사용량에 대해서만 비용을 지불한다. 이는 유휴 상태의 서버에 대한 비용이 발생하지 않음을 의미하며, 특히 트래픽 패턴이 불규칙하거나 예측하기 어려운 애플리케이션에서 경제적이다.
두 번째 핵심 장점은 탄력적이고 자동화된 확장성이다. 서버리스 플랫폼은 들어오는 요청이나 이벤트의 수에 따라 자동으로 애플리케이션 인스턴스를 확장하거나 축소한다. 이는 개발자가 확장 정책을 미리 구성하거나 용량 계획에 신경 쓸 필요가 없게 하여, 갑작스러운 트래픽 급증에도 원활하게 대응할 수 있도록 보장한다.
또한, 운영 부담이 현저히 감소한다. 인프라 관리, 서버 패치, 운영 체제 유지 관리, 하드웨어 프로비저닝과 같은 일상적인 작업이 클라우드 공급자에게 위임된다. 이는 개발 팀이 애플리케이션 로직과 비즈니스 가치 창출에 더 집중할 수 있도록 해주며, 개발 생산성과 출시 속도를 높이는 데 기여한다.
마지막으로, 서버리스는 마이크로서비스 아키텍처와 자연스럽게 조화를 이룬다. 각 기능을 작고 독립적인 함수로 구현할 수 있어, 시스템을 느슨하게 결합된 구성 요소로 분해하는 데 이상적이다. 이는 개별 서비스의 배포, 업데이트, 확장을 독립적으로 수행할 수 있게 하여 전체적인 애플리케이션의 유연성과 유지보수성을 향상시킨다.
서버리스 컴퓨팅의 비용 효율성은 사용한 만큼만 지불하는 사용량 기반 과금 모델에서 비롯된다. 기존의 클라우드 컴퓨팅 모델에서는 프로비저닝된 서버의 용량(예: 가상 머신 인스턴스의 수나 크기)에 대해 사용 여부와 관계없이 비용이 발생했지만, 서버리스 환경에서는 코드가 실제로 실행되는 시간(일반적으로 100밀리초 단위)과 실행 횟수에 대해서만 비용을 지불한다. 이는 리소스의 유휴 상태에 대한 비용을 완전히 제거함을 의미한다.
비용 구조는 주로 두 가지 요소로 구성된다. 첫째는 함수의 실행 횟수이며, 둘째는 실행에 소요된 시간과 할당된 메모리 용량을 곱한 GB-초 단위의 리소스 소비량이다. 이는 소규모이거나 간헐적인 트래픽을 처리하는 애플리케이션에 특히 유리하다. 예를 들어, 매일 몇 번만 호출되는 백업 작업이나 사용자 가입 시 한 번 실행되는 환영 이메일 발송 함수는 전용 서버를 24시간 가동하는 것에 비해 극히 저렴한 비용으로 운영될 수 있다.
비용 요소 | 전통적 클라우드(예: IaaS) | 서버리스(예: FaaS) |
|---|---|---|
계산 기준 | 프로비저닝된 용량(시간 단위) | 실행 횟수 및 실행 시간(GB-초) |
유휴 상태 비용 | 있음 | 없음 |
확장에 따른 비용 변화 | 수동 조정 필요, 용량 예측 필요 | 자동 확장, 사용량에 따라 선형 증가 |
또한, 서버리스 아키텍처는 운영 및 인프라 관리 비용을 간접적으로 절감한다. 개발 팀은 서버의 프로비저닝, 패치 관리, 운영 체제 유지보수, 고가용성 구성 등에 드는 시간과 인력을 절약할 수 있으며, 이는 인건비 절감으로 이어진다. 따라서 총 소유 비용 측면에서 예측 불가능하거나 변동성이 큰 워크로드를 처리할 때 높은 경제성을 보인다.
서버리스 컴퓨팅의 확장성은 자동적이고 탄력적인 특성에서 비롯된다. 개발자가 서버 용량을 미리 프로비저닝하거나 관리할 필요 없이, 플랫폼이 수신되는 이벤트나 요청의 양에 따라 자동으로 컴퓨팅 리소스를 할당하고 조정한다. 이는 수직적 확장이 아닌 수평적 확장 방식으로, 단일 인스턴스의 성능을 높이는 대신 필요에 따라 동시에 실행되는 함수 인스턴스의 수를 늘리는 방식으로 작동한다.
이 확장은 거의 실시간에 가깝게 이루어진다. 트래픽이 급증하면 플랫폼은 추가 함수 인스턴스를 즉시 생성하여 부하를 분산시키고, 트래픽이 감소하면 사용되지 않는 인스턴스를 자동으로 종료한다. 이 과정은 완전히 자동화되어 있어, 개발자나 운영팀이 개입할 필요가 없다. 결과적으로 애플리케이션은 예측 불가능한 트래픽 패턴에도 유연하게 대응할 수 있으며, 사용량이 거의 없는 상태에서도 항상 가용성을 유지한다.
확장 특성 | 설명 |
|---|---|
자동 확장 | 트리거된 이벤트 수에 비례하여 함수 인스턴스가 자동으로 생성 및 소멸됨 |
탄력적 확장 | 제로에서 수천 개의 동시 실행까지 빠르게 확장 및 축소 가능 |
세분화된 확장 | 각 함수가 독립적으로 확장되므로, 애플리케이션 내 특정 기능만 스케일링 가능 |
이러한 세분화된 확장성은 마이크로서비스 아키텍처와 잘 맞는다. 애플리케이션을 여러 개의 독립적인 함수로 분해하면, 각 함수는 자신에게 할당된 작업의 부하에 따라 개별적으로 확장될 수 있다. 예를 들어, 사용자 가입 함수는 주말에 트래픽이 몰릴 수 있지만, 일일 보고서 생성 함수는 매일 정해진 시간에만 실행될 수 있다. 서버리스 플랫폼은 각 함수의 고유한 트래픽 패턴을 인식하고 최적의 리소스를 할당하여 전체적인 자원 효율성을 높인다.
서버리스 컴퓨팅은 개발자가 서버 인프라의 프로비저닝, 패치, 운영, 확장 및 가용성 관리와 같은 일상적인 운영 작업에 대한 부담을 크게 줄여줍니다. 인프라 관리 책임의 상당 부분이 클라우드 서비스 공급자로 이전되기 때문입니다. 개발자는 애플리케이션 코드와 비즈니스 로직 작성에 집중할 수 있으며, 플랫폼이 자동으로 리소스 할당, 운영 체제 유지 관리, 용량 계획 및 보안 패치를 처리합니다.
이로 인해 운영 팀의 구성과 업무도 변화합니다. 전통적인 운영 엔지니어 역할이 줄어들거나, 인프라 운영보다는 플랫폼 관리, 모니터링, DevOps 자동화 및 비용 최적화에 더 중점을 둔 SRE(Site Reliability Engineering) 역할로 전환되는 경우가 많습니다. 서버리스 환경에서는 확장성과 가용성이 기본적으로 제공되므로, 수동으로 서버 클러스터를 관리하거나 부하 분산기를 구성할 필요가 없습니다.
운영 부담 감소의 구체적인 측면은 다음 표와 같이 정리할 수 있습니다.
전통적 아키텍처에서의 운영 작업 | 서버리스 아키텍처에서의 처리 방식 |
|---|---|
서버 프로비저닝 및 용량 계획 | 공급자가 자동으로 처리. 사용량에 따라 실시간으로 확장. |
운영 체제 및 미들웨어 패치 | 공급자가 기본 플랫폼을 관리. |
고가용성 및 재해 복구 설정 | 플랫폼의 기본 기능으로 제공되는 경우가 많음. |
모니터링 인프라 설정 | 통합된 로깅 및 모니터링 서비스(예: AWS CloudWatch) 제공. |
결과적으로 조직은 더 빠른 출시 주기와 더 낮은 운영 비용을 실현할 수 있습니다. 새로운 기능을 배포하거나 업데이트할 때 인프라 변경을 고려하거나 준비할 필요 없이 코드 배포에만 집중하면 됩니다. 다만, 운영 부담이 완전히 사라지는 것은 아니며, 애플리케이션 수준의 모니터링, 보안, 비용 관리 및 벤더 종속성 평가와 같은 새로운 형태의 운영 책임이 발생합니다.
서버리스 컴퓨팅은 여러 장점을 제공하지만, 몇 가지 고유한 도전 과제와 제약 사항도 존재합니다. 가장 대표적인 문제는 콜드 스타트입니다. 함수가 일정 시간 동안 호출되지 않아 컨테이너가 종료된 후, 새로운 요청이 들어오면 실행 환경을 처음부터 초기화해야 합니다. 이로 인해 발생하는 지연 시간은 실시간 응답이 중요한 애플리케이션에서 성능 문제를 일으킬 수 있습니다. 플랫폼 제공자들은 프리워밍, 프로비저닝된 동시성 등 다양한 방법으로 이 문제를 완화하고 있지만, 완전한 해결은 어렵습니다.
디버깅과 모니터링 또한 복잡성을 증가시킵니다. 애플리케이션 로직이 수많은 작고 분산된 함수로 쪼개져 있고, 이들이 짧은 시간 동안만 실행된 후 사라지기 때문에 전통적인 디버깅 도구를 사용하기 어렵습니다. 또한, 여러 함수와 백엔드 서비스가 얽힌 분산 트랜잭션을 추적하고 모니터링하는 것은 기존의 모놀리식 애플리케이션보다 훨씬 복잡한 작업입니다. 이를 위해 AWS X-Ray, Azure Application Insights와 같은 플랫폼별 분산 추적 도구의 활용이 필수적입니다.
도전 과제 | 설명 | 완화 방안 예시 |
|---|---|---|
함수 실행 환경의 초기화로 인한 지연 | 프리워밍, 프로비저닝된 동시성 사용 | |
디버깅 및 모니터링 | 분산된 함수의 실행 흐름 추적 난이도 | 플랫폼별 분산 추적 도구(예: AWS X-Ray) 활용 |
특정 클라우드 공급자의 서비스 및 API에 대한 의존 | 서버리스 프레임워크 사용, 추상화 레이어 도입 | |
실행 시간 및 메모리 제한 | 함수의 최대 실행 시간과 할당 메모리 제약 | 장시간 작업은 큐나 배치 서비스로 분리 |
또 다른 중요한 도전 과제는 벤더 종속성입니다. 애플리케이션이 특정 클라우드 공급자의 함수형 서비스, 이벤트 소스, 기타 관리형 서비스에 깊게 의존하게 되면, 플랫폼을 전환하는 것이 매우 어려워집니다. 이는 잠재적인 비용 상승이나 서비스 중단 위험을 초래할 수 있습니다. 또한, 대부분의 서버리스 플랫폼은 함수의 최대 실행 시간(예: 15분)과 메모리 한도를 설정하여, 장시간 실행되는 배치 작업이나 대용량 데이터 처리를 위한 사용을 제한합니다.
콜드 스타트는 서버리스 컴퓨팅 환경에서 함수가 일정 시간 비활성 상태 후 호출될 때 발생하는 초기 지연 현상이다. 함수 코드가 실행되기 위해서는 런타임 환경이 준비되어야 하는데, 이 과정에서 컨테이너를 프로비저닝하고 코드를 로드하며 초기화를 수행하는 데 시간이 소요된다. 이 지연 시간은 함수의 실행 시간에 추가되어 응답 지연을 유발한다.
콜드 스타트의 지속 시간은 여러 요인에 의해 결정된다. 사용하는 프로그래밍 언어(예: Java나 .NET은 Python이나 Node.js에 비해 일반적으로 초기화 시간이 더 길다), 함수 코드의 패키지 크기, 연결된 라이브러리의 수와 복잡성, 그리고 클라우드 제공업체의 내부 구현 방식이 주요 변수이다. 또한, 함수가 완전히 새로운 인스턴스에서 시작되는 '완전한 콜드 스타트'와 기존 인스턴스가 재사용되는 '워밍된(warmed) 스타트' 사이에는 성능 차이가 존재한다.
이 문제를 완화하기 위한 여러 전략이 개발되었다. 가장 일반적인 방법은 정기적으로 함수를 호출하여 인스턴스를 활성 상태로 유지하는 '워밍(warming)'이다. 또한, 함수 코드를 최소화하고, 가벼운 런타임을 선택하며, 프로비저닝된 동시성(Provisioned Concurrency)과 같은 관리형 서비스를 활용하여 미리 지정된 수의 실행 환경을 준비 상태로 유지할 수 있다. 일부 플랫폼은 점진적으로 코드를 로드하거나 더 빠른 초기화를 지원하는 최적화된 런타임을 제공하기도 한다.
서버리스 환경에서 디버깅은 전통적인 서버 기반 애플리케이션과 근본적으로 다른 접근이 필요하다. 함수는 짧은 수명을 가지며, 상태를 유지하지 않고, 완전히 관리되는 플랫폼에서 실행된다. 이로 인해 개발자는 런타임 환경에 직접 접근하거나 SSH로 서버에 연결하여 로그를 실시간으로 확인하는 전통적인 방식의 디버깅을 사용할 수 없다. 대신, 디버깅은 주로 함수 실행 후 생성되는 상세한 로그 스트림과 분산 추적(Distributed Tracing) 도구에 의존한다. 개발자는 코드에 로깅 문을 명시적으로 삽입하고, 플랫폼이 제공하는 로그 집계 서비스(예: AWS CloudWatch, Azure Application Insights)를 통해 실행 기록, 오류 메시지, 성능 지표를 분석한다.
효율적인 모니터링은 서버리스 아키텍처의 건강 상태를 파악하는 핵심이다. 모니터링의 초점은 단일 서버의 가용성이 아니라 함수의 실행 횟수(Invocation), 지연 시간(Latency), 오류율(Error Rate), 제한(Throttling) 발생 여부 등으로 이동한다. 주요 클라우드 제공업체들은 이러한 메트릭을 시각화하는 대시보드를 제공한다. 또한, 분산 트랜잭션의 추적은 특히 중요하다. 하나의 비즈니스 요청이 여러 함수와 백엔드 서비스를 거칠 수 있기 때문에, 요청 ID를 기반으로 전체 호출 체인을 따라가며 병목 지점이나 실패 지점을 찾아내는 분산 추적 시스템의 통합이 필수적이다.
서버리스 모니터링의 도전 과제는 짧고 빈번한 함수 실행에서 발생하는 방대한 양의 데이터를 처리하고, 의미 있는 인사이트를 도출하는 데 있다. 이를 위해 다음과 같은 주요 지표를 체계적으로 관찰한다.
모니터링 카테고리 | 주요 지표 | 설명 |
|---|---|---|
실행 성능 | 실행 시간(Duration), 초기화 시간(Init Duration) | 함수 코드 실행 및 런타임 초기화에 소요된 시간. 콜드 스타트 영향을 파악하는 데 중요하다. |
실행 빈도 | 호출 횟수(Invocation Count) | 함수가 트리거된 횟수. 트래픽 패턴과 비용 추정의 기초가 된다. |
실패 및 제한 | 오류 횟수(Error Count), 제한 횟수(Throttle Count) | 실행 실패 횟수와 플랫폼 정책에 의해 거부된 실행 횟수. |
리소스 활용 | 할당된 메모리 사용량(Memory Utilization) | 함수에 할당된 메모리의 실제 사용 비율. |
이러한 도구와 지표를 활용함으로써 개발팀은 애플리케이션의 성능을 지속적으로 최적화하고, 비정상적인 동작을 조기에 감지하여 대응할 수 있다.
벤더 종속성은 서버리스 컴퓨팅 채택 시 주요한 고려 사항 중 하나이다. 이는 특정 클라우드 벤더의 FaaS 플랫폼, BaaS 서비스, 그리고 해당 벤더의 고유한 API, 도구, 런타임 환경에 애플리케이션이 깊이 의존하게 되는 현상을 의미한다.
벤더 종속성은 여러 측면에서 문제를 일으킬 수 있다. 첫째, 애플리케이션의 이식성이 제한된다. 예를 들어, AWS Lambda에 최적화된 코드와 Amazon S3 이벤트 트리거를 사용하는 애플리케이션을 Google Cloud Functions로 쉽게 옮기기 어렵다. 각 플랫폼은 함수 서명, 이벤트 객체 형식, 배포 및 구성 방식이 상이하기 때문이다. 둘째, 비용 구조와 서비스 한도가 벤더에 종속된다. 특정 벤더의 가격 정책 변경이나 서비스 중단은 애플리케이션 운영에 직접적인 영향을 미친다. 셋째, 특정 벤더의 독자적인 서비스나 런타임에 의존할 경우, 기술 스택의 선택지가 제한되고 미래의 기술 변화에 대응하는 유연성이 떨어진다.
이러한 종속성을 완화하기 위한 몇 가지 접근법이 존재한다. 하나는 서버리스 프레임워크를 사용하는 것이다. Serverless Framework나 AWS SAM 같은 도구는 배포 프로세스를 추상화하여 다중 클라우드 배포를 용이하게 할 수 있다. 다른 방법은 비즈니스 로직을 플랫폼 중립적인 방식으로 작성하고, 벤더별 코드를 최소한의 어댑터 계층으로 격리하는 설계 원칙을 적용하는 것이다. 또한, CNCF의 Knative나 OpenFaaS 같은 오픈소스 서버리스 플랫폼을 검토함으로써 특정 상용 클라우드에 대한 종속을 줄일 수 있다. 그러나 이러한 접근법도 완전한 이식성을 보장하지는 않으며, 관리의 복잡성을 증가시킬 수 있다[8]. 따라서 조직은 애플리케이션의 장기적 유지보수성과 벤더 잠금의 위험을 사전에 평가하고, 적절한 절충점을 찾아야 한다.
서버리스 컴퓨팅 아키텍처는 특정한 트리거에 반응하여 짧은 시간 내에 실행되는 작업에 특히 적합하다. 이는 마이크로서비스를 구성하는 개별적인 기능 단위로 구현되거나, 기존 애플리케이션의 특정 백엔드 로직을 분리하는 데 널리 사용된다. 주요 사용 사례는 크게 실시간 데이터 처리, 자동화된 백엔드 API 제공, 그리고 이벤트 중심의 애플리케이션 통합으로 구분된다.
실시간 파일 처리는 대표적인 사례이다. 사용자가 클라우드 스토리지에 이미지나 동영상 파일을 업로드하면, 이 업로드 이벤트가 트리거가 되어 서버리스 함수를 실행한다. 함수는 자동으로 파일의 썸네일을 생성하거나, 포맷을 변환하거나, 콘텐츠를 분석하는 작업을 수행한다. 마찬가지로, IoT 데이터 처리에서도 센서에서 수집된 스트리밍 데이터가 이벤트로 전달되면, 서버리스 함수가 실시간으로 데이터를 필터링, 집계, 변환하여 다른 저장소나 분석 시스템으로 전달한다. 이러한 패턴은 지속적으로 실행되는 서버를 프로비저닝할 필요 없이, 실제 데이터 발생 시에만 리소스를 소비한다.
사용 사례 | 설명 | 트리거 예시 |
|---|---|---|
실시간 파일 처리 | 업로드된 미디어 파일의 변환, 분석, 검증 | 객체 스토리지 업로드 이벤트 |
IoT 데이터 처리 | 센서 데이터 스트림의 실시간 처리 및 집계 | 메시지 큐 또는 이벤트 스트림 메시지 |
API 백엔드 | 마이크로서비스 기반의 백엔드 비즈니스 로직 제공 | HTTP 요청 (API Gateway) |
예약된 작업 | 정기적인 데이터베이스 정리, 리포트 생성 | 크론(Cron)식 타이머 이벤트 |
챗봇 및 웹훅 | 외부 서비스(슬랙, 깃허브) 이벤트에 대한 응답 | 웹훅 HTTP 요청 |
또한, 서버리스는 마이크로서비스 아키텍처를 구현하는 효율적인 수단이 된다. 각 비즈니스 기능(예: 사용자 인증, 결제 처리, 알림 발송)을 독립적인 함수로 개발하고, API 게이트웨이를 통해 하나의 완전한 애플리케이션 프로그래밍 인터페이스로 노출할 수 있다. 이는 개발 팀이 서로 다른 기능을 독립적으로 배포하고 확장할 수 있게 하며, 특정 함수의 트래픽 증가가 다른 서비스에 영향을 미치지 않도록 보장한다. 이러한 특성은 빠르게 변화하는 요구사항에 대응해야 하는 현대 애플리케이션 개발에 매우 유용하다.
서버리스 컴퓨팅은 이벤트 기반 실행 모델을 통해 실시간 파일 처리에 매우 적합한 아키텍처를 제공한다. 이 패턴에서는 클라우드 스토리지 서비스(예: AWS S3, Azure Blob Storage, Google Cloud Storage)에 파일이 업로드되는 것을 트리거로 사용한다. 파일 업로드 이벤트가 발생하면, 미리 정의된 서버리스 함수가 자동으로 실행되어 해당 파일을 즉시 처리한다.
일반적인 처리 작업에는 이미지 리사이징, 동영상 트랜스코딩, 로그 파일 분석, 데이터 검증 및 변환이 포함된다. 예를 들어, 사용자가 웹 애플리케이션을 통해 프로필 사진을 업로드하면, S3 버킷에 저장되는 순간 Lambda 함수가 트리거되어 다양한 해상도의 썸네일을 생성하고 결과를 다시 스토리지에 저장할 수 있다. 이 과정은 완전히 자동화되어 있으며, 개발자는 파일 업로드 인프라나 처리 서버의 관리에 신경 쓸 필요가 없다.
이 아키텍처의 주요 장점은 탄력적인 확장성과 비용 효율성이다. 한 번에 수천 개의 파일이 업로드되더라도 플랫폼은 필요한 만큼 함수 인스턴스를 병렬로 생성하여 모든 파일을 동시에 처리한다. 반대로 처리할 파일이 없을 때는 함수가 실행되지 않아 인프라 비용이 전혀 발생하지 않는다. 이는 전통적인 상시 실행 서버를 사용할 때의 비용과 관리 부담을 크게 줄여준다.
처리 단계 | 설명 | 관련 서비스 예시 |
|---|---|---|
1. 파일 업로드 | 사용자 또는 시스템이 클라우드 스토리지에 파일 저장 | |
2. 이벤트 트리거 | 스토리지의 '생성' 이벤트가 서버리스 함수 실행 | |
3. 파일 처리 | 함수가 파일을 읽어 비즈니스 로직(변환, 분석 등) 실행 | 내부 코드 또는 외부 API 호출 |
4. 결과 저장/전송 | 처리된 데이터를 스토리지에 저장하거나 다른 서비스로 전달 | 데이터베이스, 메시지 큐, 다른 스토리지 |
이 패턴은 배치 처리와 달리 지연 시간이 매우 짧아 실시간성이 요구되는 시나리오에 적합하다. 그러나 대용량 파일을 처리할 때는 함수의 실행 시간 제한과 메모리 한계를 고려해야 하며, 경우에 따라 처리 단계를 여러 개의 작은 함수로 분할하거나 전문 미디어 처리 서비스와 연동하는 설계가 필요하다.
IoT 데이터 처리는 서버리스 컴퓨팅의 대표적인 사용 사례 중 하나이다. 수많은 IoT 기기에서 생성되는 지속적이고 변동성이 큰 데이터 스트림을 처리하는 데 서버리스 아키텍처가 이상적으로 적용된다. 센서나 디바이스는 이벤트를 발생시키고, 이는 클라우드의 함수형 서비스를 트리거하여 데이터를 변환, 집계, 분석하거나 다른 백엔드 서비스에 저장하도록 한다. 이 방식은 전통적인 상시 실행 서버를 프로비저닝할 필요 없이, 실제 발생하는 이벤트 양에만 대응하여 리소스를 사용하게 한다.
처리 흐름은 일반적으로 다음과 같은 단계로 구성된다. IoT 디바이스는 MQTT나 HTTP 프로토콜을 통해 메시지 브로커나 API 게이트웨이로 데이터를 전송한다. 이 수신 행위 자체가 트리거가 되어 특정 함수를 실행시킨다. 예를 들어, 온도 센서 데이터가 도착하면, AWS Lambda 함수가 실행되어 데이터의 유효성을 검사하고, 이상값을 필터링하며, 정규화된 데이터를 Amazon DynamoDB 같은 데이터베이스에 저장하거나, Amazon Kinesis 같은 스트리밍 분석 서비스로 전달할 수 있다.
서버리스 접근 방식의 주요 이점은 탁월한 확장성과 비용 효율성에 있다. 새벽 시간대처럼 데이터 트래픽이 적을 때는 함수 실행 횟수가 줄어들어 비용이 거의 발생하지 않는다. 반면, 특정 시간에 수만 개의 디바이스가 동시에 데이터를 보고하면, 플랫폼은 자동으로 필요한 만큼의 함수 인스턴스를 병렬로 생성하여 처리 지연을 방지한다. 이는 수동으로 서버 용량을 관리하거나 과도하게 프로비저닝할 필요가 없음을 의미한다.
처리 단계 | 역할 | 대표 서비스/기술 |
|---|---|---|
데이터 수집 | 디바이스에서 클라우드로 이벤트 전송 | AWS IoT Core, Azure IoT Hub, Google Cloud IoT Core |
이벤트 트리거 | 수신된 데이터가 함수 실행을 시작 | 메시지 큐(IoT Core 메시지), API 호출, 스트림 이벤트 |
함수 실행 | 데이터 처리 로직(필터링, 변환, 강화) 실행 | AWS Lambda, Azure Functions, Google Cloud Functions |
결과 저장/전달 | 처리된 데이터를 다음 목적지로 라우팅 | 데이터베이스(DynamoDB, Cosmos DB), 스트림 분석(Kinesis, Dataflow), 알림 서비스(SNS) |
이러한 아키텍처는 실시간 예측 유지보수, 스마트 시티의 교통 흐름 분석, 연결된 공장의 생산 라인 모니터링 등 다양한 시나리오에 적용된다. 다만, 매우 짧은 간격으로 대량의 이벤트가 지속적으로 발생하는 경우, 함수의 빈번한 호출로 인한 비용 증가나 콜드 스타트로 인한 초기 지연이 고려되어야 하는 도전 과제로 남아 있다.
마이크로서비스 아키텍처는 하나의 애플리케이션을 작고 독립적인 서비스들의 집합으로 구성하는 소프트웨어 설계 방식이다. 각 서비스는 특정 비즈니스 기능을 담당하며, API를 통해 서로 통신한다. 서버리스 컴퓨팅은 이러한 마이크로서비스의 구현과 운영을 위한 이상적인 플랫폼으로 주목받는다. 서버리스 환경에서는 각 마이크로서비스를 독립적인 함수(Function)로 배포하고, 필요할 때만 실행하며, 사용한 만큼만 비용을 지불할 수 있다.
서버리스 아키텍처를 적용하면 마이크로서비스의 핵심 원칙을 더 효과적으로 실현할 수 있다. 첫째, 각 함수는 단일 책임 원칙에 따라 특정 작업만 수행하므로 서비스의 경계가 명확해진다. 둘째, AWS Lambda나 Azure Functions 같은 플랫폼이 자동 확장을 관리하므로, 개발팀은 서비스의 규모에 관계없이 일관된 성능을 제공하는 데 집중할 수 있다. 이는 마이크로서비스의 독립적인 배포와 확장성을 극대화한다.
이 접근 방식은 다음과 같은 구체적인 이점을 제공한다.
이점 | 설명 |
|---|---|
기술 스택의 자유도 | 각 마이크로서비스(함수)는 서로 다른 런타임(예: Node.js, Python, Go)으로 작성될 수 있다. |
팀 독립성 | 작고 자율적인 팀이 전체 서비스가 아닌 자신이 담당하는 함수의 개발, 배포, 운영에 전념할 수 있다. |
복원력 | 하나의 함수에 장애가 발생해도 다른 함수들은 영향을 받지 않고 계속 실행될 수 있다. |
그러나 서버리스 마이크로서비스는 벤더 종속성 증가, 분산 시스템으로 인한 복잡한 모니터링, 서비스 간 통신 지연(콜드 스타트 문제의 영향 포함) 등의 새로운 도전 과제를 야기하기도 한다. 따라서 API 게이트웨이 패턴이나 이벤트 기반 통신을 활용하여 서비스를 느슨하게 결합하고, 분산 추적 도구를 도입하는 것이 성공적인 구현에 필수적이다.