Function Compute は、ユーザーリクエストを処理するために 1 つ以上のインスタンスを自動的に割り当てます。各インスタンスは、安全で隔離されたランタイム環境を提供します。従来のアプリケーションをサーバーレスアーキテクチャに移行する際、関数インスタンスの作成と破棄が一時的である性質上、モニタリングデータの更新の遅延、メトリックデータの遅延、またはデータ損失などの問題が発生する可能性があります。これらの課題に対処するため、Function Compute は、リアルタイムで完全なモニタリングデータを確保するために、さまざまなライフサイクルフックを提供しています。
関数インスタンスのライフサイクル
関数インスタンスは、現在のリクエスト量に基づいて動的に作成および破棄されます。各関数インスタンスのライフサイクルには、作成、呼び出し、破棄の 3 つのフェーズが含まれます。次の図に示します。
作成
インスタンスの作成とは、Function Compute が関数の設定に基づいて関数インスタンスを作成することを指します。インスタンス作成フェーズでは、Function Compute は次の 3 つのタスクを順に実行します:
インスタンス作成:Function Compute はコードとレイヤーをロードするか、イメージをプルしてからインスタンスを初期化します。
ランタイム初期化:Function Compute はランタイムを初期化します。
Init フック:Function Compute は設定された Initializer フックを実行します。詳細については、「Initializer フック」をご参照ください。
次の図は、作成フェーズを示しています。
インスタンスは、次のシナリオで作成されます:
弾性スケールアウト
既存のインスタンスが完全にロードされている場合、Function Compute は受信したリクエストを処理するために新しいインスタンスを作成します。作成されたインスタンスは、作成後に呼び出しフェーズに入ります。弾性スケールアウトはコールドスタートを引き起こす可能性があります。この問題の解決方法については、「Function Compute におけるコールドスタートを最適化するためのベストプラクティス」をご参照ください。
最小インスタンス数の調整
関数の最小インスタンス数を 0 から 1 以上に変更すると、Function Compute は直ちにこれらのインスタンスの作成プロセスを開始します。呼び出しリクエストが受信されない場合、呼び出しフェーズは作成フェーズからかなり後に行われます。詳細については、「起動スナップショットの弾性ポリシーの設定」をご参照ください。
呼び出し
インスタンスのランタイム中、関数ハンドラが呼び出され、内部および外部ソースからの関数呼び出しリクエストを処理します。Function Compute がサポートするビルトインランタイムの場合、呼び出しフェーズでは、インスタンスは一度に 1 つのリクエストのみを処理します。カスタムランタイムまたはカスタムコンテナランタイムの場合、インスタンスは複数のリクエストを同時に処理できます。インスタンスの同時実行数を設定することで、インスタンスごとの複数の同時リクエストを有効にできます。詳細については、「インスタンスの同時実行数の設定」をご参照ください。
Function Compute は、実際のリクエストとフックの実行に対してのみ課金します。リクエストがない期間はインスタンスがフリーズされるため、課金されません。詳細については、「課金」をご参照ください。
破棄
このフェーズは、関数インスタンスが一定期間呼び出しを受け取らない場合にトリガーされます。破棄フェーズでは、Function Compute はまず PreStop フックを実行します。PreStop フックでクリーンアップタスクを実行できます。
インスタンスは、次のシナリオで破棄されます:
アイドル状態のインスタンス:インスタンスが一定期間呼び出しリクエストを受け取らない場合、Function Compute は自動的にインスタンスを回収します。
最小インスタンス数の調整:最小インスタンス数を減らすと、Function Compute は余分なインスタンスを直ちに破棄します。
インスタンスの例外:インスタンスが作成または実行フェーズで例外に遭遇した場合、Function Compute はインスタンスを破棄します。
インスタンスのフリーズメカニズム
呼び出しリクエストがない場合、Function Compute はインスタンスをフリーズ (Freeze) し、新しいリクエストが到着すると、Function Compute はインスタンスを解凍 (Thaw) します。次の図にこのプロセスを示します。
インスタンスは、次のシナリオでフリーズされます:
インスタンスは初期化されたが、まだどのリクエストからも呼び出されていない。
インスタンスがリクエストを処理するために呼び出され、後続のリクエストがすぐには送信されない。
呼び出しフェーズが完了した後、Function Compute は関数インスタンスをフリーズします。プログラム内のバックグラウンドプロセス、スレッド、またはコルーチンは実行を継続できず、非同期ログは正常に書き込まれない可能性があります。
制限事項
GPU 関数は、コード呼び出しとコマンド実行の 2 種類の Initializer フックをサポートしています。これら 2 つのタイプを同時に設定することはできず、どちらか一方のみがアクティブになります。
イベント関数、Web 関数、タスク関数では、コード呼び出しタイプのみがサポートされています。このタイプはデフォルトで有効になっており、手動で選択する必要はありません。
PreStop フックはコード呼び出しタイプのみをサポートしており、すべてのランタイムが PreStop フックをサポートしています。
PreStop フックの入力パラメーターには、イベントパラメーターは含まれません。
PreStop フックは戻り値をサポートしておらず、フックに戻り値を追加するロジックは無効です。
Java ランタイムを使用する場合、PreStop フック機能を利用するには、fc-java-core を 1.4.0 以降に更新する必要があります。
関数が応答を返すと、Function Compute は関数インスタンスをフリーズします。応答が返されたときに、すべての非同期プロセス、スレッド、コルーチンが正常に実行されるとは限りません。非同期ログがリフレッシュされるとも限りません。
コード呼び出しタイプのフックでは、設定方法はランタイムによって異なります。ビルトインランタイムの場合、ライフサイクルフックを設定する際にフックのエントリポイントをカスタマイズする必要があります。たとえば、Initializer フックを
index.initializeとして設定した場合、コードにinitializeコールバック関数を追加する必要があります。カスタムランタイムおよびカスタムコンテナランタイムの場合、Initializer および PreStop フックを設定した後、インスタンスの起動時または停止時にシステムが関数に HTTP リクエスト (POST /initialize または GET/pre-stop) を送信します。ビジネスコードでこれらのリクエストに応答する必要があります。
課金
インスタンスのライフサイクルフックの呼び出し回数に対しては課金されません。その他の課金項目は、通常の呼び出しと同じです。次の図は、課金期間を示しています。課金方法の詳細については、「課金の概要」をご参照ください。
前提条件
関数の作成が完了していること。詳細については、「関数の作成」をご参照ください。
インスタンスのライフサイクルフックの設定
Function Compute コンソールでのフックの設定
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーで、リージョンを選択します。関数ページで、対象の関数をクリックします。
関数詳細ページで、設定タブをクリックします。インスタンス設定セクションの右側にある 変更をクリックします。
インスタンス設定パネルで、Initializer フックとタイムアウト期間を設定します。
このトピックでは、GPU 関数の Initializer フックを設定する例を示します。イベント関数、Web 関数、タスク関数では、Initializer フックはコード呼び出しタイプのみをサポートします。
コード呼び出しタイプを選択

