1. Serverless란?
- 서버리스는 말 그대로 ‘서버(Server)가 없다(-less)’는 뜻
- 하지만 실제로 서버가 없는 구조는 아니고, 서버에서 처리하는 작업을 클라우드 기반의 서비스로 처리해서 서버 구축 및 관리 비용을 줄이는 구조
- 따라서 개발 기간과 비용을 단축할 수 있을 뿐 아니라, 서버 운영과 유지 보수의 어려움을 크게 줄일 수 있습니다.
서버리스의 두 가지 중요 포인트
- 서비스형 서버리스(Serviceful Serverless)
- FaaS(Functions as a Service)
1-1. Serviceful Serverless
- 서비스형 서버리스는 직접 서버를 구축하고 프로비저닝하고 관리할 필요 없이, 서버의 역할을 서비스 형태로 사용하는 것을 의미.
- 예를 들어 인증의 경우, 매번 새로 구축해야 하지만 Auth0 이나 Amazon Cognito 와 같은 인증 서비스를 사용하면 대부분의 구현을 대체 가능.
- 특히 Amazon Web Service 나 Google Cloud Platform 같은 Public Cloud 는 많은 종류의 서비스를 제공
- 컴퓨팅 리소스, 스토리지, 네트워크, 머신 러닝과 모바일 백엔드, 머신 러닝, 블록체인, IoT, 그리고 인공위성 제어, 데이터베이스와 파일 스토리지, 메시징 서비스 등
- 이러한 기능을 복잡한 인프라 구성 없이 간편하게 사용할 수 있음.
1-2. FaaS
- FaaS(Function-as-a-Service)는 함수를 서비스로 제공하는 형태
- 사용자가 원하는 로직을 함수로 작성만 해놓으면 (특정 조건 하에) 함수가 실행.
- 좀 더 구체적으로는 함수가 호출되면 VM(또는 컨테이너)가 실행되고 해당 런타임 내에서 정의해놓은 함수가 실행
- 실행 후 VM(또는 컨테이너)는 종료됩니다.
- 이러한 함수는 서버가 계속 대기하면서 사용자의 요청을 처리하는 것이 아니라, 이벤트가 있을 때마다 실행되는 작은 코드
- 따라서 주요 서비스 사이에서 간단한 작업을 처리하는 용도로 사용
vs. XaaS
- Xaas는 서비스로서 무엇이든 제공하는 일반적인 집합 용어.
)
- Legacy: 기존 시스템은 인프라부터 소프트웨어까지 전부 구축하고 개발 필요
- Infrastructure-as-a-Service:필요한 하드웨어와 가상화, OS 등 인프라 요소를 서비스 형태로 제공. 원하는 사양의 서버를 VM 으로 생성 가능.
- Container-as-a-Service: 서비스 형태로 제공되는 컨테이너를 활용해 애플리케이션을 배포
- Platform-as-a-Service: 애플리케이션 개발에 집중할 수 있도록 인프라와 런타임 환경을 제공
- Function-as-a-Service: 실행할 함수 코드에만 집중
- Software-as-a-Service: 제공되는 소프트웨어를 사용하는 형태.
Paas vs Faas
- 서버 유무: PaaS 는 그 플랫폼 위에 내 서버를 띄워야 하는 반면, FaaS 는 사용자가 관리할 서버가 없음.
- 확장: PaaS 는 확장이 서버 단위로, FaaS 는 함수 단위
- 비용: PaaS 는 실행되는 서버 리소스의 스펙과 사용 시간에 따라 과금이 되고, FaaS 는 해당 함수의 호출 횟수와 수행 시간에 따라 과금
Function 구성 요소
세 가지의 구성 요소로 이루어져 있음.
- Handler 함수: 호출 시 실행되는 함수
- Event 객체: 함수가 호출된 이벤트 정보를 담고 있는 객체
- Context 객체: 해당 함수의 컨텍스트 정보(실행 관련 정보)를 담고 있는 객체
Function 내부 구조
FaaS 는 개념적으로 보면 다음과 같이 구성되어 있습니다.
- Event Source: 함수가 실행될 조건이자 이벤트 소스 (HTTP 요청, 메시징, Cron 등)
- Function: 작업할 내용
- Service: 작업 결과를 처리(DB 저장, 다른 서비스로 전달, 메시징, 출력 등)
위 그림은 함수를 좀 더 자세히 들여다본 그림입니다.
- Compute substrate: 함수가 실행될 VM(또는 컨테이너)
- Execution Environment: 그 위에 환경 변수 등 실행 환경이 포함
- Language runtime: 그 위에 언어별 런타임이 올라갑니다. 언어에 따라 성능 차이가 있음
- Your function
FaaS 성능 최적화
- FaaS 는 항상 띄워놓은 서버에 비해서 확실히 자원을 적게 소모하고 비용을 감소
- 하지만 서버에서 요청이 있을 때마다 VM 이나 컨테이너를 띄운다 → 성능 이슈 → FaaS 성능 향상 필요
Cold Start Delay
- 위 그림은 AWS Lambda 함수의 라이프사이클
- 처음에 해당 함수 코드를 찾아 다운로드하고 새로운 실행 환경을 구성
- 이 과정을 차갑게 식은 서버를 실행하는 것에 비유해 콜드 스타트(Cold Start)라고 불림.
- 함수를 처음 호출할 때나 업데이트 된 후 실행할 경우 어쩔 수 없이 발생하는 지연(delay)
- 함수가 실행되고 나면 이후에 또 다른 호출을 대비해서 실행 컨텍스트를 잠깐 동안 유지
- 따라서 해당 서버가 아직 내려가지 않은 따뜻한(warm) 상태라면 준비 과정을 거치지 않고 빠르게 함수가 수행
- 이를 이용해 주기적으로 함수를 호출하도록 스케줄링하면, 서버가 내려가지 않도록 warm 상태를 유지
Function
함수 영역을 최적화할 수 있는 방법
- 함수는 처음 콜드 스타트할 때만 처음부터 끝까지 실행하고, 재사용할 때는 진입점인 핸들러 함수만 실행 → 따라서 필요치 않은 초기화 로직은 핸들러 밖으로 빼서 중복 실행되는 것을 방지.
- 라이브러리와 프레임워크는 꼭 필요한 것만 사용하고, 무거운 것보다는 가벼운 것을 사용 (e.g. Spring -> Dagger, Guice).
- 코드를 간결하게 유지
- 모든 로직을 하나의 함수에 담는 것보다 여러 작은 함수로 쪼개는 것이 좋음. (리소스 데드락 때문).
코드 작성 팁
- 핵심 로직에서 핸들러(진입점) 함수를 분리하면 단위 테스트를 더 많이 생성 가능
- 람다 환경 변수를 활용해 하드 코딩을 제거
- 재귀 함수 호출은 사용하지 않는 것이 추천
2. AWS Lambda
- AWS Lambda 외에 주목할 만한 서비스
- Knative: 쿠버네티스(Kubernetes) 기반의 서버리스 플랫폼
- Nuclio: 직접 FaaS 를 제공할 수 있는 오픈 소스 서버리스 프레임워크
3. Serverless Application
- 클라이언트에서 사용자 인터랙션 로직을 대부분 처리
- 자주 사용하는 서버 기능은 서버리스형 서비스로 처리
- 각종 연계를 위해 사용하는 작은 함수(FaaS)
Web Application
- 사용자에게 보여줄 웹 페이지 및 정적 콘텐츠는 S3 에 저장 후 호스팅
- 사용자 요청은 API Gateway 로 받기
- 처리할 내용은 Lambda 에 작성
- 데이터 저장은 DB 서비스(DynamoDB) 사용
- 사용자 인증은 Amazon Cognito 사용
- Route 53으로 도메인 구입 및 제공
Mobile Backend
모바일 백엔드 아키텍처는 웹 애플리케이션과 비슷하지만 몇 가지 추가된 서비스가 존재.
- DynamoDB 에 저장하는 데이터는 람다를 이용해 검색엔진 서비스인 CloudSearch 에 저장
- SNS(Simple Notification Service)를 이용해 사용자에게 푸시 전송.
Real-time Stream Processing
- Kinesis 로 실시간 스트리밍 데이터를 수집
- 람다에서 들어오는 데이터를 처리하고 저장
- 이벤트 자체를 장기간 보존하기 위해 S3 에 저장
- 수집한 데이터는 CloudWatch 를 이용해 모니터링 가능.
4. 내 트리를 꾸며줘
- Azure Functions로 만든 서버리스 앱 서비스
- 1600만의 트래픽을 지탱했던 아키텍처
- Azure App Service는 무엇인가?
- Azure Functions vs AWS Lambda
참고문헌
https://futurecreator.github.io/2019/03/14/serverless-architecture/
https://aws.amazon.com/ko/lambda/serverless-architectures-learn-more/
https://blog.symphonia.io/posts/2018-05-22_revisiting-serverless-architectures
https://dabit3.medium.com/full-stack-development-in-the-era-of-serverless-computing-c1e49bba8580
https://www.youtube.com/watch?v=c6LlMe6xBjQ
https://www.inflearn.com/pages/weekly-inflearn-45-20220330
https://www.g2.com/compare/aws-lambda-vs-azure-app-service
https://iamondemand.com/blog/aws-lambda-vs-azure-functions-ten-major-differences/