Lambda란 ?
- 컨테이너 기반 서버리스 Faas 컴퓨팅 서비스
- 서버리스 : 개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드/실행할 수 있도록 하는 클라우드 모델
- BaaS (Backend as a Service)
- 애플리케이션에 필요한 다양한 기능들을 API로 제공해 줌으로서 서버 개발을 하지 않고도 기능을 사용할 수 있다
- ex) firebase
- Faas (Function as a Service)
- 프로젝트를 함수 단위로 만들어서 컴퓨팅 자원에 함수를 등록하고 실행되는 횟수만큼 비용 지불
- 확장성에 대해 고민할 필요 없다. 호출된 횟수만큼 비용 지불하면 된다
- 함수에서 사용할 수 있는 메모리/처리 시간에 제한이 있다
- BaaS (Backend as a Service)
- 서버리스 : 개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드/실행할 수 있도록 하는 클라우드 모델
- 이벤트를 감지해 아마존 리눅스 환경의 Micro VM을 띄우고 함수를 실행해 결과를 처리한다
- 병렬로 실행되며, 각 트리거는 개별적으로 처리되어 높은 정확도, 속도 가짐
- Lamda Edge를 통한 사용자와 가까운 location의 서버에서 실행
- 실행시 컨테이너 기반으로 프로세스가 올라간다.
- 각 요청은 하나의 Lamda 함수를 지닌 단일 인스턴스에서 제공한다
- 동시성 : 컨테이너가 동시에 몇 개 실행되는지
- 동시성 제어 방법
- 예약된 동시성 (Reserved Concurrency)
- 함수에 대한 최대 동시 인스턴스 보장
- 한 함수가 동시성을 예약하면 다른 함수는 해당 동시성 사용 불가
- 프로비저닝된 동시성 (Provisioned Concurrency)
- 함수의 호출에 즉시 응답할 준비가 되도록 요청된 수의 실행 환경을 초기화
- 예약된 동시성 (Reserved Concurrency)
- 동시성 제어 방법
- 서울 리전은 Burst quota가 500개다
- Burst quota : 처음 Lambda를 트리거했을 때 동시에 실행할 수 있는 컨테이너의 갯수 제한. 최초 버스터 이후 매분 500개의 추가 인스턴스까지 확장될 수 있다
- AWS 서비스와 Saas 애플리케이션에서 Lambda를 트리거 할 수 있다
- 기본적으로 Java, Go, PowerShell, Node.js, C#, Python 및 Ruby 코드를 지원하며, 그 밖에 프로그래밍 언어를 사용해 함수를 작성할 수 있도록 Runtime API도 제공
- 컨테이너 이미지로 함수를 패키징하고 배포할 수 있다
- Amazon RDS 프록시를 사용해 RDB에 대한 수천 개의 동시 연결을 효율적으로 관리하므로 RDB와 상호 작용하는 확장성이 높고 안전하다
- AWS Step Functions 워크플로를 구축하면 복잡하고 장기간 실행되는 테스크를 다수의 Lambda 함수로 구축할 수 있다
- Runtime을 사용하여 각각 다른 언어로 작성한 코드를 동일한 실행환경에서 실행할 수 있다. Runtime은 AWS Lambda 서비스와 함수 코드 사이에 위치해 이벤트와 컨텍스트 정보 등 응답을 중계해주는 역할을 한다
- Full cold start : Lambda가 실행되면서 코드를 다운로드 하고 실행환경을 구성
- Partial cold start : 런타임을 준비하는 과정
- Warm start : 함수가 실행될 때
- 서비스를 호출하는 방법은 Synchronous와 Asynchronous가 있다. Synchronous는 클라이언트가 람다 함수에 이벤트를 보내고 클라이언트는 함수의 응답을 받을 수 있다. 이때 파라미터 값을 invoke로 실행한다. 비동기식은 클라이언트의 요청 이벤트와 람다 함수 사이에 대기열을 이용하는 것이다. 이때 클라이언트는 성공 응답만 받고 호출 유형 파라미터 값을 Event로 설정해야 한다.
- 비동기식으로 진행할 때 오류가 발생하면 이벤트를 대기열로 다시 보내고 재시도를 한다. 이벤트는 대기열에서 삭제될 수 있다. 그렇기 때문에 동시성을 어떻게 조절하느냐에 따라 이벤트를 보장할 수 있다
- 메모리만 설정하고 다른 리소스(CPU성능, 네트워크 대역폭..)는 설정한 메모리 값에 따라 자동적으로 할당된다. 할당되는 리소스 정보는 제공해주지 않는다
- 환경 변수를 설정해 코드에서 사용할 수 있다
- 함수를 게시할 때마다 새 버전으로 생성되어 히스토리로 남길 수 있다
- JSON 형식의 테스트 데이터를 이용해 함수를 테스트할 수 있다
- 함수들이 공통적으로 사용하는 모듈 단위가 있다면 패키징 해서 Layer로 재사용할 수 있다
- AWS EFS(Elastic File System)을 사용해 무거운 패키지를 사용할 수 있다
내부 구조
- 람다가 실행되면 아마존 리눅스 OS 기반의 Micro VM이 실행된다. 환경 변수 등 실행 환경을 맞추고, 지정한 언어별 런타임 환경을 준비한다. 그리고 작성한 함수를 실행한다
- Compute substrte : 함수가 실행될 Micro VM
- Excecution Environment : 환경 변수 등의 실행환경
- Language runtime : 언어별 런타임
- Function : 함수
장점
- 빠른 개발, 배포
- 자동으로 Auto-Scaling이 되서 운영 관리 부담 줄어듦
- 필요할 때만 함수를 호출하므로 비용 절감
단점
- 함수가 호출되면 새로운 컨테이너를 띄우는 방식이기 때문에 별도의 상태 저장을 하지 않는다.
- DB connection 유지 같은 기능은 수행하지 못한다
- 리전별로 동시 실행 함수 개수를 1000으로 제한한다. 부하테스트는 실행 테스트를 높여 Dos 공격을 만들 수 있다
- 하나의 함수가 한 번 호출될 때 메모리는 최대 10GB, 처리시간은 최대 15분까지 가능하다
- cold start
- 람다는 컨테이너를 생성해서 함수를 실행하는데까지 걸리는 시간
- 람다 함수를 호출하면 요청은 람다를 실제로 수행하는 실행환경(execution environment)로 전달된다.
- 이 함수가 특정 시간 동안 사용된 적 없거나 함수가 업데이트되었다면 AWS는 내부적으로 새로운 실행환경을 만들고 람다 함수를 install 한다
- 해결방안: 람다를 주기적으로 호출, 람다 메모리 스펙 높이기, 프로비저닝(사용자의 요구에 맞는 시스템을 제공할 수 있도록 만들어 놓는 것)된 동시성 활성화 https://aws.amazon.com/ko/blogs/korea/new-provisioned-concurrency-for-lambda-functions/
- 로그 보기가 불편 (CloudWatch를 통해 볼 수 있지만 불편)
- 서비스 제공사에 의존적
추천 사례
- 단기간 이벤트성 트래픽을 감당하는 경우
- 필요할 때 동적으로 자원 할당받아 사용하기 때문에 급격한 트래픽 변화에 유연
- 반복적인 배치 처리 형태의 기능 개발
- 라이브 스트리밍에 대한 로그 분석, 음성이나 텍스트를 기반으로 학습된 데이터를 제공하는 인공지능 기능
- 관리보다 개발에 집중할 경우
- 파일 업로드 기능 / 썸네일 생성 기능
- 크롤링, 배치, 스케줄러
'AWS' 카테고리의 다른 글
AWS 주요 서비스 정리 (1) (0) | 2022.01.21 |
---|