Lambda 실행 환경 - AWS Lambda

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Lambda 실행 환경

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

함수의 런타임은 런타임 API를 사용하여 Lambda와 통신합니다. 익스텐션은 익스텐션 API를 사용하여 Lambda와 통신합니다. 또한 확장은 텔레메트리 API를 사용하여 함수의 로그 메시지와 기타 텔레메트리 데이터를 수신할 수 있습니다.


            실행 환경의 아키텍처 다이어그램.

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

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

Lambda 실행 환경 수명 주기


            Init 단계 다음에 하나 이상의 함수 호출이 수행됩니다. 호출 요청이 없는 경우 Lambda는 Shutdown 단계를 시작합니다.

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

초기화 단계

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

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

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

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

  • 모든 beforeCheckpoint 런타임 후크 실행 ( SnapStart Lambda 전용)

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

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

참고

10초 제한 시간은 프로비저닝된 동시성을 사용하는 함수에는 적용되지 않습니다. SnapStart 프로비전된 동시성 및 SnapStart 함수의 경우 초기화 코드를 최대 15분 동안 실행할 수 있습니다. 시간 제한은 130초 또는 구성된 함수 제한 시간(최대 900초) 중 더 높은 값입니다.

프로비저닝된 동시성을 사용하면 함수에 대한 PC 설정을 구성할 때 Lambda가 실행 환경을 초기화합니다. 또한 Lambda는 간접 호출에 앞서 초기화된 실행 환경을 항상 사용할 수 있도록 합니다. 함수의 간접 호출 단계와 초기화 단계 사이에 시간 격차가 발생할 수 있습니다. 함수의 런타임 및 메모리 구성에 따라 초기화된 실행 환경에서 첫 번째 간접 호출 시 가변적 지연 시간이 나타날 수도 있습니다.

온디맨드 동시성을 사용하는 함수의 경우 Lambda는 간접 호출 요청에 앞서 실행 환경을 초기화하는 경우가 있습니다. 이 경우 함수의 초기화 단계와 간접 호출 단계 사이에 시간 격차가 발생할 수 있습니다. 이 동작에 의존하지 않는 것이 좋습니다.

Init 단계 중 실패

Init 단계 중에 함수가 충돌하거나 시간이 초과되면 Lambda는 INIT_REPORT 로그에 오류 정보를 생성합니다.

예 — 타임아웃에 대한 INIT_REPORT 로그
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: timeout
예 — 확장 실패에 대한 INIT_REPORT 로그
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: error Error Type: Extension.Crash

Init단계가 성공하면 활성화되지 않는 한 Lambda는 로그를 내보내지 INIT_REPORT 않습니다. SnapStart SnapStart INIT_REPORT함수는 항상 내보냅니다. 자세한 설명은 Lambda에 대한 모니터링 SnapStart 섹션을 참조하세요.

복원 단계 ( SnapStart Lambda만 해당)

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

복원 단계 중 실패

Restore 단계가 실패하면 Lambda는 RESTORE_REPORT 로그에 오류 정보를 생성합니다.

예 — 타임아웃에 대한 RESTORE_REPORT 로그
RESTORE_REPORT Restore Duration: 1236.04 ms Status: timeout
예 — 런타임 후크 실패에 대한 RESTORE_REPORT 로그
RESTORE_REPORT Restore Duration: 1236.04 ms Status: error Error Type: Runtime.ExitError

RESTORE_REPORT log에 대한 자세한 내용은 Lambda에 대한 모니터링 SnapStart을 참조하십시오.

호출 단계

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

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

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

호출 단계 중 실패

Invoke 단계 중에 Lambda 함수가 충돌하거나 시간이 초과되면 Lambda는 실행 환경을 재설정합니다. 다음 다이어그램은 호출 실패 시 Lambda 실행 환경 동작을 보여줍니다.

이전 다이어그램에서

  • 첫 번째 단계는 오류 없이 실행되는 INIT 단계입니다.

  • 두 번째 단계는 오류 없이 실행되는 INVOKE 단계입니다.

  • 어떤 시점에서 함수에 호출 오류(함수 시간 초과나 런타임 오류)가 발생했다고 하겠습니다. INVOKE WITH ERROR라고 표시된 세 번째 단계가 이 시나리오를 보여줍니다. 이 경우 Lambda 서비스가 재설정을 수행합니다. 재설정은 Shutdown 이벤트처럼 동작합니다. 먼저 Lambda는 런타임을 종료한 다음 등록된 각 외부 익스텐션에 Shutdown 이벤트를 전송합니다. 이벤트에는 종료 이유가 포함됩니다. 이 환경이 새 호출에 사용되는 경우 Lambda는 익스텐션과 런타임을 다음 호출과 함께 다시 초기화합니다.

    참고

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

  • 네 번째 단계는 간접 호출 실패 직후의 INVOKE 단계를 나타냅니다. 여기서 Lambda는 INIT 단계를 다시 실행하여 환경을 다시 초기화합니다. 이를 억제된 초기화라고 합니다. 억제된 초기화가 발생할 경우 Lambda는 추가 INIT 단계를 Logs에 명시적으로 보고하지 않습니다. CloudWatch 대신 REPORT 줄의 지속 시간에 추가 INIT 기간 + INVOKE 기간이 포함되어 있음을 알 수 있습니다. 예를 들어 다음과 같은 로그가 표시된다고 가정해 보겠습니다. CloudWatch

    2022-12-20T01:00:00.000-08:00 START RequestId: XXX Version: $LATEST 2022-12-20T01:00:02.500-08:00 END RequestId: XXX 2022-12-20T01:00:02.500-08:00 REPORT RequestId: XXX Duration: 3022.91 ms Billed Duration: 3000 ms Memory Size: 512 MB Max Memory Used: 157 MB

    이 예제에서 REPORT 타임스탬프와 START 타임스탬프 간의 차이는 2.5초입니다. 이는 Lambda가 수행한 추가 INIT(억제된 초기화)를 고려하지 않기 때문에 보고된 지속 시간인 3022.91 밀리초와 일치하지 않습니다. 이 예시에서는 실제 INVOKE 단계에 2.5초가 걸렸다고 추론할 수 있습니다.

    이 동작에 대해 더 자세히 알아보려면 Lambda 텔레메트리 API을 사용하면 됩니다. Telemetry API는 호출 단계 사이에 억제된 초기화가 발생할 때마다 INIT_START, INIT_RUNTIME_DONE, INIT_REPORT, phase=invoke 이벤트를 내보냅니다.

  • 다섯 번째 단계는 오류 없이 실행되는 SHUTDOWN 단계를 나타냅니다.

종료 단계

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

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

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

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

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

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

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