このトピックでは、ハンドラー、インスタンスライフサイクルフック、ログレコード、エラー処理など、Function Computeのコーディングに関する基本的な情報について説明します。
ハンドラ
関数を作成するときは、関数のハンドラーを指定する必要があります。 Function Computeランタイムは、リクエストを処理するハンドラーを読み込み、呼び出します。 ハンドラは次のタイプに分類されます。
イベントハンドラー
イベントハンドラーは、OSSトリガー、Log Serviceトリガー、Message Queue for Apache RocketMQトリガーなど、HTTPトリガー以外のさまざまなイベントソースによってトリガーされたイベントリクエストを処理するために使用されます。
HTTPハンドラー
HTTPハンドラーは、HTTPトリガーによってトリガーされるリクエストを処理します。 詳細については、「HTTPトリガーの設定と使用」をご参照ください。
Function ComputeコンソールのRequest handlerパラメーターを使用して、関数のハンドラーを設定できます。 詳細については、「関数の作成」をご参照ください。
関数インスタンスのライフサイクルフック
プロビジョニングされたインスタンスは、ビジネス要件に基づいて作成できます。 プロビジョニングされたインスタンスは、アイドル状態になると凍結され、一定期間凍結された後に破棄されます。 インスタンスのライフサイクルフックを設定して、インスタンスのステータスが変更されたときにインスタンスに対してコールバック操作を実行できます。 Function Computeでは、Initializer hooks、PreFreeze hooks、PreStop hooksのライフサイクルフックを設定できます。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。
初期化フック
Initializerフックは、関数インスタンスが開始された後、ハンドラが実行される前に呼び出されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 たとえば、初めてInitializerフックの呼び出しに失敗した場合、システムはInitializerフックが正常に呼び出されるまでInitializerフックを再試行し、ハンドラーを実行します。
データベース関連のシナリオでは、接続プールの作成や関数依存関係ライブラリの読み込みのためのサービスロジックなど、時間のかかるサービスロジックをInitializerフックに追加できます。 これにより、関数が呼び出されるたびにサービスロジックが繰り返し実行されるのを防ぎ、関数の待ち時間を短縮します。
PreFreezeフック
関数インスタンスが凍結される前に、PreFreezeフックが実行されます。 PreFreezeフックを使用して、インスタンスがフリーズする前に指定した操作を実行できます。 たとえば、PreFreezeフックを設定して、インスタンスがフリーズする前にメトリックが送信されるようにすることができます。
PreStopフック
関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックを使用して、インスタンスが破棄される前に指定された操作を実行できます。 たとえば、PreStopフックを設定して、インスタンスが破棄される前にデータベース接続が閉じられ、状態がレポートおよび更新されるようにすることができます。
ログレコード
サービスのLogstoreを設定すると、Function Computeは関数ログをLogstoreに保存します。 詳細は、「ロギングの設定」をご参照ください。
デフォルトでは、コンソールでサービスを作成するときに、Function ComputeがLogstoreを設定します。
Function Computeは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() |
プログラミング言語の組み込みログ印刷ステートメントを使用して印刷されたログは、収集され、ログストアに保存されます。 ログフィルタリングを容易にするために、Function Computeが提供するログステートメントを使用して印刷される各ログには、リクエストIDがタグ付けされます。
# Log printed by using the built-in log printing statements of a programming language
# print('hello world')
message: hello world
# Log printed 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のエラーは、HandledInvocationError
とUnhandledInvocationError
の2種類に分類されます。
HandledInvocationError
Node.jsの
callback
パラメーターによって返されるエラーのみがHandledInvocationError
型です。 エラー情報は応答に含まれる。'use strict'; module.exports.handler = function(event, context, callback) { console.log('hello world'); callback('this is error', 'hello world'); }
エラー情報を含むレスポンスの例を次に示します。
{"errorMessage":"this is error"}
UnhandledInvocationError
callbackパラメーターによって返されないエラーは、
UnhandledInvocationError
型です。UnhandledInvocationError
エラーのスタックトレース
がログに出力されます。 ログを表示して、コンテキストに基づいてスタックトレース
を見つけることができます。
オペレーティングシステム環境
Function ComputeはDebian9 LTSオペレーティングシステムを使用します。 x86_64アーキテクチャのみがサポートされています。
レイヤーまたは環境変数を設定することで、オペレーティングシステム環境を変更できます。 たとえば、タイムゾーンを変更するように環境変数を設定できます。 デフォルトでは、関数インスタンスはUTC時間で実行されます。 環境変数TZの値をAsia/Shanghai
に設定した場合、Function ComputeのタイムゾーンはUTC + 8に変わります。 詳細については、「レイヤーの管理」および「環境変数」をご参照ください。