ユーザーリクエストを処理する際、Function Compute は 1 つ以上のインスタンスを自動的に割り当てます。各インスタンスは、安全で分離された実行環境を提供します。従来のアプリケーションをサーバーレスアーキテクチャに移行する際、インスタンスの作成と削除が一時的である性質上、モニタリングデータの更新遅延、メトリックのレイテンシー、またはデータ損失などの問題が発生する可能性があります。これらの問題に対処するため、Function Compute はインスタンスライフサイクルフックを提供しており、モニタリングデータの適時性と完全性を確保するのに役立ちます。
関数インスタンスのライフサイクル
関数インスタンスは、ご利用の関数の現在の呼び出し量に基づいて、オンデマンドで作成および削除されます。各関数インスタンスのライフサイクルには、インスタンス作成、呼び出し、インスタンス削除の 3 つのフェーズが含まれます。次の図に示します。
作成
作成フェーズでは、Function Compute は関数の設定に基づいて関数インスタンスを作成します。このフェーズでは、Function Compute は次のタスクを順番に実行します。
-
インスタンス作成:これには、コードのロード、レイヤーのロードまたはイメージのプル、およびインスタンスの起動が含まれます。
-
ランタイムの初期化。
-
設定された Initializer フックを実行します。詳細については、「Initializer フック」をご参照ください。
インスタンスの作成は、通常、次の 2 つのシナリオで発生します。
-
弾性スケールアウト
呼び出しリクエストが受信され、現在のすべての関数インスタンスがビジー状態の場合、リクエストを処理するために新しいインスタンスが作成されます。インスタンスはすぐに作成され、その後、呼び出しプロセスが開始されます。この弾性スケールアウトは、コールドスタートを引き起こす可能性があります。この問題を軽減する方法については、「Function Compute のコールドスタートを最適化するためのベストプラクティス」をご参照ください。
-
最小インスタンス数の調整
設定された最小インスタンス数を 0 から 1 以上に変更すると、Function Compute はすぐにインスタンス作成プロセスを開始します。その時点で呼び出しリクエストが受信されない場合、インスタンスの作成と最初の呼び出しの間に遅延が発生する可能性があります。詳細については、「最小インスタンス数のスケーリングポリシーの設定」をご参照ください。
呼び出し
インスタンスの実行中、Function Compute はご利用の関数ハンドラを呼び出して呼び出しリクエストを処理します。呼び出しフェーズでは、ビルトインランタイムの場合、1 つのインスタンスは一度に 1 つのリクエストのみを処理します。カスタムランタイムまたはカスタムコンテナランタイムの場合、1 つのインスタンスで複数のリクエストを同時に処理できます。これは、インスタンスの同時実行数を設定することで実現できます。詳細については、「インスタンスの同時実行数の設定」をご参照ください。
Function Compute は、リクエストやフックハンドラを含め、ご利用のコードが実行されている時間に対してのみ課金します。リクエスト間のアイドル期間中、インスタンスはフリーズされ、課金は発生しません。詳細については、「課金」をご参照ください。
削除
このフェーズは、関数インスタンスが一定期間呼び出しを受信しない場合にトリガーされます。削除フェーズでは、Function Compute はまず PreStop フックを実行します。このフックでクリーンアップタスクを実行できます。
インスタンスの削除は、通常、次の 3 つのシナリオで発生します。
-
アイドル状態のインスタンス:インスタンスが指定された期間アイドル状態のままである場合、Function Compute は自動的にそれを回収します。
-
最小インスタンス数の調整:最小インスタンス数をスケールインすると、Function Compute は余剰なインスタンスをすぐに削除します。
-
インスタンスの例外:インスタンス作成または呼び出しフェーズ中にインスタンスでエラーが発生した場合、Function Compute はそれを削除します。
インスタンスのフリーズメカニズム
呼び出しリクエストがない場合、Function Compute はインスタンスをフリーズします。新しいリクエストが到着すると、Function Compute はインスタンスを解凍します。このプロセスを次の図に示します。
インスタンスのフリーズは、主に次の 2 つの状況で発生します。
-
インスタンスの初期化フェーズが完了した後、最初の呼び出しの前。
-
呼び出しが完了した後、次の呼び出しが始まる前。
呼び出しが完了した後、Function Compute は関数インスタンスをフリーズします。ご利用のコード内のバックグラウンドプロセス、スレッド、またはコルーチンは一時停止され、続行できません。これにより、非同期ログが正常に書き込まれなくなる可能性があります。
制限事項
-
GPU アクセラレーション関数の場合、Initializer フックはコード呼び出しとコマンド実行の 2 種類をサポートします。一度に有効にできるのはこれらのうち 1 種類のみです。
-
イベントトリガー関数、Web 関数、およびタスク関数の場合、Initializer フックはコード呼び出しタイプのみをサポートします。
-
PreStop フックはコード呼び出しタイプのみをサポートし、すべてのランタイムが PreStop フックをサポートします。
-
PreStop フックメソッドの入力パラメーターには、イベントパラメーターは含まれません。
-
PreStop フックは値を返さず、ご利用の関数内の戻り値ロジックは無視されます。
-
Java ランタイムを使用する場合、`fc-java-core` をバージョン 1.4.0 以降に更新する必要があります。そうしないと、PreStop フックを使用できません。
-
バックグラウンドスレッドやログのフラッシュなどの非同期操作が、インスタンスがフリーズする前に完了するとは考えないでください。
-
コード呼び出しフックの設定方法はランタイムによって異なります。ビルトインランタイムの場合、ライフサイクルフックを設定する際にカスタムエントリポイントを定義する必要があります。たとえば、Initializer フックハンドラを
index.initializeに設定した場合、コードにinitializeフック関数を追加する必要があります。一方、カスタムランタイムおよびカスタムコンテナランタイムの場合、Initializer フックと PreStop フックを設定すると、インスタンスの起動時または停止時にシステムが関数に HTTP リクエスト (POST /initialize または GET /pre-stop) を送信します。ご利用のアプリケーションコードは、これらのリクエストを処理する必要があります。
課金
インスタンスライフサイクルフックの呼び出しには、リクエスト料金は発生しません。その他の料金は、インスタンス呼び出しフェーズと同じロジックで計算されます。課金対象の持続時間を次の図に示します。課金の詳細については、「課金概要」をご参照ください。
前提条件
関数が作成されていること。詳細については、「関数の作成」をご参照ください。
インスタンスライフサイクルフックの設定
コンソール
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
トップナビゲーションバーでリージョンを選択し、[関数] ページで目的の関数をクリックします。
-
関数詳細ページで、設定 タブをクリックし、変更 セクションの インスタンスの設定 をクリックします。
-
インスタンスの設定 パネルで、Initializer フックとそのタイムアウト期間を設定します。
このトピックでは、GPU アクセラレーション関数を例に、Initializer フックの設定方法を説明します。イベントトリガー関数、Web 関数、およびタスク関数の場合、Initializer フックはコード呼び出しタイプのみをサポートします。このトピックで説明されているコード呼び出しタイプの手順に従うことができます。
-
コード呼び出しタイプを選択
[Initializer フック] スイッチをオンにし、[Initializer フックのタイムアウト] を
300秒に設定します。この機能を有効にすると、インスタンスの起動時に Function Compute が関数に HTTP POST /initialize リクエストを送信します。200 応答は成功を示し、4xx または 5xx 応答はエラーまたはインスタンスの再起動を引き起こします。 -
コマンド実行タイプを選択
[Initializer フック] スイッチをオンにし、[Initializer フックのタイムアウト] を
300秒に設定し、[コマンド] を>/bin/shに設定します。コードエディタで、ローカルの Stable Diffusion API にヘルスチェックの POST リクエストを送信するシェルスクリプトを記述します。URL をhttp://localhost:7860に、REQUEST_PATH をsdapi/v1/txt2imgに設定します。prompt、steps、height、およびwidthフィールドを含む JSON ペイロードを構築し、curl を使用してリクエストを送信します。
-
-
インスタンスの設定 パネルで、PreStop フックとそのタイムアウト期間を設定し、デプロイ をクリックします。
-
コード呼び出しタイプのフックを設定した場合は、コードに対応する関数を実装する必要があります。
-
コード タブをクリックします。コードエディタで、フック関数のロジックを追加します。
たとえば、PreStop フックハンドラを
index.preStopとして設定した場合、コードに preStop 関数を実装する必要があります。さまざまなランタイムでインスタンスライフサイクルフックを実装する方法については、「関数インスタンスのライフサイクルフック」をご参照ください。説明オンライン IDE は PHP、Python、Node.js、およびカスタムランタイムをサポートしていますが、Java、Go、.NET などのコンパイル型言語やカスタムコンテナランタイムはサポートしていません。
-
コードエディタの上部で、デプロイメントコード をクリックし、次に 関数のテスト をクリックします。
-
Serverless Devs
Serverless Devs を使用して Initializer フックを設定する場合、s.yaml ファイル内のコードスニペットは次の例のようになります。
codeUri: './code.zip'
......
instanceLifecycleConfig:
initializer:
timeout: 60
command:
- /bin/sh
- -c
- echo "hello"
フックを無効にする必要がある場合は、そのハンドラとコマンドパラメーターを明示的に空の文字列に設定する必要があります。これは、そうしないとバックエンドが更新を適用しないためです。たとえば、Initializer フックを無効にするには、次の設定をデプロイします。Initializer フックのタイムアウトとコマンドパラメーターは無視されます。
codeUri: './code.zip'
......
instanceLifecycleConfig:
initializer:
handler: ""
timeout: 60
command: ""
さまざまなランタイムでインスタンスライフサイクルフックを実装する方法については、「関数インスタンスのライフサイクルフック」をご参照ください。
SDK
SDK を使用してフックをデプロイおよび更新できます。このセクションでは、関数を作成する際にフックを設定するためのサンプル SDK コードを取得する方法について説明します。
-
CreateFunction API リファレンストピックに移動し、[デバッグ] をクリックして OpenAPI Portal を開きます。
-
[パラメーター] タブで、作成する関数に基づいて入力パラメーターを指定します。
説明command パラメーターは PreStop フックではサポートされていません。
instanceLifecycleConfig を展開します。initializer セクションで、timeout を
300に設定します。command リストで、インデックス 0 に値curl -X POST 'http://localhost:9000/preWarm'の項目を追加します。preStop セクションで、handler をindex.preStopに、timeout を3に設定します。 -
パラメーターを設定した後、[SDK サンプル] タブをクリックして、希望する言語のサンプルコードを取得します。
さまざまなランタイムでインスタンスライフサイクルフックを実装する方法については、「関数インスタンスのライフサイクルフック」をご参照ください。
関数インスタンスのライフサイクルフック
Function Compute のすべてのランタイムは、Initializer フックと PreStop フックの両方をサポートしています。さまざまなランタイムでインスタンスライフサイクルフックを実装する方法については、次のドキュメントをご参照ください。
|
ランタイム |
説明 |
リファレンス |
|
Node.js |
Node.js で関数インスタンスのライフサイクルフックを実装します。 |
|
|
Python |
Python で関数インスタンスのライフサイクルフックを実装します。 |
|
|
PHP |
PHP で関数インスタンスのライフサイクルフックを実装します。 |
|
|
Java |
Java で関数インスタンスのライフサイクルフックを実装します。 |
|
|
C# |
C# で関数インスタンスのライフサイクルフックを実装します。 |
|
|
Go |
Go で関数インスタンスのライフサイクルフックを実装します。 |
|
|
カスタムランタイム |
カスタムランタイムで関数インスタンスのライフサイクルフックを実装します。 |
|
|
カスタムコンテナランタイム |
カスタムコンテナランタイムで関数インスタンスのライフサイクルフックを実装します。 |
フック関連のログのクエリ
インスタンスライフサイクルフックを設定し、対応する関数を実装した後、関連するログをクエリできます。
コマンド実行タイプのフックによって生成されたログは、現在、関数ログに書き込むことはできません。
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
トップナビゲーションバーでリージョンを選択し、[関数] ページで目的の関数をクリックします。
-
関数詳細ページで、ログ タブをクリックします。呼び出しリクエスト タブで、目的のリクエストを見つけ、[アクション] 列の 詳細ログ をクリックします。
インスタンス ID を使用して、すべてのライフサイクルフックの開始ログと終了ログをクエリできます。また、
インスタンス ID AND "フックのキーワード"のようなクエリを使用して、特定のフックのログを検索することもできます。たとえば、c-62833f38-20f1629801fa4bd***** and PreStopのようにします。また、開始ログと終了ログの RequestId を使用して、特定のリクエストに関連するログをクエリすることもできます。ログに RequestId が含まれていない場合は、そのログエントリの
アイコンをクリックしてコンテキストログを表示します。