Function Computeは、インスタンスのライフサイクルに基づいてフックを提供します。 フックを使用すると、従来のアプリケーションをサーバーレスアーキテクチャに移行する際の測定データの遅延や損失などの問題点に対処できます。 このトピックでは、Function Computeのランタイム拡張、PreFreezeフックとPreStopフックの設定方法、およびフックのログを照会する方法について説明します。
背景情報
従来のアプリケーションをサーバーレスアーキテクチャに移行する際の問題点
従来の長時間実行される仮想マシンまたはマネージドコンテナサービスの課金間隔は、多くの場合、インスタンスの起動時に開始され、インスタンスの停止時に終了します。 請求間隔内にリクエストが実行されない場合でも、課金されます。 Function Computeの課金粒度は1ミリ秒です。 インスタンスは、リクエストの実行中にのみ課金されます。 インスタンスは、リクエストが実行されない期間に凍結されます。 このようにして、完全イベント駆動型課金モデルを使用するアイドルインスタンスによって発生する不要なコストを回避できます。 ただし、フリーズメカニズムは、従来のアーキテクチャの長時間実行プロセスに関する仮説を打ち砕き、アプリケーションの移行を困難にします。 Function Computeは特別な環境で実行されます。 システムは、OpenTelemetryライブラリ用の分散Managed Serviceまたはサードパーティのアプリケーションパフォーマンス管理 (APM) ソリューションが使用されているシナリオなど、コールドスタートがないシナリオでは、期待どおりにデータを追跡およびレポートできません。
次の問題点は、従来のアプリケーションのサーバーレスアーキテクチャへのスムーズな移行を妨げています。
非同期背景メトリックのデータが遅延または失われます。 データが要求の実行中に送信されない場合、データは、次の要求が送信される時点まで遅延され得るか、またはデータポイントが破棄される。
メトリックデータが同期して送信されると、レイテンシが増加します。 各リクエストが完了した後にFlushに似たメソッドを呼び出すと、リクエストのレイテンシが増加し、バックエンドサーバーで過度のワークロードが生成されます。
関数インスタンスの正常なシャットダウンをサポートするには、アプリケーションは接続を閉じ、プロセスを停止し、インスタンスが停止したときにステータスを報告する必要があります。 開発者は、Function Computeでインスタンスがいつリリースされるかを知りません。 さらに、関数インスタンスのリリースイベントに関する通知を送信するためのwebhookは提供されていません。
プログラミングモデル拡張
Function Computeは、前述の問題点に対処するためのランタイム拡張機能を提供します。 拡張機能は、PreFreezeフックとPreStopフックを既存のHTTPサーバーモデルに追加することで、HTTPサーバーの既存のプログラミングモデルを拡張します。 これにより、拡張開発者はHTTPハンドラーを使用して関数インスタンスのライフサイクルイベントを監視できます。
プレフリーズ
Function Computeが現在の関数インスタンスをフリーズすることを決定するたびに、function ComputeはHTTP GETリクエストを /pre-freezeパスに送信します。 拡張開発者は、インスタンスが凍結される前に指定された操作が実行されるようにロジックを実装します。 たとえば、インスタンスはメトリクスが送信されるまで待機します。 PreFreezeフックを実行する期間は、InvokeFunction操作を呼び出す期間に含まれません。
プレストップ
Function Computeが現在の関数インスタンスの停止を決定するたびに、function ComputeはHTTP GETリクエストを /pre-stopパスに送信します。 拡張開発者はロジックを実装して、インスタンスがリリースされる前に、データベース接続の終了、ステータスの報告、更新などの指定された操作が完了するようにします。
前提条件
関数が作成されます。 詳細については、「関数の作成」をご参照ください。
制限事項
PreFreezeフックとPreStopフックの入力パラメーターには、イベントパラメーターは含まれません。
PreFreezeフックとPreStopフックは値を返しません。 PreFreezeフックまたはPreStopフックに追加されて値を返すロジックは有効になりません。
すべてのランタイムでPreStopフックを設定できます。 ただし、Python、PHP、またはC# ランタイムでPreFreezeフックを設定することはできません。
Javaランタイムを使用する場合は、fc-java-coreをバージョン1.4.0以降に更新する必要があります。 それ以外の場合、PreFreezeフックまたはPreStopフックは使用できません。 詳細については、「HTTPハンドラー」をご参照ください。
カスタムコンテナーランタイムが非webサーバーモードの場合、設定したPreFreezeフックとPreStopフックは有効になりません。
関数がレスポンスを返すと、function Computeは関数インスタンスをフリーズします。 呼び出しが戻ったときに、すべての非同期プロセス、スレッド、およびコルーチンが実行されると仮定することはできません。 また、非同期で書き込まれたログが更新されると仮定することもできません。
PreFreezeおよびPreStopフックの設定
PreFreezeまたはPreStop呼び出しの課金は、InvokeFunction呼び出しの課金と同じです。 詳細については、「課金の概要」をご参照ください。
Function Computeコンソールでのフックの設定
Function Computeコンソールを使用して関数を作成する場合、PreFreezeフックとPreStopフックを設定できません。 機能を更新するときに、PreFreezeフックとPreStopフックを設定できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
関数ページで、変更した関数を見つけてクリックします。設定で、アクション列を作成します。
[機能設定の変更] ページのインスタンスライフサイクルフックセクションで、フックとタイムアウト期間を設定し、保存をクリックします。
説明各拡張機能のフックとタイムアウト期間を設定する必要があります。 フックの形式は [ファイル名].[拡張機能名] です。 たとえば、Pythonランタイムで関数を作成するときにPreStopフックをindex.preStopHandlerに設定した場合、ファイル名はindex.pyで、PreStop関数の名前はpreStopHandlerです。
拡張関数を設定した後、実行するコードに関数を実装します。
[コード] タブをクリックします。 コードエディタで、拡張関数のコードを入力します。
たとえば、PreStopフックを
index.preStopHandler
に設定した場合、preStopHandler関数を実装する必要があります。 Function Computeのさまざまなランタイムにライフサイクルフックを実装する方法の詳細については、「関数インスタンスのライフサイクルフック」をご参照ください。説明オンラインIDEは、PHP、Python、Node.js、およびカスタムランタイムでサポートされていますが、Java、Go、などのコンパイル済み言語のランタイムではサポートされていません。NET、またはカスタムコンテナーのランタイム。
コードエディターの上部でデプロイをクリックし、テスト機能をクリックします。
Serverless Devsを使用してフックを構成する
次のs.yaml
のサンプルコードを使用して、Serverless Devsを使用してPreFreezeとPreStopを設定できます。
codeUri: './code.zip'
......
instanceLifecycleConfig:
プレフリーズ:
ハンドラー: index.PreFreeze
タイムアウト:60
preStop:
handler: index.PreStop
タイムアウト: 60
拡張関数を無効にするには、拡張関数のHandler
パラメーターを空のままにします。 それ以外の場合、関数はデフォルトで更新されません。 たとえば、PreFreezeフックを無効にするには、次の設定に基づいて関数をデプロイおよび更新します。 この場合、PreFreezeフックのTimeout
パラメーターは無効です。
codeUri: './code.zip'
......
instanceLifecycleConfig:
プレフリーズ:
handler: ""
タイムアウト:60
preStop:
handler: index.PreStop
タイムアウト: 60
Function Computeのさまざまなランタイムにライフサイクルフックを実装する方法の詳細については、「関数インスタンスのライフサイクルフック」をご参照ください。
SDKを使用したフックの構成
SDKを使用して、拡張機能をデプロイおよび更新できます。 このセクションでは、関数の作成時にPreStopフックとPreFreezeフックを設定するためのSDKサンプルコードを取得する方法について説明します。
[CreateFunction] ページで、[デバッグ] をクリックしてOpenAPIポータルに移動します。
[パラメーター] タブで、関数の基本情報に基づいて [パラメーターのリクエスト] を設定します。
instanceLifecycleConfig
でPreStopフックとPreFreezeフックを設定できます。パラメーターを設定したら、[SDKサンプルコード] タブをクリックして、対応するプログラミング言語のSDKサンプルコードを取得します。
Function Computeのさまざまなランタイムにライフサイクルフックを実装する方法の詳細については、「関数インスタンスのライフサイクルフック」をご参照ください。
関数インスタンスのライフサイクルフック
次の表に、Function Computeのさまざまなランタイムでライフサイクルフックを実装する方法を示します。
環境情報 | ライフサイクルフックの実装方法 | 参照 |
Node.js | Node.jsを使用して、関数インスタンスのライフサイクルフックを実装します。 | |
Python | Pythonを使用して、関数インスタンスのライフサイクルフックを実装します。 | |
PHP | PHPを使用して、関数インスタンスのライフサイクルフックを実装します。 | |
Java | Javaを使用して、関数インスタンスのライフサイクルフックを実装します。 | |
C# | C# を使用して、関数インスタンスのライフサイクルフックを実装します。 | |
Go | Goを使用して、関数インスタンスのライフサイクルフックを実装します。 | |
カスタムランタイム | カスタムランタイムを使用して、関数インスタンスのライフサイクルフックを実装します。 | |
カスタムコンテナ | webサーバーモードが有効になっているカスタムコンテナランタイムを使用して、関数インスタンスのライフサイクルフックを実装します。 |
フックに関連するログの照会
インスタンスライフサイクルフックを設定し、フックのコードを実行した後、フックのログを照会できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
関数ページで、管理する関数をクリックし、ログタブをクリックします。
リクエストリストタブで、クエリするリクエストを見つけて、インスタンスIDをクリックし、SLSログ.
コピーしたインスタンスIDを使用して、すべてのライフサイクルフックの開始ログと終了ログを照会できます。 また、インスタンスIDとhookキーワードを使用して、
c-62833f38-20f1629801fa4bd ***** やPreStop
など、指定したフックの開始ログと終了ログを照会することもできます。開始ログと終了ログのリクエストIDに基づいてリクエストログを照会することもできます。 ユーザーログにリクエストIDが含まれていない場合は、アイコンをクリックしてコンテキストログを取得できます。
課金ルール
HTTPフックに送信されたリクエストの数に対しては課金されません。 拡張機能は、複数の同時リクエストが単一のインスタンスで実行されるシナリオにも適用できます。 同じインスタンスで複数の呼び出し要求が同時に実行された場合、すべての要求が実行された後、インスタンスが凍結される前にPreFreezeフックが呼び出されます。
次の図に示す例では、関数の仕様は1 GBです。 PreFreezeが開始するt1からRequest2が完了するt6までの期間を1sとする。 インスタンスの実行時間は、次の式に基づいて計算されます。t6 - t1。 消費されるリソースは、次の式に基づいて計算されます。1s × 1 GB = 1 CU。 課金の詳細については、「課金の概要」をご参照ください。