
What is lambda
Lambda는 서버를 프로비저닝provisioning(할당, 배치, 배포)하거나 관리하지 않고도 코드를 실행할 수 있는 컴퓨팅 서비스이다.
이 포스팅에서는 공식 문서를 통해 알 수 있는 람다의 basic 한 기능들에 대해 정리할 예정이다.
람다에서 많이 사용되는 개념에 대한 정의
함수function
람다를 시작하려면 함수를 생성해야 한다. 함수는 람다에서 코드를 실행하기 위해 호출할 수 있는 리소스이다. 람다에서 함수를 중지하기 전에 실행을 허용하는 시간의 기본 값은 3초이고 허용되는 최댓값은 900초(=15분) 이다.
함수를 생성하거나 업데이트하면 람다는 함수를 실행할 수 있도록 컴퓨팅 및 네트워킹 리소스를 프로비저닝 한다. 대부분의 경우 이 프로세스는 매우 빠르게 진행되며, 함수는 즉시 호출하거나 수정될 수 있도록 준비된다. 함수를 생성하게 되면 처음에는 pending 상태에 있다. pending 상태인 동안에는 함수가 작동하는 호출 및 기타 api 작업에서 오류가 반환된다. 함수가 호출할 수 있도록 준비되면 상태는 pending 에서 active 로 변경된다. 함수의 구성을 업데이트하면 리소스를 프로비저닝하는 비동기 작업을 트리거 할 수 있다. 이 작업이 진행 되면 함수의 상태는 active 이지만, LastUpdateStatus 는 inprogress 이다. 함수를 호출할 수 있지만 함수에 대한 다른 작업은 실패한다. 업데이트가 진행 중인 동안 발생하는 호출은 이전 구성에 따라 실행된다.
트리거trigger
트리거는 람다 함수를 호출하는 리소스이다. 여기에는 함수를 호출하도록 구성할 수 있는 aws 서비스, 개발하는 애플리케이션 및 이벤트 소스 매핑이 포함된다. 보통 람다에서 트리거된다, 라고 하면 호출한다고 받아들이면 편하다.
이벤트event
이벤트는 람다 함수가 처리할 데이터가 포함된 json 형식 문서이다. 런타임은 이벤트를 객체로 변환한 후 함수 코드에 전달한다.
실행환경

