Lambda 관리형 인스턴스 모범 사례
용량 공급자 구성
신뢰 수준에 따라 용량 공급자를 구분합니다. 보안 요구 사항이 서로 다른 워크로드에 대해 서로 다른 용량 공급자를 생성합니다. 용량 공급자가 보안 경계 역할을 하므로 동일한 용량 공급자에 할당된 모든 함수는 상호 신뢰해야 합니다.
설명이 포함된 이름을 사용합니다. 용량 공급자의 이름을 지정하여 용도와 신뢰 수준을 명확하게 표시합니다(예: production-trusted, dev-sandbox). 이를 통해 팀은 각 용량 공급자의 목적과 보안 태세를 이해할 수 있습니다.
여러 가용 영역을 사용합니다. 용량 공급자를 생성할 때 여러 가용 영역에 걸쳐 서브넷을 지정합니다. Lambda는 AZ 복원력을 위해 기본적으로 인스턴스 3개를 시작하여 함수의 고가용성을 보장합니다.
인스턴스 유형 선택
Lambda가 인스턴스 유형을 선택하도록 합니다. 기본적으로 Lambda는 워크로드에 가장 적합한 인스턴스 유형을 선택합니다. 가능한 인스턴스 유형 수를 제한하면 가용성이 낮아질 수 있으므로 Lambda 관리형 인스턴스가 인스턴스 유형을 자동으로 선택하도록 하는 것이 좋습니다.
특정 요구 사항에 맞춰 인스턴스 유형을 지정합니다. 특정 하드웨어 요구 사항이 있는 경우 허용된 인스턴스 유형과 호환되는 인스턴스 목록으로 설정합니다. 예제:
-
높은 네트워크 대역폭이 필요한 애플리케이션의 경우 여러 개의 인스턴스 유형을 선택합니다.
-
비용 관련 제약이 있는 테스트 또는 개발 환경의 경우 m7a.large와 같이 더 작은 인스턴스 유형을 선택합니다.
함수 구성
적절한 메모리 및 vCPU 설정을 선택합니다. 함수의 다중 동시 실행을 지원하는 메모리 및 vCPU 구성을 선택합니다. 지원되는 최소 함수 크기는 2GB 및 1개의 vCPU입니다.
-
Python 애플리케이션의 경우 Python이 다중 동시성을 처리하는 방식으로 인해 vCPU에 대한 메모리 비율을 4:1 또는 8:1 등으로 더 높게 선택해야 합니다.
-
IO를 거의 수행하지 않는 CPU 집약적 작업 또는 함수의 경우 vCPU를 2개 이상으로 선택합니다.
-
웹 서비스 또는 배치 작업과 같이 IO가 많은 애플리케이션의 경우 다중 동시성이 가장 큰 이점을 제공합니다.
적절한 최대 동시성을 구성합니다. Lambda는 리소스 소비량과 처리량의 균형을 맞추는 최대 동시성에 있어 합리적인 기본값을 선택합니다. 함수의 리소스 사용량에 따라 설정을 조정합니다.
-
함수 간접 호출에서 CPU를 거의 사용하지 않는 경우 최대 동시성을 높입니다(vCPU당 최대 64개).
-
애플리케이션이 대량의 메모리와 매우 적은 CPU를 소비하는 경우 최대 동시성을 낮춥니다.
동시성이 매우 낮은 실행 환경에서는 스로틀링이 발생하고 규모 조정이 어려울 수 있습니다.
Scaling configuration(조정 구성)
적절한 목표 리소스 사용률을 설정합니다. 기본적으로 Lambda는 트래픽이 스로틀링 없이 5분 이내에 2배가 될 수 있도록 충분한 여유 공간을 유지합니다. 워크로드 특성에 따라 이 설정을 조정합니다.
-
스로틀링에 민감하지 않은 매우 안정적인 워크로드 또는 애플리케이션의 경우 목표를 높은 수준으로 설정하여 사용률을 높이고 비용을 절감합니다.
-
트래픽 버스트 가능성이 있는 워크로드의 경우 리소스 목표를을 낮은 수준으로 설정하여 추가 여유분을 유지합니다.
트래픽 증가를 계획합니다. 5분 이내에 트래픽이 2배를 초과하는 경우 Lambda가 인스턴스 및 실행 환경을 확장함에 따라 스로틀링이 발생할 수 있습니다. 빠르게 확장하는 동안 잠재적 스로틀링을 처리하도록 애플리케이션을 설계합니다.
보안
PassCapacityProvider 권한에 최소 권한을 적용합니다. 필요한 용량 공급자에 대해서만 lambda:PassCapacityProvider 권한을 부여합니다. 리소스 수준 권한을 사용하여 사용자가 함수에 할당할 수 있는 용량 공급자를 제한합니다.
용량 공급자 사용량을 모니터링합니다. AWS CloudTrail을 사용하여 용량 공급자 할당 및 액세스 패턴을 모니터링합니다. 이를 통해 무단 액세스 시도를 식별하고 보안 정책을 준수할 수 있습니다.
신뢰할 수 없는 워크로드를 분리합니다. 신뢰할 수 없는 워크로드 간의 보안 격리를 컨테이너에 의존하지 않습니다. 서로 다른 용량 공급자를 사용하여 상호 신뢰할 수 없는 워크로드를 분리합니다.
비용 최적화
EC2 요금 옵션을 활용합니다. EC2 절감형 플랜 및 예약 인스턴스를 활용하여 비용을 절감합니다. 이러한 요금 옵션은 기본 EC2 컴퓨팅에 적용됩니다(15% 관리 요금은 할인되지 않음).
정상 상태 워크로드에 맞춰 최적화합니다. Lambda 관리형 인스턴스는 예측 가능한 대용량 트래픽이 있는 정상 상태 함수에 가장 적합합니다. 트래픽 버스트가 발생하는 패턴의 경우 Lambda(기본값)의 비용 효율성이 더 높을 수 있습니다.
리소스 사용률을 모니터링합니다. CloudWatch 지표를 추적하여 CPU 및 메모리 사용률을 파악합니다. 실제 사용량 패턴을 기반으로 함수 메모리 할당 및 인스턴스 유형 선택을 조정하여 비용을 최적화합니다.
모니터링 및 관찰성
용량 공급자 지표를 모니터링합니다. CPUUtilization, MemoryUtilization, vCPUAvailable, MemoryAvailable 등의 용량 공급자 수준 지표를 추적하여 워크로드에서 충분한 리소스를 사용할 수 있는지 확인합니다.
실행 환경 지표를 모니터링합니다. ExecutionEnvironmentConcurrency 및 ExecutionEnvironmentConcurrencyLimit 등 실행 환경 수준 지표를 추적하여 규모 조정 동작을 이해하고 스로틀링 가능성을 식별합니다.
CloudWatch 경보를 설정합니다. 주요 지표에 대한 CloudWatch 경보를 생성하여 문제를 사전에 식별합니다.
-
높은 CPU 또는 메모리 사용률
-
낮은 가용 용량
-
동시성 제한 근접
런타임별 고려 사항
런타임별 모범 사례를 따릅니다. 각 런타임은 다중 동시성을 서로 다르게 처리합니다. 자세한 권장 사항은 런타임별 가이드를 참조하세요.
-
Java: 요청별 상태에 스레드 안전 컬렉션,
AtomicInteger및ThreadLocal사용 -
Node.js: 모든 요청별 상태에 InvokeStore를 사용하고 전역 변수 사용 지양
-
Python:
/tmp에서 요청 ID와 함께 고유한 파일 이름을 사용하고 프로세스 기반 메모리 격리 고려
스레드 안전 및 동시성 문제를 테스트합니다. 프로덕션에 배포하기 전에 함수에서 동시 로드 시 스레드 안전 문제, 경합 조건 및 적절한 상태 격리가 발생하는지 여부를 테스트합니다.
다음 단계
-
CloudWatch 지표를 사용하여 Lambda 관리형 인스턴스 모니터링