Amazon Web Services 한국 블로그

Python 및 .NET 함수용 AWS Lambda SnapStart 정식 출시

오늘은 Python, C#, F# 및 Powershell에서 일반적으로 코드 변경을 최소한으로 또는 전혀 하지 않고 몇 초에서 짧게는 1초 미만의 빠른 함수 시작 성능을 제공하는 Python 및 .NET 함수용 AWS Lambda SnapStart의 정식 출시를 발표합니다.

AWS는 2022년 11월 28일에 Java 함수용 Lambda SnapStart를 도입하여 시작 성능을 최대 10배까지 향상시켰습니다. Lambda SnapStart를 사용하면 리소스를 프로비저닝하거나 복잡한 성능 최적화를 구현하는 데 시간을 소비하지 않고도 함수 초기화로 인한 지연 시간 이상치를 줄일 수 있습니다.

Lambda SnapStart는 모든 일회성 초기화 코드, 즉 Lambda 함수가 처음 간접적으로 호출될 때만 실행되는 코드의 메모리 및 디스크 상태 스냅샷을 캐시하고 재사용하는 방식으로 작동합니다. Lambda는 초기화된 실행 환경의 메모리 및 디스크 상태에 대한 Firecracker microVM 스냅샷을 캡처하고, 스냅샷을 암호화하고, 지연 시간이 짧은 액세스를 위해 캐시합니다.

함수 버전을 처음 간접적으로 호출한 후 간접 호출이 스케일 업되면 Lambda는 처음부터 초기화하는 대신 캐시된 스냅샷에서 새 실행 환경을 재개하여 시작 지연 시간을 개선합니다. Lambda SnapStart는 AWS Lambda를 사용하여 Python 및 .NET에서 확장성과 응답성이 뛰어난 애플리케이션을 쉽게 구축할 수 있게 해줍니다.

Python 함수의 경우 초기화 코드의 시작 지연 시간은 몇 초일 수 있습니다. 이러한 상황이 발생할 수 있는 시나리오로는 종속성(예: LangChain, Numpy, Pandas, DuckDB)을 로드하거나 프레임워크(예: Flask 또는 Django)를 사용하는 경우가 있습니다. 또한 많은 함수가 Lambda를 사용하여 기계 학습(ML) 추론을 수행하며 초기화 중에 ML 모델을 로드해야 합니다. 이 프로세스는 사용된 모델의 크기에 따라 수십 초가 걸릴 수 있습니다. Lambda SnapStart를 사용하면 이러한 시나리오에서 시작 지연 시간을 몇 초에서 짧게는 1초 미만으로 줄일 수 있습니다.

.NET 함수의 경우 .NET JIT(Just-In-Time) 컴파일에는 최대 몇 초가 걸리기 때문에 대부분의 사용 사례에서 이점을 얻을 것으로 기대됩니다. Lambda 함수 초기화와 관련된 지연 시간 변동성은 고객이 AWS Lambda에서 .NET를 사용하는 데 오랫동안 걸림돌로 작용해 왔습니다. SnapStart를 사용하면 메모리 및 디스크 상태의 스냅샷을 캐시하여 함수를 빠르게 재개할 수 있습니다. 따라서 Lambda SnapStart를 사용하면 대부분의 .NET 함수에서 지연 시간 변동성이 크게 개선됩니다.

Python 및 .NET용 Lambda SnapStart 시작하기
시작하려면 AWS Management Console, AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용하여 Python 및 .NET 함수용 SnapStart를 활성화, 업데이트, 삭제할 수 있습니다.

AWS Lambda 콘솔에서 Functions 페이지로 이동하여 Lambda SnapStart를 사용할 함수를 선택합니다. Configuration, General configuration, Edit를 차례로 선택합니다. Edit basic settings 페이지에서 SnapStart 설정을 볼 수 있습니다.

Python 3.12 이상 및 .NET 8 이상의 관리형 런타임을 사용하여 Lambda 함수를 활성화할 수 있습니다. Published versions를 선택하고 Save를 선택합니다.

