

# Python 用の Lambda SnapStart のランタイムフック
<a name="snapstart-runtime-hooks-python"></a>

ランタイムフックを使用して、Lambda がスナップショットを作成する前、または Lambda がスナップショットから関数を再開した後でコードを実装できます。Python ランタイムフックは、Python マネージドランタイムに含まれているオープンソースの [Snapshot Restore for Python ライブラリ](https://pypi.org/project/snapshot-restore-py/)の一部として使用できます。このライブラリには、ランタイムフックの定義に使用できる 2 つのデコレータが用意されています。
+ `@register_before_snapshot`: Lambda がスナップショットを作成する前に実行する関数の場合。
+ `@register_after_restore`: Lambda がスナップショットから関数を再開するときに実行する関数の場合。

あるいは、次の方法を使用して、ランタイムフックの呼び出し可能オブジェクトを登録することもできます。
+ `register_before_snapshot(func, *args, **kwargs)`
+ `register_after_restore(func, *args, **kwargs)`

## ランタイムフックの登録と実行
<a name="runtime-hooks-registration-python"></a>

Lambda がランタイムフックを実行する順序は、登録順によって決まります。
+ スナップショット前: 登録の逆順で実行されます
+ スナップショット後: 登録順で実行されます

ランタイムフックの登録の順序は、フックの定義方法によって異なります。デコレータ (`@register_before_snapshot` および `@register_after_restore`) を使用する場合、登録順序はコード内でのインポート、定義、または実行の順序に従います。登録順序をより詳細に制御する必要がある場合は、デコレータの代わりに `register_before_snapshot()` メソッドおよび `register_after_restore()` メソッドを使用します。

登録されたすべてのフックが適切にインポートされ、関数のコードに含まれている必要があります。ランタイムフックを別のファイルまたはモジュールに登録する場合は、モジュールが (直接、またはより大きなパッケージの一部として) 関数のハンドラーファイルにインポートされていることを確認する必要があります。ファイルまたはモジュールが関数ハンドラーにインポートされていない場合、Lambda はそのランタイムフックを無視します。

**注記**  
Lambda がスナップショットを作成するときは、初期化コードが最大 15 分間実行される場合があります。制限時間は 130 秒、または[設定されている関数のタイムアウト](configuration-timeout.md) (最大 900 秒) のいずれか長い方です。`@register_before_snapshot` ランタイムフックは初期化コードの時間制限にカウントされます。Lambda がスナップショットを復元するときは、タイムアウト制限 (10 秒) 内に、ランタイムがロードされて `@register_after_restore` ランタイムフックが完了する必要があります。その時間を超えると、SnapStartTimeoutException が発生します。

## 例
<a name="runtime-hooks-python-code-sample"></a>

以下のハンドラー例は、チェックポイント作成前 (`@register_before_snapshot`) と復元後 (`@register_after_restore`) にコードを実行する方法を示しています。

```
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
```

その他の例については、AWS GitHub リポジトリの「[Snapshot Restore for Python](https://github.com/aws/snapshot-restore-py/tree/main/examples)」を参照してください。