람다는 안전하고 격리된 런타임 환경을 제공하는 실행 환경에서 함수를 호출하고 함수를 실행하는 데 필요한 프로세스와 리소스를 관리한다. 코드 외부에서 함수의 구성을 확장하기 위해 환경변수를 사용한다. 또한 실행환경은 함수의 런타임 및 함수와 관련된 모든 외부 익스텐션에 대한 수명 주기 지원을 제공한다.
실행환경의 수명 주기
- init : 초기화 단계
이 단계에서는 람다가 구성된 리소스로 실행 환경을 생성하거나 고정 해제하고, 함수 및 모든 계층에 대한 코드를 다운로드하고, 확장 및 런타임을 초기화한 다음 함수의 초기화 코드(핸들러에 속하지 않는 코드)를 실행한다. init 은 첫 번째 호출 중에 발생하거나 프로비저닝 된 동시성을 활성화 한 경우 함수 호출 전에 발생한다. init 단계는 extension init, runtime init, function init 의 세 단계로 나뉜다. 이 세 단계들은 함수 코드가 실행되기 전에 모든 확장 및 런타임이 설정 작업을 완료하도록 한다. init 단계는 10초로 제한되므로, 세 작업이 모두 10초 이내에 완료되지 않으면 람다는 첫 번째 함수 호출 시 init 단계를 다시 시도한다. - invoke : 호출 단계
이 단계에서는 람다가 함수 핸들러를 호출한다. 함수가 호출되면 람다는 런타임과 각 익스텐션에 invoke 이벤트를 전송하고 함수 실행이 완료되면 람다는 다른 함수 호출을 처리할 준비를 한다. - shutdown : 종료 단계
람다 함수가 일정 기간동안 호출을 받지 못하면 이 단계가 트리거된다. 셧다운 단계에서 람다는 런타임을 종료하고 익스텐션이 완전히 중지되로록 알린 다음 환경을 제거한다. 람다는 각 익스텐션에 셧다운 이벤트를 전송하여 확장에 환경이 종료될 예정임을 알려준다. 셧다운 단계는 2초로 제한되며 런타임 또는 익스텐션이 응답하지 않는 경우 람다는 신호(sigkill) 를 통해 이를 종료한다. 함수와 모든 익스텐션이 완료된 후 람다는 다른 함수 호출을 예상하여 일정 시간 동안 실행 환경을 유지한다. 함수가 다시 호출되면 람다는 재사용을 위해 환경을 thaws해동 시킨다.
환경변수
환경변수를 사용하면 코드를 업데이트 하지 않고도 함수의 동작을 조정할 수 있다. 환경변수는 키-값 페어로 구성되어 있으며 함수 호출 전에 평가되지 않는다. 정의한 모든 값은 리터럴 문자열로 간주되며 확장되지 않는다.
런타임
런타임은 실행환경에서 실행되는 언어별 환경을 제공한다. node.js, python 등 여러 버전의 런타임을 사용하거나 나만의 런타임을 빌드할 수 있다. 람다 런타임은 유지 관리 및 보안 업데이트가 적용되는 운영 체제, 프로그래밍 언어 및 소프트웨어 라이브러리의 조합을 기반으로 구축된다. 수명이 끝난 런타임 환경을 가지고 있는 인스턴스는 실행이 되지 않는다.
계층layer
계층은 추가 코드 또는 기타 콘텐츠를 포함하는 .zip 파일 아카이브이다. 라이브러리, 사용자 정의 런타임 등이 포함된다 함수당 최대 5개의 계층을 포함할 수 있다. 레이어는 코드 공유 및 책임의 분리를 촉진시켜 비즈니스 로직 작성을 더 빠르게 할 수 있도록 도와준다.
익스텐션extension
람다 익스텐션 기능을 사용하여 함수를 보강하고 모니터링, observability(관측가능성), 보안 등을 위해 자주 사용하는 도구와 보다 쉽게 통합할 수 있다. 내부 익스텐션은 런타임 프로세스에서 실행되며 런타임과 동일한 수명 주기를 공유 한다. 외부 익스텐션은 별도의 프로세스로 실행된다.
동시성concurrency
특정 시각에 함수가 제공하는 요청의 수를 의미한다.
람다의 기능
프로그래밍 모델
런타임은 프로그램이 실행되고 있는 동안의 동작을 의미한다.
모든 런타임은 코드와 런타임 코드 사이의 인터페이스를 정의하는 일반적인 프로그래밍 모델을 공유한다. 핸들러handler는 함수가 호출될 때 런타임이 실행하는 method 이다. 함수 구성에서 핸들러를 정의함으로써 런타임에게 어떤 method 를 실행할 지 알려주면, 런타임은 해당 method 를 실행한다.
핸들러가 첫 번째 이벤트 처리를 완료하면 런타임이 다른 이벤트를 보낸다. 함수의 클래스가 메모리에 유지되므로 초기화 코드에서 핸들러 메소드 외부에서 선언된 클라이언트 및 변수를 재사용할 수 있다. 초기화 된 후에는 함수의 각 인스턴스가 수천개의 요청을 처리할 수 있다.
런타임은 함수에서 출력되는 로그를 캡처해서 cloud watch logs 로 전송한다. 런타임은 함수의 출력뿐만 아니라 호출이 시작되고 끝날때의 항목 또한 로깅한다. 여기에는 request id, 요금이 청구되는 소요 시간, 초기화 소요 시간 및 기타 세부 정보가 들어 있는 보고서 로그가 포함된다. 오류가 발생하는 경우 해당 오류를 호출자에게 반환한다.
scailing
람다는 코드를 실행하는 인프라를 관리하고 수신 요청에 대한 응답으로 자동 확장된다. 함수 인스턴스 하나의 이벤트 처리 속도보다 빠르게 함수를 호출하는 경우 람다는 추가 인스턴스를 실행하여 자체적으로 규모를 확장한다.
위에서 적었듯이, 함수를 최초로 호출하면 람다는 함수의 인스턴스를 생성하고 핸들러 메소드를 실행하여 이벤트를 처리한다. 함수가 응답을 반환하면 활성 상태를 유지하고, 추가 이벤트를 처리하기 위해 대기한다. 첫 번째 이벤트가 처리되는 동안 함수를 다시 호출하면 람다는 다른 인스턴스를 초기화하고 함수는 두 이벤트를 동시에 처리한다. 이벤트가 추가로 수신되면 람다는 이 이벤트를 사용 가능한 인스턴스로 라우팅하고, 필요 시 새 인스턴스를 생성한다. 이렇게 특정 시각에 요청을 처리하는 인스턴스의 수를 함수의 동시성이라고 한다.