함수의 새 버전을 게시하면 Lambda가 코드를 초기화하고 초기화된 실행 환경의 스냅샷을 생성한 다음 지연 시간이 짧은 액세스를 위해 스냅샷을 캐시합니다. 함수를 간접적으로 호출하여 SnapStart가 활성화되었는지 확인할 수 있습니다.

다음은 update-function-configuration 명령을 --snap-start 옵션과 함께 실행하여 함수 구성을 업데이트하는 AWS CLI 명령입니다.

aws lambda update-function-configuration \
  --function-name lambda-python-snapstart-test \
  --snap-start ApplyOn=PublishedVersions

publish-version 명령을 사용하여 함수 버전을 게시합니다.

aws lambda publish-version \
  --function-name lambda-python-snapstart-test

get-function-configuration 명령을 실행하고 버전 번호를 지정하여 함수 버전에 대해 SnapStart가 활성화되었는지 확인합니다.

aws lambda get-function-configuration \
  --function-name lambda-python-snapstart-test:1

응답에서 OptimizationStatusOn, StateActive로 표시되면 SnapStart가 활성화되었고 지정된 함수 버전에 스냅샷을 사용할 수 있는 것입니다.

"SnapStart": { 
    "ApplyOn": "PublishedVersions",
    "OptimizationStatus": "On"
 },
 "State": "Active",

AWS SDK, AWS CloudFormation, AWS Serverless Application Model(AWS SAM), AWS Cloud Development Kit(AWS CDK)를 사용하여 스냅샷을 활성화, 업데이트 및 삭제하는 방법에 대해 자세히 알아보려면 AWS Lambda 개발자 안내서의 Lambda SnapStart 활성화 및 관리를 참조하세요.

런타임 후크
런타임 후크를 사용하여 Lambda가 스냅샷을 생성하기 전 또는 Lambda가 스냅샷에서 함수를 재개한 후에 실행되는 코드를 실행할 수 있습니다. 런타임 후크는 정리 또는 리소스 릴리스 작업을 수행하거나, 구성 또는 기타 메타데이터를 동적으로 업데이트하거나, 알림 전송 또는 외부 상태 업데이트와 같은 외부 서비스 또는 시스템과 통합하거나, 종속성을 미리 로드하는 등 함수의 시작 순서를 미세 조정하는 데 유용합니다.

Python 런타임 후크는 Python 관리형 런타임에 포함된 오픈 소스 Snapshot Restore for Python 라이브러리의 일부로 사용할 수 있습니다. 이 라이브러리는 Lambda가 스냅샷을 생성하기 전에 실행할 @register_before_snapshot 데코레이터와 Lambda가 스냅샷에서 함수를 재개할 때 실행할 @register_after_restore 데코레이터 두 가지를 제공합니다. 자세히 알아보려면 AWS Lambda 개발자 안내서의 Python용 Lambda SnapStart 런타임 후크를 참조하세요.

다음은 체크포인트 이전과 복원 이후에 코드를 실행하는 방법을 보여주는 Python 핸들러 예제입니다.

from snapshot_restore_py import register_before_snapshot, register_after_restore

def lambda_handler(event, context):
    # handler code

@register_before_snapshot
def before_checkpoint():
    # Logic to be executed before taking snapshots

@register_after_restore
def after_restore():
    # Logic to be executed after restore

NuGet에서 Amazon.Lambda.Core 패키지(버전 2.4 이상)의 일부로 제공되는 .NET 런타임 후크를 사용할 수도 있습니다. 이 라이브러리는 스냅샷을 생성하기 전에 실행할 RegisterBeforeSnapshot() 메서드와 스냅샷에서 함수를 재개한 후 실행할 RegisterAfterRestore() 메서드 두 가지를 제공합니다. 자세히 알아보려면 AWS Lambda 개발자 안내서의 .NET용 Lambda SnapStart 런타임 후크를 참조하세요.

다음은 체크포인트 이전과 복원 이후에 코드를 실행하는 방법을 보여주는 C# 핸들러 예제입니다.

