このトピックでは、Function Compute でのコード開発に関連する基本的な概念について説明します。これには、ハンドラ、関数インスタンスのライフサイクルフック、ログが含まれます。
ハンドラ
関数の作成時にハンドラを指定する必要があります。Function Compute ランタイムは、リクエストを処理するために、このハンドラをロードして呼び出します。
組み込みランタイムのハンドラは、標準フォーマットに準拠しています。Object Storage Service (OSS)、Simple Log Service、ApsaraMQ for RocketMQ、EventBridge トリガーなど、さまざまなソースからのイベントを、これらのソースが関数を呼び出すたびに処理します。関数に HTTP トリガーを設定することもできます。この場合、関数を直接呼び出すために HTTP リクエストを送信するために使用できる Uniform Resource Identifier(URI)エンドポイントが提供されます。
カスタムランタイムまたはカスタムコンテナランタイムのハンドラは、組み込みランタイムのハンドラとは異なります。詳細については、「Web 関数」をご参照ください。
ハンドラを指定するには、ハンドラーFunction Compute コンソール で [ハンドラ] パラメータを設定します。詳細については、「関数の作成」をご参照ください。
関数インスタンスのライフサイクルフック
オンデマンドモードでは、受信リクエストを処理するためにインスタンスが自動的に作成されます。リクエストを処理していない場合、オンデマンドインスタンスは凍結されます。一定期間この凍結状態のままになっていると、破棄されます。インスタンスのライフサイクルフックを設定して、インスタンスのステータスが変化したときにインスタンスに対してコールバック操作を実行できます。Function Compute のすべてのタイプのランタイムは、[初期化] フックと [PreStop] フックの両方をサポートしています。詳細については、「インスタンスライフサイクルの設定」をご参照ください。
初期化フック
Initializer フックは、インスタンスが正常に起動した後、ハンドラが実行される前に実行されます。Function Compute は、Initializer フックがインスタンスごとに 1 回だけ呼び出され、正常に完了することを保証します。Initializer フックの実行が失敗した場合、その動作は呼び出しタイプによって異なります。同期呼び出しの場合、システムは対応するエラーを返します。非同期呼び出しの場合、ユーザーが設定したリトライポリシーに基づいてリトライが実行されます。
時間のかかるサービスロジックを初期化フックに組み込むことができます。これにより、関数が呼び出されるたびにこのようなサービスロジックを実行する必要がなくなり、関数のレイテンシが短縮されます。時間のかかるサービスロジックの例としては、接続プールの作成、関数依存関係のロード、その他のデータベース関連タスクの実行などがあります。
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() | |
Golang | log.Println() | fctx, _ := fccontext.FromContext(ctx) fctx.GetLogger().Info() |
プログラミング言語の組み込みログ出力文を使用して出力されたログと、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__: FCLogs:myFunction
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 の組み込みランタイムは、Debian 9 LTS、Debian 10 LTS、Debian 11 LTS、または Debian 12 LTS 上で動作し、x86_64 アーキテクチャとのみ互換性があります。
レイヤーまたは環境変数を設定することで、オペレーティングシステム (OS) をカスタマイズできます。タイムゾーンを例に取ります。Function Compute はデフォルトで UTC 時間で動作しますが、環境変数 TZ を Asia/Shanghai に設定すると、Function Compute は UTC + 08:00 時間で動作します。レイヤーと環境変数の設定の詳細については、「レイヤーの設定」および「環境変数の設定」をご参照ください。