람다 공식 문서에 따르면 최초의 버스트 이후 함수의 동시성은 매분 500개의 추가 인스턴스까지 확장될 수 있다. 버스트 동시성 한도burst limit에 도달하면 함수는 선형으로 확장되기 시작한다. 함수가 확장하는 속도보다 더 빠르게 요청이 수신되거나 최대 동시성concurrency limit에 도달한 경우 추가 요청들은 런타임 오류(429 status)로 인해 실패한다. 이런 경우 예약된 동시성이나 프로비저닝 된 동시성을 이용하여 함수별로 용량을 할당하거나 지연 시간의 변동을 막을 수 있다.
동시성Concurrency 제어
람다는 동시성 및 크기 조정 제어를 통해 프로덕션 애플리케이션의 크기 조정 및 응답성을 세밀하게 제어하여 높은 가용성과 높은 응답성을 유지하도록 보장한다.
예약된 동시성

예약된 동시성은 너무 많은 동시성을 사용하지 못하게 제한하고 사용 가능한 동시성 중 일부를 함수에 예약한다.
사용 가능한 동시성 풀을 하위 집합으로 분할하고 예약된 동시성이 있는 함수는 전용 풀에서의 동시성만 사용한다. 한 함수가 동시성을 예약하면 다른 함수는 해당 동시성을 사용할 수 없다. 또, 함수의 최대 동시성을 제한하며 이는 버전 및 별칭을 포함한 함수 전체에 적용된다. 예약된 동시성은 다른 함수가 함수의 조정을 금지할 수 없도록 하고 함수가 제어 범위 밖으로 확장할 수 없도록 제한하는 효과를 갖는다.
프로비저닝 된 동시성

