Lambda 확장(Extensions)으로 Lambda 함수 확장하기

Lambda 확장(Extensions)으로 Lambda 함수 확장하기

Lambda 확장을 사용해서 Lambda 함수를 확장(augment)할 수 있어요. 예를 들어 Lambda 확장을 사용해서 함수를 선호하는 모니터링, 관측 가능성, 보안, 거버넌스 도구와 통합할 수 있어요. AWS Lambda 파트너가 제공하는 다양한 도구 중에서 선택하거나 자체 Lambda 확장을 만들 수 있어요.

Lambda는 외부(external) 확장과 내부(internal) 확장을 지원해요. 외부 확장은 실행 환경에서 독립 프로세스로 실행되며 함수 호출이 완전히 처리된 후에도 계속 실행돼요. 확장은 별도 프로세스로 실행되므로 함수와 다른 언어로 작성할 수 있어요. 모든 Lambda 런타임이 확장을 지원해요.

내부 확장은 런타임 프로세스의 일부로 실행돼요. 함수는 래퍼 스크립트나 JAVA_TOOL_OPTIONS 같은 프로세스 내 메커니즘을 사용해서 내부 확장에 접근해요. 자세한 내용은 런타임 환경 수정을 참고하세요.

Lambda 콘솔, AWS Command Line Interface(AWS CLI) 또는 CloudFormation, AWS Serverless Application Model(AWS SAM), Terraform 같은 코드형 인프라(IaC) 서비스와 도구를 사용해서 함수에 확장을 추가할 수 있어요.

확장이 소비하는 실행 시간(1ms 단위)에 대해 요금이 부과돼요. 자체 확장을 설치하는 데는 비용이 없어요. 확장에 대한 추가 가격 정보는 AWS Lambda Pricing을 참고하세요. 파트너 확장의 가격 정보는 해당 파트너 웹사이트를 참고하세요. 공식 파트너 확장 목록은 AWS Lambda 확장 파트너를 참고하세요.

출처: AWS Lambda 개발자 안내서

본문

주제(Topics)

실행 환경

Lambda는 함수를 안전하고 격리된 런타임 환경을 제공하는 실행 환경에서 호출해요. 실행 환경은 함수를 실행하는 데 필요한 리소스를 관리하고 함수의 런타임과 확장에 대한 라이프사이클 지원을 제공해요.

실행 환경의 라이프사이클에는 다음 단계가 포함돼요.

  • Init: 이 단계에서 Lambda는 구성된 리소스로 실행 환경을 만들거나 동결 해제하고, 함수와 모든 레이어의 코드를 다운로드하며, 모든 확장을 초기화하고, 런타임을 초기화한 다음 함수의 초기화 코드(메인 핸들러 밖의 코드)를 실행해요. Init 단계는 첫 번째 호출 중에 발생하거나, 프로비저닝된 동시성을 활성화한 경우 함수 호출에 앞서 발생해요.

    Init 단계는 Extension init, Runtime init, Function init의 세 하위 단계로 나뉘어요. 이러한 하위 단계는 함수 코드가 실행되기 전에 모든 확장과 런타임이 설정 작업을 완료하도록 보장해요.

    SnapStart가 활성화되면 Init 단계는 함수 버전을 게시할 때 발생해요. Lambda는 초기화된 실행 환경의 메모리·디스크 상태 스냅샷을 저장하고, 암호화된 스냅샷을 유지하며, 저지연 접근을 위해 캐시해요. 체크포인트 이전(before-checkpoint) 런타임 훅이 있다면 Init 단계 끝에 코드가 실행돼요.

  • Restore(SnapStart 전용): SnapStart 함수를 처음 호출하고 함수가 확장될 때 Lambda는 처음부터 함수를 초기화하는 대신 유지된 스냅샷에서 새 실행 환경을 재개해요. 복원 후(after-restore) 런타임 훅이 있다면 Restore 단계 끝에 코드가 실행돼요. 복원 후 런타임 훅의 기간에 대해 요금이 부과돼요. 런타임이 로드되고 복원 후 런타임 훅이 타임아웃 제한(10초) 내에 완료되어야 해요. 그렇지 않으면 SnapStartTimeoutException이 발생해요. Restore 단계가 완료되면 Lambda가 함수 핸들러를 호출해요(Invoke 단계).

  • Invoke: 이 단계에서 Lambda가 함수 핸들러를 호출해요. 함수가 완료되면 Lambda는 다른 함수 호출을 처리할 준비를 해요.

  • Shutdown: 이 단계는 Lambda 함수가 일정 시간 동안 호출을 받지 않으면 트리거돼요. Shutdown 단계에서 Lambda는 런타임을 종료하고, 확장에 알려 깔끔하게 중지하게 한 다음 환경을 제거해요. Lambda는 각 확장에 Shutdown 이벤트를 보내 환경이 곧 종료된다는 것을 알려줘요.

Init 단계 동안 Lambda는 확장이 포함된 레이어를 실행 환경의 /opt 디렉토리로 추출해요. Lambda는 /opt/extensions/ 디렉토리에서 확장을 찾고, 각 파일을 확장을 실행하는 실행 가능한 부트스트랩(bootstrap)으로 해석하며, 모든 확장을 병렬로 시작해요.

성능 및 리소스에 미치는 영향

함수 확장의 크기는 배포 패키지 크기 제한에 포함돼요. .zip 파일 아카이브의 경우 함수와 모든 확장의 압축 해제된 총 크기는 250MB의 압축 해제 배포 패키지 크기 제한을 초과할 수 없어요.

확장은 CPU, 메모리, 스토리지 같은 함수 리소스를 공유하므로 함수 성능에 영향을 줄 수 있어요. 예를 들어 확장이 계산 집약적 작업을 수행하면 함수의 실행 기간이 늘어날 수 있어요.

각 확장은 Lambda가 함수를 호출하기 전에 초기화를 완료해야 해요. 따라서 상당한 초기화 시간을 소비하는 확장은 함수 호출의 지연 시간을 늘릴 수 있어요.

함수 실행 후 확장이 차지하는 추가 시간을 측정하려면 PostRuntimeExtensionsDuration 함수 지표를 사용할 수 있어요. 사용된 메모리 증가를 측정하려면 MaxMemoryUsed 지표를 사용할 수 있어요. 특정 확장의 영향을 이해하려면 함수의 다른 버전을 나란히 실행할 수 있어요.

참고(Note) MaxMemoryUsed 지표는 Lambda Insights가 수집하는 지표 중 하나이며 Lambda 기본 지표가 아니에요.

권한

확장은 함수와 같은 리소스에 접근할 수 있어요. 확장이 함수와 같은 환경 내에서 실행되므로 권한은 함수와 확장 간에 공유돼요.

.zip 파일 아카이브의 경우 CloudFormation 템플릿을 만들어 동일한 확장 구성( AWS Identity and Access Management(IAM) 권한 포함)을 여러 함수에 연결하는 작업을 단순화할 수 있어요.

더 알아보기 (Learn more)

자체 Lambda 확장을 만드는 방법은 Lambda Extensions API를 사용해 확장 만들기를 참고하세요.