Amazon Web Services 한국 블로그
AWS Lambda 함수, Provisioned Concurrency를 통해 빠른 성능 제공 (서울 리전 포함)
AWS Lambda가 출시되고 5년이 흘렀지만 여전히 팀은 더 쉽게 애플리케이션을 구축하고 실행할 수 있는 새로운 방법을 찾고 있습니다. 특히, 중요 애플리케이션이 서버리스로 이동하면서 애플리케이션의 성능을 제어하는 더 많은 기능이 필요해졌습니다.
오늘 출시되는 Provisioned Concurrency는 함수를 지속적으로 초기화하고 아주 빠르게 준비하여 두 자리 수 밀리초로 응답하는 기능입니다. 이 기능은 웹 및 모바일 백엔드, 지연 시간에 민감한 마이크로서비스 또는 동기식 API와 같은 대화형 서비스를 구현하기에 적합합니다.
Lambda 함수를 호출하면 실행 환경으로 라우팅된 후 요청이 처리됩니다. 한 동안 함수를 사용하지 않았다면 더 많은 동시 호출을 처리하거나 함수를 업데이트해야 하는 경우 새 실행 환경이 생성됩니다. 실행 환경이 생성되는 동안 함수 코드가 설치되고 실행 시간이 시작됩니다. 배포 패키지의 크기와 코드 실행 시간 및 코드의 초기화 시간에 따라 새 실행 환경으로 호출을 라우팅할 때 지연 시간이 발생할 수 있습니다. 이 지연 시간을 일반적으로 “콜드 스타트(Cold start)”라고 합니다. 이 추가 지연 시간은 대부분의 애플리케이션에서 문제가 되지 않습니다. 그러나 일부 애플리케이션에서는 이 지연 시간이 문제가 될 수 있습니다.
람다 함수에 대해 Provisioned Concurrency를 활성화하면 Lambda 서비스가 요청된 수의 실행 환경을 초기화하여 호출에 바로 응답할 수 있도록 준비합니다.
Provisioned Concurrency 구성하기
동일한 Java 코드를 사용하고 Amazon API Gateway를 통해 트리거되는 Lambda 함수 2개를 생성합니다. 프로덕션 워크로드를 시뮬레이션하기 위해 이러한 함수는 일부 수학적 계산을 초기화 단계에서 1천만 회 반복하고 각 호출에 대해 2십만 회 반복합니다. 이 계산은 java.Math.Random
과 조건(if ...
)을 사용하여 컴파일러 최적화(예: 반복 “루피 제거”)를 방지합니다. 각 함수에는 1GB 메모리가 있으며 코드 크기는 1.7MB입니다.
두 함수가 유사한 워크로드에 대응하는 방법을 비교할 수 있도록 함수 1개에만 Provisioned Concurrency를 활성화하겠습니다. Lambda 콘솔에서 함수 중 1개를 선택합니다. [Configuration] 탭에 새로운 [Provisioned Concurrency] 설정이 표시됩니다.
[Add configuration]을 선택합니다. 특정 Lambda 함수 버전 또는 별칭에 대해 Provisioned Concurrency를 활성화할 수 있습니다($LATEST
사용 불가). 함수의 각 버전에 서로 다른 설정을 적용할 수 있습니다. 별칭을 사용하는 경우 이러한 설정을 해당하는 버전의 함수에 대해 활성화하기가 더 쉽습니다. 여기서는 live
별칭을 선택합니다. 그러면 AWS SAM AutoPublishAlias
함수 기본 설정을 사용하여 최신 버전으로 지속적으로 업데이트됩니다. [Provisioned Concurrency]에서는 500
을 입력하고 [Save]를 클릭합니다.
이제 Provisioned Concurrency 구성 상태가 [in progress]로 변경됩니다. 입력한 내용에 따라 동시에 들어오는 요청을 처리하기 위한 실행 환경이 준비됩니다. 이 시간 동안 함수는 사용 가능한 상태로 유지되며 트래픽을 처리합니다.
몇 분 후 동시성이 Ready 상태가 됩니다. 이러한 설정에서는 실행 환경에서 최대 500개의 동시 요청을 처리할 수 있습니다. 이 수를 초과하더라도 Lambda 함수의 일반적인 크기 조정이 적용됩니다.
동일한 리전의 Amazon Elastic Compute Cloud(EC2) 인스턴스를 사용하여 로드를 생성합니다. 간편함을 위해 Apache HTTP Server와 함께 번들로 제공되는 ab
도구를 사용하여 500의 동시성으로 API 엔드포인트 2개를 10,000번 호출합니다. 이 새로운 함수에서 예상할 수 있는 결과는 다음과 같습니다.
- Provisioned Concurrency가 활성화되고 500으로 설정된 함수에서 요청은 미리 초기화된 실행 환경을 통해 관리됩니다.
- Provisioned Concurrency가 비활성화된 다른 함수의 경우 약 500개의 실행 환경을 프로비저닝해야 하므로 동일한 양의 호출에 대해 총 5% 가량의 지연 시간이 추가됩니다.
ab
도구의 유용한 기능 중 하나는 특정 시간 내에 처리된 요청의 비율을 보고한다는 것입니다. 서버리스 지연 시간에 Tim Bray 씨의 대한 게시물에 설명되어 있듯이 이 비율을 통해 API 지연 시간을 확인할 수 있습니다.
Provisioned Concurrency가 비활성화된 함수의 결과는 다음과 같습니다.
특정 시간(ms) 내에 처리된 요청의 비율
50% 351
66% 359
75% 383
80% 396
90% 435
95% 1357
98% 1619
99% 1657
100% 1923(가장 긴 요청)
이러한 숫자를 보면 요청의 50%가 351ms 내에 처리되었고 요청의 66%는 359ms 내에 처리된 것을 알 수 있습니다. 그러나 요청의 95%를 넘어가면 지연 시간이 약 1초까지 갑자기 증가합니다.
Provisioned Concurrency가 활성화된 함수의 결과는 다음과 같습니다.
특정 시간(ms) 내에 처리된 요청의 비율
50% 352
66% 368
75% 382
80% 387
90% 400
95% 415
98% 447
99% 513
100% 593(가장 긴 요청)
이러한 숫자를 그래프로 비교해 봅시다.
테스트 워크로드에서 예상할 수 있듯이 가장 느린 5%의 요청(95%~100%)에서 응답 시간에 큰 차이가 있음을 알 수 있습니다. Provisioned Concurrency가 비활성화된 함수의 경우 새 실행 환경을 생성해야 하고 함수 코드의 초기화가 늦어지므로 지연 시간이 추가됩니다.
일반적으로 추가되는 지연 시간의 양은 사용하는 실행 시간, 코드의 크기 및 첫 번째 호출에 대해 코드를 준비하는 데 필요한 초기화에 따라 다릅니다. 따라서 이 추가 지연 시간은 여기서 경험한 것보다 더 길거나 짧을 수 있습니다.
이 추가 지연 시간의 영향을 받는 호출 수는 Lambda 서비스에서 새 실행 환경을 생성해야 하는 빈도에 따라 다릅니다. 일반적으로 이러한 영향은 동시 호출 수가 이미 프로비저닝된 수를 초과하는 경우 또는 새 버전의 함수를 배포하는 경우 발생합니다.
작은 비율의 응답 시간(일반적으로 꼬리 응답 시간이라고 함)은 최종 사용자 경험에서 큰 차이를 만듭니다. 시간이 길어지면 대부분의 사용자가 상호 작용 중에 영향을 받습니다. Provisioned Concurrency를 활성화하는 경우의 사용자 환경은 훨씬 더 안정적입니다.
Provisioned Concurrency는 Lambda 기능이며 모든 트리거에서 작동합니다. 예를 들어 WebSockets API, GraphQL 확인자 또는 IoT 규칙과 함께 사용할 수 있습니다. 이 기능을 사용하면 지연 시간이 짧아야 하는 서버리스 애플리케이션(예: 웹 및 모바일 앱, 게임 또는 복잡한 트랜잭션의 일부인 모든 서비스)을 구축할 때 보다 효과적으로 제어할 수 있습니다.
지금 이용 가능
콘솔, AWS CLI(명령줄 인터페이스) 또는 AWS SDK를 사용하여 신규 또는 기존 Lambda 함수에 대해 Provisioned Concurrency를 구성할 수 있으며 오늘부터 미국 동부(오하이오), 미국 동부(버지니아 북부), 미국 서부(캘리포니아), 미국 서부(오레곤), 아시아 태평양(홍콩), 아시아 태평양(뭄바이), 아시아 태평양(서울), 아시아 태평양(싱가포르), 아시아 태평양(시드니), 아시아 태평양(도쿄), 캐나다(중부), EU(프랑크푸르트), EU(아일랜드), EU(런던), EU(파리) 및 EU(스톡홀름), 중동(바레인) 및 남아메리카(상파울루) AWS 리전에서 사용할 수 있습니다.
AWS Serverless Application Model(SAM) 및 SAM CLI를 사용하여 Provisioned Concurrency를 사용하는 서버리스 애플리케이션을 테스트하고, 배포하고, 관리할 수 있습니다.
Application Auto Scaling을 사용하면 함수에 필요한 동시성을 자동으로 구성할 수 있습니다. 정책의 경우 대상 추적 및 예약 조정이 지원됩니다. 이러한 정책을 사용하면 수요가 높은 시간에 동시성 양을 자동으로 늘리고 수요가 감소하면 줄일 수 있습니다.
또한 오늘부터 AWS 파트너 도구에서도 Provisioned Concurrency를 사용할 수 있습니다. 예를 들어 Serverless Framework 및 Terraform에서 Provisioned Currency를 구성하거나 Datadog, Epsagon, Lumigo, New Relic, SignalFx, SumoLogic 및 Thundra에서 지표를 볼 수 있습니다.
구성한 동시성의 양과 구성한 기간에 대해서만 요금이 부과됩니다. 미국 동부(버지니아 북부)의 요금은 Provisioned Concurrency의 경우 GB 시간당 0.015 USD이고 기간의 경우 GB 시간당 0.035 USD입니다. 요청 수는 일반적인 함수와 동일한 요율로 부과됩니다. Lambda 요금 페이지에서 자세한 내용을 확인할 수 있습니다.
이 새로운 기능을 사용하면 지연 시간이 고도로 일관적이어야 하는 다양한 워크로드에 Lambda 함수를 사용할 수 있습니다.
— Danilo