public class SampleClass
{
    public SampleClass()
    { 
        Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint); 
        Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterRestore);
    }
    
    private ValueTask BeforeCheckpoint()
    {
        // Add logic to be executed before taking the snapshot
        return ValueTask.CompletedTask;
    }

    private ValueTask AfterRestore()
    {
        // Add logic to be executed after restoring the snapshot
        return ValueTask.CompletedTask;
    }

    public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // INSERT business logic
        return new APIGatewayProxyResponse
        {
            StatusCode = 200
        };
    }
}

선호하는 런타임에 대해 런타임 후크를 구현하는 방법을 알아보려면 AWS Lambda 개발자 안내서의 Lambda 함수 스냅샷 전후 코드 구현을 참조하세요.

주요 사항
다음은 Lambda SnapStart에 대해 알아야 할 몇 가지 사항입니다.

  • 고유성 처리 – 초기화 코드가 스냅샷에 포함된 고유한 콘텐츠를 생성하는 경우 실행 환경 간에 재사용될 때는 해당 콘텐츠가 고유하지 않습니다. SnapStart를 사용할 때 고유성을 유지하려면 초기화 후에 고유한 콘텐츠를 생성해야 합니다. 예를 들면 코드가 내장 라이브러리에 의존하지 않는 사용자 지정 난수 생성을 사용하거나 초기화 중에 만료될 수 있는 DNS 항목과 같은 정보를 캐시하는 것입니다. 고유성을 복원하는 방법을 알아보려면 AWS Lambda 개발자 안내서의 Lambda SnapStart를 사용한 고유성 처리를 참조하세요.
  • 성능 조정 – 성능을 극대화하려면 종속성을 미리 로드하고 함수 핸들러 대신 초기화 코드에서 시작 지연 시간을 유발하는 리소스를 초기화하는 것이 좋습니다. 이렇게 하면 대규모 클래스 로드와 관련된 지연 시간이 간접 호출 경로 밖으로 이동하여 SnapStart의 시작 성능이 최적화됩니다.
  • 네트워킹 모범 사례 – Lambda가 스냅샷에서 함수를 재개할 때는 초기화 단계에서 함수가 설정하는 연결 상태가 보장되지 않습니다. 대부분의 경우 AWS SDK가 설정한 네트워크 연결이 자동으로 재개됩니다. 다른 연결에 대해서는 AWS Lambda 개발자 안내서의 Lambda SnapStart 성능 극대화를 참조하세요.
  • 함수 모니터링 Amazon CloudWatch 로그 스트림, AWS X-Ray 활성 추적을 사용하고 Telemetry API, Amazon API Gateway 및 함수 URL 지표를 사용하여 확장을 위한 실시간 원격 측정 데이터에 액세스하여 SnapStart 함수를 모니터링할 수 있습니다. SnapStart 함수의 차이점에 대해 자세히 알아보려면 AWS Lambda 개발자 안내서의 Lambda SnapStart 모니터링을 참조하세요.

정식 출시
Python 및 .NET 함수용 AWS Lambda SnapStart는 현재 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(오리건), 아시아 태평양(싱가포르), 아시아 태평양(시드니), 아시아 태평양(도쿄), 유럽(프랑크푸르트), 유럽(아일랜드) 및 유럽(스톡홀름) AWS 리전에서 사용할 수 있습니다.

Python 및 .NET 관리형 런타임에는 2가지 유형의 SnapStart 요금이 부과됩니다. 하나는 SnapStart를 활성화한 상태로 게시하는 함수 버전당 부과되는 스냅샷 캐싱 비용이고, 다른 하나는 스냅샷에서 함수 인스턴스가 복원될 때마다 부과되는 복원 비용입니다. 따라서 SnapStart 캐시 비용을 절감하려면 사용하지 않는 함수 버전을 삭제합니다. 자세히 알아보려면 AWS Lambda 요금 페이지를 참조하세요.

AWS Lambda 콘솔에서 Python 및 .NET 함수용 Lambda SnapStart를 사용해 보세요. 자세한 내용은 Lambda SnapStart 페이지를 참조해 주시고, AWS Lambda용 AWS re:Post 또는 일반적인 AWS Support 문의를 통해 피드백을 보내주세요.

Channy