Skip to content

실행 환경


Lambda는 안전하고 격리된 런타임 환경을 제공하는 실행 환경에서 함수를 호출한다. 실행 환경은 함수를 실행하는 데 필요한 리소스를 관리한다. 또한 실행 환경은 함수의 런타임 및 함수와 관련된 모든 외부 익스텐션에 대한 수명 주기 지원을 제공한다.

함수의 런타임은 런타임 API를 사용하여 Lambda와 통신한다. 익스텐션은 익스텐션 API를 사용하여 Lambda와 통신한다. 또한 익스텐션은 Logs API를 사용하여 로그를 구독하는 방식으로 함수의 로그 메시지를 수신할 수 있다.

001

Lambda 함수를 생성할 때 함수에서 허용된 메모리 용량 및 최대 실행 시간 같은 구성 정보를 지정한다. Lambda는 이 정보를 사용하여 실행 환경을 설정한다.

함수의 런타임 및 각 외부 익스텐션은 실행 환경 내에서 실행되는 프로세스이다. 권한, 리소스, 자격 증명 및 환경 변수는 함수와 익스텐션 간에 공유된다.

주제


1. Lambda 실행 환경 수명 주기

실행 환경의 수명 주기에는 다음 단계가 포함된다.

  • Init: 이 단계 중에 Lambda는 구성된 리소스로 실행 환경을 만들거나 고정 해제하고, 함수와 모든 계층의 코드를 다운로드하고, 모든 익스텐션을 초기화하고, 런타임을 초기화한 다음 함수의 초기화 코드(기본 핸들러 외부의 코드)를 실행한다. Init 단계는 첫 번째 호출 중에 발생하거나, 프로비저닝된 동시성을 사용하도록 설정한 경우 함수 호출 전에 발생한다.

    Init 단계는 세 가지 하위 단계(Extension init, Runtime init, Function init)로 나뉜다. 이러한 하위 단계는 함수 코드가 실행되기 전에 모든 익스텐션과 런타임이 자신의 설정 작업을 완료하도록 보장한다.

  • Invoke: 이 단계에서 Lambda는 함수 핸들러를 호출한다. 함수의 실행이 완료한 후 Lambda는 다른 함수 호출을 처리할 준비를 한다.

  • Shutdown: Lambda 함수가 일정 기간 동안 호출을 받지 않으면 이 단계가 트리거된다. Shutdown 단계에서 Lambda는 런타임을 종료하고 익스텐션이 완전히 중지되도록 알림을 보낸 다음 환경을 제거한다. Lambda는 각 익스텐션에 Shutdown 이벤트를 보낸다. 이 이벤트는 환경이 곧 종료됨을 익스텐션에 알린다.

002

각 단계는 Lambda가 런타임 및 등록된 모든 익스텐션에 전송하는 이벤트로 시작된다. 런타임 및 각 익스텐션이 Next API 요청을 전송하여 완료를 나타낸다. 런타임 및 각 익스텐션이 완료되고 대기 중인 이벤트가 없으면 Lambda는 실행 환경을 중지한다.

1) 초기화 단계

Init 단계에서 Lambda는 다음 세 가지 작업을 수행한다.

  • 모든 익스텐션 시작(Extension init)

  • 런타임 부트스트랩(Runtime init)

  • 함수의 정적 코드 실행(Function init)

Init 단계는 런타임 및 모든 익스텐션이 Next API 요청을 전송하여 준비되었음을 알린 후에 종료된다. Init 단계는 10초로 제한된다. 세 작업이 모두 10초 이내에 완료되지 않으면 Lambda는 첫 번째 함수 호출 시 Init 단계를 다시 시도한다.

2) 호출 단계

Next API 요청에 대한 응답으로 Lambda 함수가 호출되면 Lambda는 런타임과 각 익스텐션에 Invoke 이벤트를 전송한다.

