이 글은 AWS Lambda로 시작하는 서버리스를 참고하여 작성하였습니다.
작성자 : 강다인
1. AWS Lambda란?
AWS Lambda는 Amazon Web Service에서 2014년부터 제공하는 FaaS 서비스이다.
2. AWS Lambda의 동작
AWS Lambda는 이벤트를 감지하여 아마존 리눅스 환경의 Micro VM(Virtual Machine)을 띄우고 환경변수 등의 실행환경을 맞춘 뒤, 지정한 언어별 런타임 환경을 준비한다. 그리고 미리 정의된 함수(로직)을 실행하고 결과를 처리하는 방식으로 동작한다.
함수 실행 시에 필요한 환경을 런타임(Runtime)이라고 하는데, 언어와 환경에 따라 다르고 성능 차이가 존재한다.
AWS Lambde는 바깥 계층부터 Compute substrate(Micro VM) - Execution Environment(환경변수 등 실행환경) - Language Runtime(언어별 런타임) - Function(함수)로 구성되어 있다.
3. AWS Lambda의 Cold Start와 Warm Start
1장에서 언급한 것과 같이 AWS Lambda는 FaaS에서 맨 처음 함수를 실행할 때 함수를 실행하기까지의 지연시간이 존재한다.
AWS Lambda가 처음 실행되면 먼저 코드를 다운로드하고, 실행 환경을 구성한다. 이 구간을 Cold Start 중에서도 Full Cold Start라고 한다. Initialize와 코드 시작, 그러니까 런타임을 준비하는 과정은 Partial cold start라고 부른다. 마지막으로 함수가 실행될 때를 Warm Start라고 한다.
함수가 실행될 때 순서가 정해져있기 때문에 이에 따라 딜레이가 발생하는 것은 당연하다. Micro VM이 내려갔다가 다시 올라가면 Full cold start부터 다시 시작하고, Micro VM이 대기하는 동안에 재요청하면 Partial cold start가 진행되어 지연시간이 조금 줄어든다.
cold start를 줄이기 위해서는 지속적인 호출을 통해 구동되어 있는 Micro VM을 유지하게 하는 방법이 있다. 보통 5분마다 호출하라고 권고하고 있다.
cold start time은 언어/런타임, 리소스 크기(양) 및 함수 실행 시에 필요한 패키지/종속성에 따라 다르다.
AWS는 Cold Start time을 줄이기 위해 노력하고 있다. 2018과 2019 도표를 확인하면 확실히 알 수 있다.
2019년 re:Invent에서 Provisioned Concurrency(프로비저닝의 동시성) on AWS Lambda를 선보였는데, 함수를 지속적으로 초기화하고 빠르게 준비하여 Cold Start를 줄인다. 이 기능은 유료로 제공되고 있다.
4. AWS Lambda의 런타임
런타임을 활용하여 각각 다른 언어로 작성한 코드도 동일한 기본 실행환경에서 실행할 수 있다. 런타임은 lambda 서비스와 코드 사이에 위치해서 응답을 중계해주는 역할을 한다. 기본 제공 런타임 환경이 있고, 필요한 런타임 환경을 만들어 사용할 수 있다.
런타임 환경은 아마준 리눅스(Amazon Linux)이다. 제공되는 런타임 환경에서 언어의 버전 별 / 운영체제의 수명이 60일 아래로 떨어지면 마이그레이션 안내 메일을 보내주고, 지원이 중단되면 호출을 비활성화한다.
5. AWS Lambda의 Event
서비스를 호출하는 방법은 동기식(Synchronous)와 비동기식(Asynchronous)가 있다.
동기식은 클라이언트가 람다 함수에 이벤트를 보내고, 클라이언트는 함수의 응답을 받는다. 파라미터는 invoke로 실행한다.
비동기식은 클라이언트 요청 이벤트와 람다 함수 사이에 대기열을 이용하고, 클라이언트는 성공 응답만 받는다. 이 때는 호출 유형을 Event로 설정해야하고, 오류가 발생하면 계속 재시도를 하게 된다.
동시성 설정이 작거나 서버 오류가 발생하는 경우(에러코드 492와 50x), 이벤트를 대기열로 보내고 최대 6시간, 빈도는 최대 5분까지 증가하며 재시도 한다.
이벤트는 대기열에서 삭제될 수도 있다. 그렇기 때문에 동시성의 적절한 조정이 이벤트를 보장할 수 있는 중요한 요소가 된다.
또한 대기열은 백업되기도 하는데, 이 경우 람다 함수로 전송 전에 이벤트가 만료되어 삭제될 수도 있다.
⇒ 왜??????????????? 백업하는지??????????????? 에 대해서는 아직 의문을 해결하지 못했다...
이와 같은 상황을 제어하기 위해서는 오류 처리를 구성하고, 재시도 횟수를 줄이면서 처리되지 않은 이벤트를 점검해야한다. 다른 서비스(Amazon SQS, Amazon SNS)를 함께 사용하여 안전한 메세지 서비스를 만드는 것이다.
동시성(concurrency)는 동시에 처리 가능한 함수의 수이다. 동시성 설정은 병목 현상이 일어날 수 있는 경우를 예측하여 최대 인스턴스 수를 설정함으로써 안전한 서비스를 유지할 수 있다는 점에서 중요하다.
6. 메모리 할당과 실행 제한 시간
AWS Lambda는 메모리와 실행 제한시간을 커스텀한다. 메모리는 128MB에서 3008MB까지, 실행 제한 시간은 최대 900ms(15분)이다. 128MB짜리 메모리로 설정하고 동시성을 3개로 둔 뒤 3번 동시 호출하면 세 개의 task가 각각 128MB의 메모리를 가지고 인스턴스가 생성되어 동작한다.
람다는 메모리만 설정하고, CPU 성능이나 네트워크 대역폭, 디스크 I/O는 ㅓㄹ정한 메모리 값에 따라서 자동적으로 할당된다.
re:Invert 2018의 자료에 따르면 메모리를 할당할 수록 더 빠른 속도를 보이고, 단위 당 비용은 128MB를 제외하고는 메모리가 클 수록 작다. 사실 거의 금액 차이는 없는 것으로 보인다. 128MB와 1024MB의 단위 당 금액 차이는 고작 $0.0001이다.
요청 수와 실행 시간을 기준으로 요금이 청구된다. ‘최소 금액을 통해 최대 효과를 본다’는 목적을 잊지 말고 메모리와 실행시간을 적절히 조정하는 것이 중요하다.
'GDSC HUFS 3기 > Cloud Computing' 카테고리의 다른 글
[AWS] Amazon API Gateway/REST API/HTTP API/WebSocket API (0) | 2022.06.02 |
---|---|
[AWS] Amazon SQS/메시징 서비스/Amazon SNS (0) | 2022.06.02 |
[AWS] AWS 네트워크 (0) | 2022.05.12 |
[AWS] AWS Lambda/cold start/warm start/lambda 런타임/lambda event/메모리 할당/실행 제한 시간 (0) | 2022.05.12 |
[AWS] 서버리스란 무엇인가 (0) | 2022.05.12 |