서비스형 함수란, 고객들이 앱 개발 및 런칭에 관련한 하부 구조의 복잡한 빌드, 유지보수 없이 애플리케이션 기능을 개발, 실행, 관리할 수 있도록 플랫폼을 제공하는 클라우드 컴퓨팅 서비스의 한 분류이다. 이 모델을 따라 애플리케이션을 빌드하는 일은 서버리스 구조를 수행하는 한 방법이며 마이크로서비스 애플리케이션을 빌드할 때 일반적으로 사용된다.
FaaS는 PiCloud 등 2010년 경 다양한 스타트업 기업들에 의해 처음 제공되었다.
AWS Lambda
AWS 람다는 대형 퍼블릭 클라우드 벤더가 제공하는 최초의 FaaS 기능이었으며 이에 이어 네이버클라우드플랫폼의 Cloud Functions, 구글 클라우드 펑션, 마이크로소프트 애저 펑션, IBM/아파치의 오픈휘스크 (오픈 소스, 2016년), 오라클 클라우드 Fn (오픈 소스, 2017년)가 잇따랐다.
Google Cloud Functions
Microsoft Azure Functions(오픈소스)
OpenFaaS(오픈소스)
구분 | BaaS | FaaS |
---|---|---|
정의 | 앱 개발에 필요한 기능을 API로 처리 | 대형 인프라에 원하는 기능을 등록하고 사용 |
특징 | 구현하기 복잡한 기능을 미리 개발된 API로 사용 | 분산 컴퓨팅 자원을 고유 서버 처럼 활용 |
장점 | 시스템 복잡도 감소 | 유연한 서버 자원 이용 |
사례 | Firebase, Sendbirds 등 | AWS Lambda, Google Cloud Functions 등 |
Lambda는 AWS가 제공하는 서버리스 FaaS 솔루션으로, 함수의 인스턴스를 실행하여 이벤트를 처리합니다.
24시간 내내 돌아가고 있는 상태가 아니고, 요청이 올때 AWS가 Lambda를 깨우는데 시간을 사용하기 때문에 응답의 속도에 차이가 있습니다다.
요청이 적을 때는 의미가 없지만 요청이 많을 때는 이 차이가 응답 속도에 영향을 줍니다.
이러한 점 때문에, 어떤 함수가 자주 쓰이는지 파악을 해서 해당 함수는 잠들지 않고 대기하는 기능을 추가하기도 했습니다.
차이는 미세하지만 서버가 응답하는 시간이 다소 걸릴 수 있다는 것이 단점으로 지적됩니다.
또한, 지나치게 AWS에 의존하게 됩니다.
백엔드를 AWS Lambda에 배포했을 때 다른 곳으로 옮기고 싶을 때, 한 서버리스에서 다른 쪽 서버리스로 마이그레이션 하는 것이 쉽지 않습니다.
EC2와 같은 서버를 사용할 경우, EC2 내에서 실행되는 WAS 프로그램을 다른 클라우드 사업자의 컴퓨팅 리소스로 옮겨 실행하기만 하면 되지만, 서버리스는 클라우드 사업자의 요구사항에 맞는 코드가 작성되어야만 합니다.
AWS Lambda에서 실행하는 코드는 'Lambda 함수'로 업로드 됩니다. 각 함수에는 이름과 설명, 진입점, 리소스 요구 사항 등 연관된 구성 정보가 포함되어 있습니다. 코드는 Stateless 스타일로 작성되어야 합니다. 즉, 기본 컴퓨팅 인프라에 대한 선호도가 없다고 가정해야 합니다. 로컬 파일 시스템 액세스, 하위 프로세스 및 유사한 아티팩트는 요청 수명 기간 이상 확장될 수 없으며, 모든 지속 상태는 Amazon S3, Amazon DynamoDB, Amazon EFS 또는 다른 인터넷 사용 스토리지 서비스에 저장되어야 합니다.
Q. Lambda 함수가 Stateless여야 하는 이유가 무엇인가요?
A. 함수를 상태 비저장으로 유지하면 AWS Lambda에서 필요한 만큼 함수 사본을 빠르게 시작하여 수신 이벤트 비율에 따라 조정할 수 있습니다. 비록 AWS Lambda의 프로그래밍 모델은 상태 비저장이지만, 코드를 통해 Amazon S3 또는 Amazon DynamoDB 등 다른 웹 서비스를 호출하면 상태 저장 데이터에 액세스할 수 있습니다.
Node.js 또는 Python을 사용하는 경우 AWS Lambda 콘솔의 코드 편집기를 사용하여 함수 코드를 작성하고 테스트할 수 있습니다. 이렇게 함수를 작성하고 테스트하여 IDE와 유사한 환경에서 함수 실행 결과를 볼 수 있습니다.
Lambda 함수의 핸들러(handler)는 이벤트를 처리하는 함수입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다.
이 때 전달되는 3개의 인수(parameter)는 다음과 같습니다.
event
첫 번째 인수는 호출자로부터의 정보가 포함된 event 객체. 이 정보는 함수를 호출할 때 호출자가 JSON 형식 문자열로 전달하고, 런타임은 이 정보를 객체로 변환한다. AWS 서비스가 함수를 호출할 때, 이벤트 구조는 서비스별로 다르다.
context
두 번째 인수는 컨텍스트 객체이며, 호출, 함수 및 실행 환경에 대한 정보가 포함되어 있음.
callback
세 번째 인수는 callback이며 비동기 응답을 전송하기 위해 필요하며, 위 코드와 같이 async 키워드를 이용해 promise 객체를 대신하서 사용할 수 있음.
응답 객체는 상태코드와 함께 응답을 JSON 문자열 형태로 반환해야 합니다.
트리거는 Lambda 함수를 호출하는 리소스 또는 구성입니다. 트리거에는 이벤트 소스를 제공하는 AWS 서비스가 포함될 수 있습니다.
Lambda와 함께 사용하는 서비스에 따라 호출은 일반적으로 두 가지 방법 중 하나로 작동합니다. 이벤트가 호출을 유도하거나, Lambda가 대기열 또는 데이터 스트림을 폴링하고 대기열 또는 데이터 스트림의 활동에 대한 응답으로 함수를 호출합니다.
AWS Lambda는 다른 AWS 서비스와 통합하여 Lambda 함수를 모니터링하고 문제를 해결하는 데 도움을 줍니다. Lambda는 운영자를 대신해 자동으로 Lambda 함수를 모니터링하고 Amazon CloudWatch를 통해 측정치를 보고합니다. 실행 시 코드를 모니터링할 수 있도록, Lambda에서는 요청 수, 요청당 호출 기간 및 오류를 유발하는 요청 수를 자동으로 추적할 수 있습니다.
AWS Lambda에 대한 Amazon CloudWatch logs를 보는 방법
코드에 console.log와 같은 구문을 삽입하여 코드가 예상대로 작동하는지 확인할 수 있습니다. Lambda는 CloudWatch Logs와 자동으로 통합되며 코드의 모든 로그를 /aws/lambda/<함수 이름>라는 이름으로 Lambda 함수와 연결된 CloudWatch Logs 그룹에 푸시합니다.