함수의 제한 시간 설정은 전체 Invoke 단계의 기간을 제한한다. 예를 들어 함수 제한 시간을 360초로 설정하면 함수와 모든 익스텐션이 360초 내에 완료되어야 한다. 독립적인 호출 후 단계는 없다. 기간은 모든 호출 시간(런타임 + 익스텐션)의 합계이며 함수와 모든 익스텐션의 실행이 완료될 때까지 계산되지 않는다.

호출 단계는 런타임 및 모든 익스텐션이 Next API 요청을 전송하여 완료되었음을 알린 후에 종료된다.

Invoke 단계 중에 Lambda 함수가 충돌하거나 시간이 초과되면 Lambda는 실행 환경을 재설정한다. 재설정은 Shutdown 이벤트처럼 동작한다. 먼저 Lambda는 런타임을 종료한다. 그런 다음 Lambda는 등록된 각 외부 익스텐션에 Shutdown 이벤트를 전송한다. 이벤트에는 종료 이유가 포함된다. 다른 Invoke 이벤트로 인해 이 실행 환경이 재사용되는 경우 Lambda는 다음 호출의 일부로 런타임 및 익스텐션을 초기화한다.

Noet

Lambda 재설정으로 다음 초기화 단계 전에 /tmp 디렉터리의 내용이 지워지지 않는다. 이 동작은 일반 종료 단계와 동일하다.

003

3) 종료 단계

Lambda는 런타임을 종료하려고 할 때 Shutdown 이벤트를 등록된 각 외부 익스텐션에 전송한다. 익스텐션은 이 시간 동안 최종 정리 작업을 수행할 수 있다. Shutdown 이벤트는 Next API 요청에 대한 응답이다.

기간: 전체 Shutdown 단계는 2초로 제한된다. 런타임 또는 익스텐션이 응답하지 않는 경우, Lambda는 신호(SIGKILL)를 통해 이를 종료한다.

함수와 모든 익스텐션이 완료된 후 Lambda는 다른 함수 호출을 예상하여 일정 시간 동안 실행 환경을 유지한다. 실제로 Lambda는 실행 환경을 재개한다. 함수가 다시 호출되면 Lambda는 재사용을 위해 환경을 재개한다. 실행 환경을 재사용하는 것은 다음과 같은 의미를 가진다.

  • 함수의 핸들러 메서드 외부에서 선언된 객체는 함수가 다시 호출될 때 추가로 최적화가 되도록 초기화된 상태로 유지된다. 예를 들어 Lambda 함수가 연결을 재설정하는 대신 데이터베이스 연결을 설정하면 원래 연결이 후속 호출에 사용된다. 코드에 로직을 추가하여 연결을 새로 생성하기에 앞서 연결이 이미 존재하는지 확인하는 것이 좋다.

  • 각 실행 환경은 /tmp 디렉터리에 512MB에서 10,240MB 사이 1MB 단위로 디스크 공간을 제공한다. 디렉터리 콘텐츠는 실행 환경이 일시 중지되어도 그대로 유지되기 때문에 일시적인 캐시를 여러 호출에서 사용할 수 있다. 코드를 추가하여 캐시에 저장한 데이터가 포함되어 있는지 확인할 수 있다.

  • Lambda 함수에 의해 초기화되었고 함수 종료 시 완료되지 않은 백그라운드 프로세스 또는 콜백은 Lambda가 실행 환경을 재사용하는 경우에 재개된다. 코드가 종료되려면 먼저 코드의 백그라운드 프로세스 또는 콜백이 완료되어야 한다.

함수 코드를 작성할 때 Lambda가 이후 함수 호출을 위해 실행 환경을 자동으로 재사용한다고 가정해서는 안 된다. 다른 요인으로 인해 Lambda가 새 실행 환경을 생성해야 할 수 있으며 이 경우 데이터베이스 연결 실패 같은 예기치 못한 결과가 발생할 수 있다.


References