프로비저닝된 동시성은 지연시간의 변동없이 함수를 확장할 수 있도록 하기 위해 사용한다. 초기화하는데 오랜 시간이 걸리거나 모든 호출에 대해 지연시간이 매우 짧은 함수의 경우 프로비저닝 된 동시성을 사용하면 함수의 인스턴스를 사전에 초기화하고 항상 실행 상태를 유지할 수 있기 때문이다. 람다는 오토 스케일링과 통합되어 사용률을 기반으로 프로비저닝된 동시성에 대한 오토스케일링을 지원한다. 함수의 각 버전에는 프로비저닝된 동시성 구성이 하나만 있을 수 있으며 동일한 버전이나 게시되지 않은 버전($LATEST) 에 대해 프로비저닝 된 동시성을 할당할 수 없다.
비동기식호출
함수를 호출할 때 동기식으로 호출할 것인지 비동기식으로 호출할 것인지 선택할 수 있다. 함수를 동기식으로 호출하는 경우 람다는 함수를 실행하고 응답을 기다리지만, 비동기적으로 함수를 호출하면 함수 코드는 응답을 기다리지 않고 이벤트를 람다에 전달하고 람다가 나머지를 처리한다. 처리되지 않은 이벤트를 폐기하기 전에 해당 이벤트가 대기열에 있는 시간 또는 람다에서 시도하는 재시도 횟수를 줄이도록 오류 처리 동작을 구성한다. 폐기된 이벤트를 유지하도록 dead-letter queue 를 구성한다.
이벤트 소스 매핑
이벤트 소스 매핑은 람다 함수를 호출하는 이벤트 소스를 읽어오는 람다 리소스이다. 스트림 또는 대기열에서 항목을 처리하려면 이벤트 소스 매핑을 생성하면 된다. 이벤트 소스 매핑은 S3 대기열, kinesis 스트림 , dynamoDB 스트림 등에서 항목을 읽어 배치로 함수에 전송한다. 함수가 처리하는 각 이벤트에는 수 백 또는 수 천개의 항목이 포함될 수 있다. 람다는 선입선출FIFO 대기열에 대한 순차적 처리를 지원하므로 표준 대기역의 항목이 반드시 순서대로 처리되지는 않지만, 가능한 한 표준 대기열대로 처리하도록 한다.
대상destination
대상은 함수에 대한 호출 레코드를 수신하는 aws 리소스이다. 성공적인 호출과 처리에 실패한 이벤트에 대해 별도의 대상을 구성할 수 있다.
코드 서명code signing
code signing 을 활성화하면 람다는 모든 코드 배포를 검사하고 코드 패키지가 신뢰할 수 있는 소스에 의해 서명 되었는지를 확인한다. 컨테이너 이미지로 정의된 함수에는 지원하지 않는다. 코드 무결성을 확인하기 위해 aws signer 를 사용하여 함수 및 레이어에 대해 디지털 방식으로 서명된 코드 패키지를 생성하고, 패키지를 배포하려고 할 경우 패키지에 대한 유효성 검사를 수행한 후 배포를 수락한다. 유효성 검사는 배포 시에 실행되므로 함수 실행 시의 성능에는 영향을 주지 않는다.
람다는 서명된 코드 패키지를 함수에 배포할 때 서명에 대한 검증을 수행한다. 검증 확인 중 하나라도 실패하는 경우 경고 혹은 적용 등의 작업을 수행한다. 경고의 경우 코드패키지의 배포는 허용하지만 새로운 cloudwatch 지표를 발생시키고 경고를 로그에 저장한다. 적용enforce시키는 경우는 경고를 발생 시킨 후 배포를 차단한다. 검증 과정은 다음과 같다.
- integrity : 무결성. 코드패키지가 서명된 이후 수정되지 않았는지 패키지의 해시와 서명의 해시를 서로 비교한다.
- expiry : 만료. 코드 패키지의 서명이 만료되지 않았는지 검증한다.
- mismatch : 불일치. 코드 패키지가 람다 함수에 대해 서용되는 서명 프로필 중 하나를 사용하여 서명되었는지 검증한다.
- revocation : 코드 패키지의 서명이 해지 되지 않았는지 비교한다.
AWS x-ray
람다는 aws x-ray 와 통합되어 애플리케이션을 추적, 디버깅 및 최적화 할 수 있다. 빌드 구성에 sdk 라이브러리를 추가하기만 하면 함수가 aws 서비스에 대해 수행하는 모든 호출에 대한 오류 및 지연 시간을 기록할 수 있다.
콘솔에서 함수 세그먼트는 하위 세그먼트를 표시하도록 확장되는데, 함수 세그먼트로는 initialization(초기화 : 함수를 로드하고 초기화 코드를 실행하는데에 소요된 시간을 나타낸다. 함수의 각 인스턴스에 의해 처리된 첫 번째 이벤트에 대해서만 표시된다), invocation(호출 : 핸들러 코드에 의해 수행된 작업을 나타낸다), overhead(오버헤드 : 다음 이벤트 처리를 준비하기 위해 람다 런타임에 의해 수행된 작업을 나타낸다) 이 세 개의 하위 세그먼트가 있다.
모니터링
람다는 사용자를 대신하여 람다 함수를 자동으로 모니터링하고 cloudwatch 를 통해 지표를 보고한다. 실행 시 코드를 모니터링 할 수 있도록 요청 수, 요청당 호출 기간 및 오류를 유발하는 요청의 수 등을 자동으로 추적한다.
기타 기능
- 컨테이너 이미지로 정의된 함수를 이용하여 람다 함수를 빌드, 테스트, 배포할 수 있다.
- blue print 는 샘플 코드를 제공한다.
- RDS 데이터베이스 프록시를 생성하여 데이터 베이스 연결의 소모 없이 쿼리를 릴레이 시켜 높은 동시성 레벨에 도달할 수 있다.
- EFS 파일 시스템을 로컬 디렉토리에 마운트하도록 함수를 구성할 수 있다.
- 람다 함수에 Tag 를 지정하여 소유자, 프로젝트 또는 부서별로 구성할 수 있다. 태그는 리소스를 필터링 하기 위한 키-값의 페어이다.