

# .NET에 대한 Lambda SnapStart 런타임 후크
<a name="snapstart-runtime-hooks-dotnet"></a>

Lambda가 스냅샷을 생성하기 전이나 Lambda가 스냅샷에서 함수를 재개한 후에 런타임 후크를 사용하여 코드를 구현할 수 있습니다. .NET 런타임 후크는 [Amazon.Lambda.Core](https://www.nuget.org/packages/Amazon.Lambda.Core) 패키지(버전 2.5.0 이상)의 일부로 사용 가능합니다. 이 라이브러리에서는 런타임 후크를 정의하는 데 사용할 수 있는 두 가지 방법을 제공합니다.
+ `RegisterBeforeSnapshot()`: 스냅샷 생성 전에 실행할 코드
+ `RegisterAfterSnapshot()`: 스냅샷에서 함수를 재개한 후 실행할 코드

**참고**  
[.NET에 대한 Lambda 주석 프레임워크](csharp-handler.md#csharp-handler-annotations)를 사용하는 경우 SnapStart와의 호환성을 보장하기 위해 [Amazon.Lambda.Annotations](https://www.nuget.org/packages/Amazon.Lambda.Annotations) 버전 1.6.0 이상으로 업그레이드합니다.

## 런타임 후크 등록 및 실행
<a name="runtime-hooks-registration-dotnet"></a>

초기화 코드에 후크를 등록합니다. Lambda 함수의 [실행 모델](csharp-handler.md#csharp-handler-setup)에 따라 다음 지침을 고려합니다.
+ [실행 가능한 어셈블리 접근 방식](csharp-handler.md#csharp-executable-assembly-handlers)의 경우 `RunAsync`로 Lambda 부트스트랩을 시작하기 전에 후크를 등록합니다.
+ [클래스 라이브러리 접근 방식](csharp-handler.md#csharp-class-library-handlers)의 경우 핸들러 클래스 생성자에 후크를 등록합니다.
+ [ASP.NET Core 애플리케이션](csharp-package-asp.md)의 경우 `WebApplications.Run` 메서드를 직접 호출하기 전에 후크를 등록합니다.

.NET에서 SnapStart에 대한 런타임 후크를 등록하려면 다음 방법을 사용합니다.

```
Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint);
Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterCheckpoint);
```

여러 후크 유형이 등록되면 Lambda에서 런타임 후크를 실행하는 순서는 등록 순서에 따라 결정됩니다.
+ `RegisterBeforeSnapshot()`: 등록의 역순으로 실행됨
+ `RegisterAfterSnapshot()`: 등록 순서대로 실행됨

**참고**  
Lambda가 스냅샷을 생성할 때 초기화 코드를 최대 15분 동안 실행할 수 있습니다. 시간 제한은 130초 또는 [구성된 함수 제한 시간](configuration-timeout.md)(최대 900초) 중 더 높은 값입니다. `RegisterBeforeSnapshot()` 런타임 후크는 초기화 코드 시간 제한에 포함됩니다. Lambda에서 스냅샷을 복원하는 경우 런타임이 로드되고 `RegisterAfterSnapshot()` 런타임 후크가 제한 시간(10초) 내에 완료되어야 합니다. 그렇지 않으면 SnapStartTimeoutException이 발생합니다.

## 예제
<a name="runtime-hooks-dotnet-code-sample"></a>

다음 함수 예제에서는 체크포인트 생성 전(`RegisterBeforeSnapshot`)과 복원 후(`RegisterAfterRestore`)에 코드를 실행하는 방법을 보여줍니다.

```
public class SampleClass
{
    public SampleClass()
    {
        Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint);
        Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterCheckpoint);
    }

    private ValueTask BeforeCheckpoint()
    {
        // Add logic to be executed before taking the snapshot
        return ValueTask.CompletedTask;
    }

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

    public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // Add business logic

        return new APIGatewayProxyResponse
        {
            StatusCode = 200
        };
    }
}
```