このトピックでは、ハンドラ、関数インスタンスのライフサイクルフック、ロギング、エラー処理など、Function Compute におけるコード開発の基本概念について説明します。
ハンドラ
関数の作成時にハンドラを指定する必要があります。Function Compute ランタイムは、このハンドラをロードして呼び出し、リクエストを処理します。ハンドラは次のタイプに分類されます。
イベントハンドラ
イベントハンドラは、HTTP トリガー以外のさまざまなイベントソースからのリクエストを処理するために使用されます。このようなイベントソースには、Object Storage Service (OSS)、Simple Log Service、ApsaraMQ for RocketMQ トリガーなどがあります。
HTTP ハンドラ
HTTP ハンドラは、HTTP リクエストを処理するために使用されます。詳細については、「HTTP トリガーの設定と使用」をご参照ください。
関数のハンドラを設定するには、Function Computeコンソール 内の [ハンドラ] パラメータを指定します。詳細については、「関数の作成」をご参照ください。
関数インスタンスのライフサイクルフック
オンデマンドモードでは、インスタンスは必要に応じて自動的に作成されます。リクエストを処理していない場合、オンデマンドインスタンスは凍結されます。一定期間凍結状態のままになっていると、破棄されます。インスタンスのライフサイクルフックを設定して、インスタンスのステータスが変化したときにコールバック操作を実行できます。Function Compute では、[初期化子]、[prefreeze]、[prestop] のライフサイクルフックを設定できます。詳細については、「関数インスタンスのライフサイクル」をご参照ください。
[初期化子フック]
初期化子フックは、インスタンスが初期化された後、ハンドラが実行される前に呼び出されます。Function Compute は、初期化子フックがインスタンスのライフサイクル全体で一度だけ実行されることを保証します。実行に失敗した場合、現在のインスタンスは破棄され、新しいインスタンスが作成されて実行が再試行されます。
時間のかかるサービスロジックを初期化子フックに組み込むことができます。これにより、関数が呼び出されるたびにこのようなサービスロジックを実行する必要がなくなり、関数のレイテンシが短縮されます。時間のかかるサービスロジックの例としては、接続プールの作成、関数依存関係のロード、その他のデータベース関連タスクの実行などがあります。
[prefreeze フック]
PreFreeze フックは、関数インスタンスが凍結される前に実行されます。このフックを使用して、メトリックが正常に送信されるのを待つなど、インスタンスが凍結される前に必要な操作を実行できます。
[prestop フック]
PreStop フックは、関数インスタンスが破棄される前に実行されます。このフックを利用して、インスタンスが破棄される前に特定のタスクを実行できます。たとえば、PreStop フックを設定して、インスタンスが破棄される前にデータベース接続が閉じられ、ステータスが報告および更新されるようにすることができます。
ログ管理
Function Compute の関数ログを格納するには、サービスレベルのログストアを設定する必要があります。詳細については、「ロギングの設定」をご参照ください。
Function Compute コンソールでサービスを作成するときにロギング機能を有効にすると、ログストアが自動的に設定されます。
Function Compute は Simple Log Service と統合されており、関数の呼び出しログと関数コードに出力されるログをログストアに格納します。Function Compute が提供するログ出力文を使用して関数ログを記録できます。これにより、デバッグとトラブルシューティングが容易になります。次の表に、さまざまなプログラミング言語の組み込みログ出力文と、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 のタグが付けられます。
# プログラミング言語の組み込みログ出力文を使用して出力されたログ
# print('hello world')
message: hello world
# 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-1682a2f3a650
を出力します。関数の実行が終了すると、システムは
FC Invoke End RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650
を出力します。
エラー処理
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
HandledInvocationError
エラーとして分類されるエラー以外のすべてのエラーは、UnhandledInvocationError
カテゴリに分類されます。stackTrace
プロパティは、UnhandledInvocationError
エラーのスタックトレースをログに出力します。ログを参照して、コンテキストに基づいて対応するstackTrace
を見つけることができます。
オペレーティングシステム環境
Function Compute は、実行に Debian 9 LTS を使用します。サポートされているアーキテクチャは x86_64 のみです。
レイヤーまたは環境変数を設定することで、オペレーティングシステム環境を変更できます。たとえば、環境変数を設定してタイムゾーンを変更できます。デフォルトでは、関数インスタンスは UTC で実行されます。環境変数 TZ の値を Asia/Shanghai
に設定すると、Function Compute のタイムゾーンは UTC + 08:00 に変更されます。詳細については、「レイヤーの管理」および「環境変数」をご参照ください。