Lambda는 AWS가 제공하는 서버리스 FaaS 솔루션으로, 함수의 인스턴스를 실행하여 이벤트를 처리합니다.
FaaS란?
- FaaS는 자체 서버 시스템이나 수명이 긴 서버 애플리케이션을 관리하지 않고 백엔드 코드를 실행하는 것
- FaaS는 런타임(node.js, Java 등)에 대한 사전 준비가 필요하지 않음
- FaaS 기능에는 특히 상태 및 실행 기간과 관련하여 상당한 아키텍처 제한이 있음
- 수평적 확장은 완전 자동이며 탄력적이며 공급자가 관리함
- FaaS의 기능은 일반적으로 공급자가 정의한 이벤트 유형에 의해 트리거됨
- HTTP 요청에 대한 응답으로 트리거되도록 만들 수 있음
24시간 내내 돌아가고 있는 상태가 아니고, 요청이 올때 AWS가 Lambda를 깨우는데 시간을 사용하기 때문에 응답의 속도에 차이가 있다. 요청이 적을 때는 의미가 없지만 요청이 많을 때는 이 차이가 응답 속도에 영향을 준다.
클라우드 공급자인 AWS에 의존성이 높아진다.
백엔드를 AWS Lambda에 배포했을 때 다른 플랫폼으로 옮기고 싶을 때, 한 서버리스에서 다른 쪽 서버리스로 마이그레이션 하는 것이 쉽지 않다.
EC2와 같은 서버를 사용할 경우, EC2 내에서 실행되는 WAS 프로그램을 다른 클라우드 사업자의 컴퓨팅 리소스로 옮겨 실행하기만 하면 되지만, 서버리스는 클라우드 사업자의 요구사항에 맞는 코드가 작성되어야 함.
Q. Lambda 함수가 Stateless여야 하는 이유가 무엇인가요?
A. 함수를 상태 비저장으로 유지하면 AWS Lambda에서 필요한 만큼 함수 사본을 빠르게 시작하여 수신 이벤트 비율에 따라 조정할 수 있습니다. 비록 AWS Lambda의 프로그래밍 모델은 상태 비저장이지만, 코드를 통해 Amazon S3 또는 Amazon DynamoDB 등 다른 웹 서비스를 호출하면 상태 저장 데이터에 액세스할 수 있습니다.
Node.js 또는 Python을 사용하는 경우 AWS Lambda 콘솔의 코드 편집기를 사용하여 함수 코드를 작성하고 테스트할 수 있습니다. 이렇게 함수를 작성하고 테스트하여 IDE와 유사한 환경에서 함수 실행 결과를 볼 수 있습니다.
"새로 작성"을 통해 생성된 함수 코드를 살펴봅시다.
exports.handler = async (event, context) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
Lambda 함수의 핸들러(handler)는 이벤트를 처리하는 함수입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다.
이 때 전달되는 3개의 인수(parameter)는 다음과 같습니다.
event
:event
객체. 이 정보는 함수를 호출할 때 호출자가 JSON 형식 문자열로 전달하고, 런타임은 이 정보를 객체로 변환한다. AWS 서비스가 함수를 호출할 때, 이벤트 구조는 서비스별로 다르다.context
:callback
:callback
이다. 비동기 응답을 전송하기 위해 필요하며, 위 코드와 같이 async 키워드를 이용해 promise 객체를 대신하서 사용할 수 있다.응답 객체는 상태코드와 함께 응답을 JSON 문자열 형태로 반환해야 한다.
트리거는 Lambda 함수를 호출하는 리소스 또는 구성입니다. 트리거에는 이벤트 소스를 제공하는 AWS 서비스가 포함될 수 있다.
Lambda와 함께 사용하는 서비스에 따라 호출은 일반적으로 두 가지 방법 중 하나로 작동한다.
1. 이벤트가 호출을 유도하거나,
2. Lambda가 대기열 또는 데이터 스트림을 폴링하고 대기열 또는 데이터 스트림의 활동에 대한 응답으로 함수를 호출한다.
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/welcome.html
https://shouldroforion.medium.com/battle-of-the-serverless-part-2-aws-lambda-cold-start-times-1d770ef3a7dc