このトピックでは、ハンドラー、インスタンスライフサイクルフック、ログ、エラー処理など、Function Computeのコーディングに関する基本的な情報について説明します。
ハンドラー
関数を作成するときは、関数のハンドラーを指定する必要があります。 Function Computeのランタイムは、リクエストを処理するハンドラーを読み込み、呼び出します。
標準ランタイムのハンドラは1つの形式のみに従います。 ハンドラーを使用して、Object Storage Service (OSS) トリガー、Simple Log Serviceトリガー、ApsaraMQ for RocketMQトリガー、EventBridgeトリガーなど、さまざまなイベントソースからのイベントリクエストを処理できます。 HTTPトリガーを作成し、HTTPトリガーによって提供されたURIを使用して関数をトリガーすることもできます。
カスタムランタイムのリクエストハンドラーは、標準ランタイムのリクエストハンドラーとは異なります。 詳細については、「」をご参照ください。
function ComputeコンソールのRequest handlerパラメーターを使用して、関数のハンドラーを設定できます。 詳細については、「関数の作成」をご参照ください。
関数インスタンスのライフサイクルフック
オンデマンドインスタンスは、リクエストに基づいて自動的に作成できます。 オンデマンドインスタンスは、リクエストを処理していないときに凍結され、一定期間凍結された後に破棄されます。 インスタンスのライフサイクルフックを設定して、インスタンスのステータスが変更されたときにインスタンスに対してコールバック操作を実行できます。 Function Computeのすべてのタイプのランタイムは、InitializerフックとPreStopフックの両方をサポートしています。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。
初期化フック
Initializerフックは、関数インスタンスが開始された後、ハンドラーが実行される前に呼び出されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 たとえば、初めてInitializerフックの呼び出しに失敗した場合、システムはInitializerフックが正常に呼び出されるまでInitializerフックを再試行し、ハンドラーを実行します。
データベース関連のシナリオでは、接続プールの作成や関数依存関係ライブラリの読み込みのためのサービスロジックなど、時間のかかるサービスロジックをInitializerフックに追加できます。 これにより、関数が呼び出されるたびにサービスロジックが繰り返し実行されるのを防ぎ、関数の待ち時間を短縮します。
PreStopフック
関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックを使用して、インスタンスが破棄される前に指定された操作を実行できます。 たとえば、PreStopフックを設定して、インスタンスが破棄される前にデータベース接続が閉じられ、状態がレポートおよび更新されるようにすることができます。
ログレコード
Function Computeの関数ログを保存するようにサービスレベルのLogstoreを設定する必要があります。 詳細については、「ロギング機能の設定」をご参照ください。
デフォルトでは、サービスの作成時にログ機能を有効にすると、Function ComputeはサービスのLogstoreを自動的に構成します。
Function ComputeはSimple Log Serviceと統合して、関数呼び出しのレコードと関数コードで印刷されたログをLogstoreに保存します。 Function Computeが提供するログステートメントを使用して関数ログを記録し、デバッグとトラブルシューティングを容易にすることができます。 次の表に、さまざまなプログラミング言語のログ印刷ステートメントを示します。
プログラミング言语 | 組み込みログ印刷文のプログラミング言語 | Function Computeが提供するログステートメント | 関連ドキュメント |
Node.js | console.log() | context.logger.info() | |
Python | print() | logging.getLogger().info() | |
Java | System.out.println() | context.getLogger().info() | |
PHP | echo "" . PHP_EOL | $GLOBALS['fcLogger']->info() | |
C# | Console.WriteLine("") | context.Logger.LogInformation() | |
Golang | log.Println() | fctx, _ := fccontext.FromContext(ctx) fctx.GetLogger().Info() |
プログラミング言語の組み込みログ印刷ステートメントを使用して印刷されたログは、収集され、ログストアに保存されます。 Function Computeが提供するログステートメントを使用して印刷されたログには、リクエストIDがタグ付けされているため、ログのフィルタリングが容易になります。
# Print logs by using the built-in log printing statements of a programming language.
# print('hello world')
message: hello world
# Print logs by using the logging statements provided by Function Compute.
# logger.info('hello world')
message: 2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
ログ要素
関数実行ログには、サービス名、関数名、現在のバージョン、エイリアス、およびコードログが含まれます。
関数実行ログのデータ構造例を次に示します。
__source__:
__tag__:__receive_time__: 1584072413
__topic__: myService
functionName: myFunction
message: 2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
qualifier: LATEST
serviceName: myService
versionId:
関数の実行が開始されると、システムは
FC Invoke Start RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a65 0
を出力します。関数の実行が完了すると、システムは
FC Invoke End RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a65 0
を出力します。
オペレーティングシステム
Function Computeの標準ランタイムには、Debian 9 LTSとDebian 10 LTSの2つのオペレーティングシステムがあります。 どちらのオペレーティングシステムもx86_64アーキテクチャのみをサポートします。