コマンド実行タイプを選択

同じく インスタンス設定パネルで、PreStop フックとタイムアウト期間の設定を続け、デプロイをクリックします。

コード呼び出しタイプの Initializer フックまたは 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"フックを無効にする場合は、handler パラメーターと command の両方を明示的に空に設定する必要があります。そうしないと、バックエンドは更新されません。たとえば、Initializer フックを無効にするには、次の設定でデプロイする必要があります。Initializer フックの timeout および command パラメーターは無効になることに注意してください。
codeUri: './code.zip'
......
instanceLifecycleConfig:
initializer:
handler: ""
timeout: 60
command: ""異なるランタイムでライフサイクルフックを実装する方法の詳細については、「異なるランタイムにおける関数インスタンスのライフサイクルフック」をご参照ください。
SDK を使用したフックの設定
SDK を使用してフックをデプロイおよび更新できます。このセクションでは、関数を作成する際にフックを設定するために必要な SDK コードサンプルを取得する方法について説明します。
CreateFunction - 関数の作成ページに移動し、デバッグをクリックして OpenAPI ポータルに入ります。
パラメータータブで、作成したい関数の基本情報に基づいて入力パラメーターを入力します。
説明現在、PreStop フックは command パラメーターの設定をサポートしていません。

パラメーターを設定した後、SDK サンプルコードタブをクリックして、ご希望の言語の SDK サンプルコードを取得します。
異なるランタイムでライフサイクルフックを実装する方法の詳細については、「異なるランタイムにおける関数インスタンスのライフサイクルフック」をご参照ください。
異なるランタイムにおける関数インスタンスのライフサイクルフック
Function Compute のすべてのランタイムは、Initializer フックと PreStop フックの両方をサポートしています。次の表は、異なるランタイムでライフサイクルフックを実装する方法を説明しています。
ランタイム | 説明 | リファレンス |
Node.js | Node.js を使用して関数インスタンスのライフサイクルフックを実装します。 | |
Python | Python を使用して関数インスタンスのライフサイクルフックを実装します。 | |
PHP | PHP を使用して関数インスタンスのライフサイクルフックを実装します。 | |
Java | Java を使用して関数インスタンスのライフサイクルフックを実装します。 | |
C# | C# を使用して関数インスタンスのライフサイクルフックを実装します。 | |
Go | Go を使用して関数インスタンスのライフサイクルフックを実装します。 | |
カスタムランタイム | カスタムランタイムでインスタンスのライフサイクルフックを実装します。 | |
カスタムコンテナランタイム | カスタムコンテナランタイムでインスタンスのライフサイクルフックを実装します。 |
フック関連ログのクエリ
インスタンスのライフサイクルフックを設定し、そのコードを実行した後、フックに関連するログをクエリできます。
現在、コマンド実行タイプのフックによって生成されたログは、関数ログへの書き込みをサポートしていません。
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーで、リージョンを選択します。関数ページで、対象の関数をクリックします。
関数詳細ページで、ログタブをクリックします。呼び出しリクエストタブで、ログを表示したいリクエストを見つけ、操作列の 詳細ログをクリックします。
コピーしたインスタンス ID を使用して、すべてのライフサイクルフックの開始ログと終了ログをクエリできます。また、
インスタンス ID + ライフサイクルフックのキーワードを使用して、特定のフックの開始ログと終了ログをクエリすることもできます。たとえば、c-62833f38-20f1629801fa4bd***** and PreStopのようにします。
開始ログと終了ログのリクエスト ID に基づいてリクエストログをクエリすることもできます。ユーザーログにリクエスト ID が含まれていない場合は、
アイコンをクリックしてコンテキストログを取得できます。