

# .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 以降) の一部として使用できます。このライブラリには、ランタイムフックの定義に使用できる 2 つの方法が用意されています。
+ `RegisterBeforeSnapshot()`: スナップショットの作成前に実行するコード
+ `RegisterAfterSnapshot()`: スナップショットからの関数の再開後に実行するコード

**注記**  
[Lambda Annotations framework for .NET](csharp-handler.md#csharp-handler-annotations) を使用している場合は、[Amazon.Lambda.Annotations](https://www.nuget.org/packages/Amazon.Lambda.Annotations) バージョン 1.6.0 以降にアップグレードして、SnapStart との互換性を確保してください。

## ランタイムフックの登録と実行
<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 がスナップショットを復元するときは、タイムアウト制限 (10 秒) 内に、ランタイムがロードされて `RegisterAfterSnapshot()` ランタイムフックが完了する必要があります。その時間を超えると、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
        };
    }
}
```