DevOps BootCamp/마이크로서비스

AWS Lambda

cloudmaster 2023. 5. 9. 20:46
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)는 다음과 같음

  1. event: 첫 번째 인수는 호출자로부터의 정보가 포함된 event 객체. 이 정보는 함수를 호출할 때 호출자가 JSON 형식 문자열로 전달하고, 런타임은 이 정보를 객체로 변환한다. AWS 서비스가 함수를 호출할 때, 이벤트 구조는 서비스별로 다르다.
  2. context: 두 번째 인수는 컨텍스트 객체이며, 호출, 함수 및 실행 환경에 대한 정보가 포함되어 있음.
  3. (세 번째 인수는 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