AWS 람다 실행 환경(AWSLambda execution environment) 정리

Beginner IT (IT Beginner)·2023년 2월 10일
0

aws

목록 보기
3/4

Lambda

AWS Lambda는 서버리스 환경에서의 독립적인 실행환경에서 handler라는 함수를 호출한다고 생각하시면 되겠습니다. 그러면서 서버리스라고 하는 마이크로 실행환경을 가지고 있어서 생성 주기(수명주기)가 중요합니다.

Lambda 서비스는 별도의 외부 환경에서 API Endpoints와 그 내부의 프로세스들을 실행한다고 생각하시면 되는데, 이것이 '이벤트와 시간 베이스로 실행 되는 구나'라고 생각하시면 되겠습니다. 이러한 서비스들끼리의 공유는 권한, 리소스, 자격 증명 및 환경 변수는 함수와 확장 간에 공유됩니다.

Lambda 실행 환경 주기

각 단계는 Lambda가 런타임과 등록된 모든 확장에 전송하는 이벤트로 시작됩니다.
런타임과 각 확장은 NextAPI 요청을 전송하여 완료를 나타내며, 런타임과 각 확장이 완료되고 보류 중인 이벤트가 없을 때, 실행 환경을 동결합니다.

4가지의 단계는 아래와 같습니다.

1. 초기화단계

이 Init단계에서 Lambda는 세 가지 작업을 수행합니다.

  • 모든 확장 프로그램 시작( Extension init)
  • 런타임 부트스트랩( Runtime init)
  • 함수의 정적 코드 실행( Function init)
  • beforeCheckpoint 런타임 후크 실행 (Lambda SnapStart만 해당)

런타임 및 모든 확장 이 API 요청 Init을 전송하여 준비되었음을 알리면 단계가 종료됩니다.
.Next단계 는 Init10초로 제한됩니다.
3개의 작업이 모두 10초 이내에 완료되지 않으면 Lambda Init는 첫 번째 함수 호출 시 단계를 다시 시도합니다.

Lambda SnapStart 가 활성화되면 함수 Init버전을 게시할 때 단계가 발생합니다.
Lambda는 초기화된 실행 환경의 메모리 및 디스크 상태에 대한 스냅샷을 저장하고, 암호화된 스냅샷을 유지하고, 짧은 대기 시간 액세스를 위해 이를 캐시합니다.
beforeCheckpoint 런타임 후크 가 있는 경우 코드는 단계가 끝날 때 실행됩니다.

## 메모
10초 제한 시간은 SnapStart 기능에 적용되지 않습니다. Lambda가 스냅샷을 생성하면 초기화 코드가 최대 15분 동안 실행될 수 있습니다. 시간 제한은 130초 또는 구성된 기능 제한 시간 (최대 900초) 중 높은 값입니다.

2. 복원 단계(Lambda SnapStart만 해당)

SnapStart 함수 를 처음 호출하고 함수가 확장되면 Lambda는 함수를 처음부터 초기화하는 대신 지속된 스냅샷에서 새 실행 환경을 재개합니다.
afterRestore() 런타임 후크 가 있는 경우 코드는 단계가 끝날 때 실행됩니다.
afterRestore()런타임 후크 기간에 대해 요금이 부과됩니다 . 런타임(JVM)이 로드되고 afterRestore()런타임 후크가 제한 시간(2초) 내에 완료되어야 합니다.
그렇지 않으면 SnapStartTimeoutException이 발생합니다.
단계가 완료 되면 RestoreLambda는 함수 핸들러( Invoke단계)를 호출합니다.

3. 호출 단계

API 요청 에 대한 응답으로 Lambda 함수가 호출 되면 Lambda는 런타임과 각 확장에 이벤트를 Next보냅니다.

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

호출 단계는 런타임과 모든 확장이 NextAPI 요청을 전송하여 완료 신호를 보낸 후 종료됩니다.

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

메모
/tmpLambda 재설정은 다음 초기화 단계 전에 디렉터리 콘텐츠를 지우지 않습니다 . 이 동작은 일반 종료 단계와 일치합니다.

4. 종료 단계

Lambda의 런타임을 종료하려고 Shutdown 할때 등록된 각 외부 확장에 이벤트 요청을 보냅니다.
그리고 Excution Environment의 확장 프로그램은 이 시간을 최종 마무리 작업에서 사용할 수 있습니다.
즉, Shutdown이벤트는 NextAPI 요청 에 대한 응답입니다.

기간 : 전체 Shutdown단계는 2초로 제한되며, 런타임 또는 확장이 응답하지 않으면 Lambda는 신호( SIGKILL)를 통해 이를 종료합니다.

함수와 모든 확장이 완료된 후 Lambda는 다른 함수 호출을 예상하여 얼마 동안 실행 환경을 유지하고, 실제로 Lambda는 실행 환경을 동결합니다.
함수가 다시 호출되면 Lambda는 재사용을 위해 환경을 해동합니다(완전히 내려간건 아님). 실행 환경을 재사용하면 다음과 같은 의미가 있습니다.

  • 함수의 핸들러 메서드 외부에서 선언된 개체는 초기화된 상태로 유지되어 함수가 다시 호출될 때 추가 최적화를 제공합니다. 예를 들어 Lambda 함수가 연결을 다시 설정하는 대신 데이터베이스 연결을 설정하면 후속 호출에서 원래 연결이 사용됩니다. 새 연결을 생성하기 전에 연결이 존재하는지 확인하기 위해 코드에 논리를 추가하는 것이 좋습니다.

  • 각 실행 환경은 디렉토리에서 512MB에서 10,240MB 사이의 디스크 공간을 1MB 단위로 제공합니다 /tmp . 디렉터리 콘텐츠는 실행 환경이 고정되어도 남아 있어 여러 호출에 사용할 수 있는 임시 캐시를 제공합니다. 캐시에 저장한 데이터가 있는지 확인하는 추가 코드를 추가할 수 있습니다. 배포 크기 제한에 대한 자세한 내용은 Lambda 할당량 을 참조하십시오 .

  • Lambda 함수에 의해 시작되고 함수가 종료될 때 완료되지 않은 백그라운드 프로세스 또는 콜백은 Lambda가 실행 환경을 재사용하는 경우 재개됩니다. 코드가 종료되기 전에 코드의 백그라운드 프로세스 또는 콜백이 완료되었는지 확인하십시오.

함수 코드를 작성할 때 Lambda가 후속 함수 호출을 위해 실행 환경을 자동으로 재사용한다고 가정하지 마십시오. 다른 요인으로 인해 Lambda가 새로운 실행 환경을 생성해야 할 필요가 있을 수 있으며, 이로 인해 데이터베이스 연결 실패와 같은 예기치 않은 결과가 발생할 수 있습니다.

참고 사이트
https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html

profile
잘부탁드립니다. ㅎㅎ

0개의 댓글