AWS Lambda란?
AWS가 제공하는 서버리스 FaaS 솔루션
함수의 인스턴스를 실행하여 이벤트를 처리
FaaS
- FaaS는 자체 서버 시스템이나 수명이 긴 서버 애플리케이션을 관리하지 않고 백엔드 코드를 실행하는 것
- FaaS는 런타임(node.js, Java 등)에 대한 사전 준비가 필요하지 않음
- FaaS 기능에는 특히 상태 및 실행 기간과 관련하여 상당한 아키텍처 제한이 있음
- 수평적 확장은 완전 자동이며 탄력적이며 공급자가 관리함
- FaaS의 기능은 일반적으로 공급자가 정의한 이벤트 유형에 의해 트리거 됨
- HTTP 요청에 대한 응답으로 트리거 되도록 만들 수 있음
특징
- 서버를 프로비저닝 하거나 관리할 필요 없이 작성한 코드를 백엔드 서비스로서 배포할 수 있게 해 줍니다.
- Lambda 함수를 실행하려면, 애플리케이션 또는 백엔드 서비스의 코드를 작성한 뒤 이벤트 트리거만 정의하면 됩니다.
- 이벤트 트리거의 대표적인 예: Amazon S3 업로드나 DynamoDB 업데이터, Kinesis 스트리밍, API 게이트웨이 요청
- 이벤트 주도 아키텍처(Event Driven Architecture)를 구성할 수 있습니다.
- 높은 가용성을 제공합니다.
AWS Lambda의 단점
> 24시간 내내 돌아가고 있는 상태가 아니고, 요청이 올 때 AWS가 Lambda를 깨우는데 시간을 사용하기 때문에 응답의 속도에 차이가 있음
> 요청이 적을 때는 의미가 없지만 요청이 많을 때는 이 차이가 응답 속도에 영향을 줌
> 어떤 함수가 자주 쓰이는지 파악을 해서 해당 함수는 잠들지 않고 대기하는 기능을 추가
> 또한, 지나치게 AWS에 의존하게 됨. 백엔드를 AWS Lambda에 배포했을 때 다른 곳으로 옮기고 싶을 때, 한 서버리스에서 다른 쪽 서버리스로 마이그레이션 하는 것이 쉽지 않음.
AWS Lambda 함수
> AWS Lambda에서 실행하는 코드는 'Lambda 함수'로 업로드
> 코드는 Stateless 스타일로 작성
> 즉, 기본 컴퓨팅 인프라에 대한 선호도가 없다고 가정
> 로컬 파일 시스템 액세스, 하위 프로세스 및 유사한 아티팩트는 요청 수명 기간 이상 확장될 수 없으며, 모든 지속 상태는 Amazon S3, Amazon DynamoDB, Amazon EFS 또는 다른 인터넷 사용 스토리지 서비스에 저장되어야 함
- Q. Lambda 함수가 Stateless여야 하는 이유가 무엇인가요?
- A. 함수를 상태 비저장으로 유지하면 AWS Lambda에서 필요한 만큼 함수 사본을 빠르게 시작하여 수신 이벤트 비율에 따라 조정할 수 있습니다. 비록 AWS Lambda의 프로그래밍 모델은 상태 비저장이지만, 코드를 통해 Amazon S3 또는 Amazon DynamoDB 등 다른 웹 서비스를 호출하면 상태 저장 데이터에 액세스 할 수 있습니다.
실행 속도 문제
cold start/warm start
언제 Cold start가 발생하는가?
- 구성이 변경되거나, 코드가 새롭게 배포 되었을때
- 한동안 함수가 호출되지 않을때
어떻게 하면 Warm 상태를 유지하는가?
- cloundWatch EventBridge를 트리거 삼아 주기적 호출
- 로드밸런서의 타겟을 람다로 연결해 health check를 하게 만듦
- Provisioned Concurrency 기능 사용
AWS Lambda 함수 작성
> "새로 작성"을 통해 생성된 함수 코드를 살펴봅시다.
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이며 비동기 응답을 전송하기 위해 필요하며, 위 코드와 같이 async 키워드를 이용해 promise 객체를 대신하서 사용할 수 있음.)
> 응답 객체는 상태코드와 함께 응답을 JSON 문자열 형태로 반환
트리거
> 트리거는 Lambda 함수를 호출하는 리소스 또는 구성
> 트리거에는 이벤트 소스를 제공하는 AWS 서비스가 포함될 수 있음
AWS Lambda 함수 로깅(Node.js)
> AWS Lambda는 다른 AWS 서비스와 통합하여 Lambda 함수를 모니터링하고 문제를 해결하는 데 도움을 줌
> Lambda는 운영자를 대신해 자동으로 Lambda 함수를 모니터링하고 Amazon CloudWatch를 통해 측정치를 보고
> 실행 시 코드를 모니터링할 수 있도록, Lambda에서는 요청 수, 요청당 호출 기간 및 오류를 유발하는 요청 수를 자동으로 추적가능
AWS Lambda에 대한 Amazon CloudWatch logs를 보는 방법
> 코드에 console.log와 같은 구문을 삽입하여 코드가 예상대로 작동하는지 확인할 수 있음
> Lambda는 CloudWatch Logs와 자동으로 통합되며 코드의 모든 로그를 /aws/lambda/<함수 이름>라는 이름으로 Lambda 함수와 연결된 CloudWatch Logs 그룹에 푸시
'DevOps BootCamp > 마이크로서비스' 카테고리의 다른 글
AWS 서버리스 애플리케이션 배포 (0) | 2023.05.09 |
---|---|
API Gateway (1) | 2023.05.09 |
CQRS (0) | 2023.05.08 |
메시지 브로커를 이용한 비동기식 통신 (0) | 2023.05.08 |
동기식 요청/응답 통신 REST (0) | 2023.05.08 |