このトピックでは、関数インスタンスのヘルスチェックの背景情報、制限事項、および動作について説明します。また、Function Compute コンソールでヘルスチェックを設定する方法についても説明します。
背景情報
カスタムランタイムまたはカスタムコンテナイメージを使用する関数は、不安定になり、関数インスタンスが異常な動作をすることがあります。これに対処するために、Function Compute で定期的なヘルスチェックを設定できます。これにより、リクエストが異常なインスタンスにルーティングされるのを防ぎ、リクエストの失敗を回避できます。
制限事項
ヘルスチェックは、Web 関数 および GPU 関数でのみサポートされています。
ヘルスチェックの仕組み
インスタンスの起動動作
関数にヘルスチェックを設定した場合、インスタンスは次のように起動します。
関数に初期化フックがある場合、それが最初に実行されます。それ以外の場合、プラットフォームはすぐに初回のヘルスチェックを実行します。
初回のヘルスチェックが成功すると、インスタンスは正常とマークされ、定期的なヘルスチェックサイクルが開始されます。チェックが失敗した場合、インスタンスの起動は失敗し、ヘルスチェックプロセスは停止してエラーが返されます。
連続したヘルスチェックの失敗回数が、設定された失敗回数の上限に達すると、インスタンスは異常と見なされます。その後、Function Compute は、リクエストを他の正常なインスタンスにルーティングしようと試みます。
異常なインスタンスに対する連続したヘルスチェックの成功回数が、設定された検出しきい値に達すると、そのインスタンスは再び正常な状態になります。
検出しきい値 と 失敗回数の上限 の設定方法については、「コンソールでヘルスチェックを設定する」をご参照ください。
1 回のヘルスチェックの動作
Function Compute は、次のように 1 回のヘルスチェックを実行します。
関数の設定に基づいて、指定された HTTP パスに GET リクエストを送信します。
GET リクエストがタイムアウトする前に 200 から 399 までの HTTP ステータスコードを返した場合、チェックは成功します。それ以外の場合は失敗します。
ヘルスチェック失敗後のスケジューリング
関数インスタンスが異常になると、Function Compute はリクエストを他のインスタンスにルーティングしようと試みます。
Function Compute がリクエストのルーティングに成功した場合、新しく正常な関数インスタンスがそのリクエストを実行します。
Function Compute が時間内にリクエストを別のインスタンスにルーティングできない場合、ヘルスチェックの失敗エラーが返されます。次の呼び出しでは、リクエストを新しい関数インスタンスに直接スケジューリングしようと試みます。
コンソールでのヘルスチェックの設定
このセクションでは、関数のヘルスチェックを設定する方法について説明します。この例では、Node.js 18 ランタイム環境 を備えた Web 関数 を使用します。
ステップ 1:関数の作成
Function Compute コンソールにログインし、左側のナビゲーションバーで を選択します。
トップナビゲーションバーでリージョンを選択し、関数リスト ページで 関数を作成 をクリックします。
関数を作成 ページで Web 関数 を選択し、カスタム実行時 で を選択した後、作成 をクリックします。
関数詳細ページで、コード タブを選択します。コードエディタで関数コードを編集し、デプロイメントコード をクリックします。
以下は
index.jsのサンプルコードです。'use strict'; // Constants const PORT = 9000; const HOST = '0.0.0.0'; const REQUEST_ID_HEADER = 'x-fc-request-id' const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(bodyParser.raw()); app.get('/readyz', (req, res) => { console.log(`receive health check`); res.status(200); console.log(`i am ready`); res.send('i am ready\n'); }); // invocation app.post('/invoke', (req, res) => { var rid = req.headers[REQUEST_ID_HEADER] console.log(`FC Invoke Start RequestId: ${rid}`) res.send('OK'); console.log(`FC Invoke End RequestId: ${rid}`) }); var server = app.listen(PORT, HOST); console.log(`Running on http://${HOST}:${PORT}`); server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeout上記のコードでは、
readyzがヘルスチェックハンドラです。これは /readyz パスに送信された HTTP GET リクエストを処理します。ステップ 2:ヘルスチェックの設定 を完了すると、Function Compute がこのハンドラを定期的に実行してインスタンスのヘルス状態をチェックするように設定できます。Function Compute がご利用の関数インスタンスが異常であると判断した場合、リクエストを他の正常なインスタンスにルーティングしようと試みます。Function Compute がこれに失敗した場合、ヘルスチェックの失敗に関連するエラーが返されます。
ステップ 2:ヘルスチェックの設定
Function Compute コンソールにログインし、左側のナビゲーションバーで を選択します。
上部のナビゲーションバーでリージョンを選択します。Functions ページで、前のステップで作成した関数をクリックします。
関数詳細ページで、設定 タブを選択します。 詳細設定 の右にある 変更 をクリックします。 詳細設定 パネルで、ヘルスチェック スイッチを有効にし、次の表の説明に従ってパラメーターを設定し、その後 デプロイ をクリックします。
パラメーター
説明
リクエストパス
Function Compute がヘルスチェックを実行するために HTTP GET リクエストを送信するパス。値は
/で始まる必要があります。初回検出の遅延
インスタンスの起動後、最初のヘルスチェックが実行されるまでの遅延時間 (秒)。
検出間隔
ヘルスチェック間の間隔 (秒)。
タイムアウト期間
ヘルスチェック応答のタイムアウト時間 (秒)。この期間内に応答が受信されない場合、チェックは失敗します。
失敗回数の上限
インスタンスが異常とマークされるまでの、連続したヘルスチェックの失敗回数。
検出しきい値
異常なインスタンスを再び正常とマークするために必要な、連続したヘルスチェックの成功回数。
ステップ 3:ヘルスチェックの検証
関数設定ページで、コード タブを選択し、関数のテスト をクリックして結果を表示します。
ステップ 1 のサンプルコードを使用すると、関数インスタンスはヘルスチェックに合格し、OK を返します。
コード内のヘルスチェックハンドラを次のスニペットで置き換え、デプロイメントコード をクリックします。コードがデプロイされた後、もう一度 関数のテスト をクリックして結果を確認します。
変更後のコードは次のとおりです。
app.get('/readyz', (req, res) => { console.log(`receive health check`); res.status(500); console.log(`i am not ready`); res.send('i am not ready\n'); });これで、ヘルスチェックは常にステータスコード 500 で失敗するようになります。関数を再度呼び出すと、次の応答が返されます。
{ "RequestId": "1-65081d42-e4895cbc7d6252bda643****", "Code": "FunctionNotStarted", "Message": "The function http server cannot be started. check function health failed with status code: 500 " }
詳細情報
コンソールに加えて、Function Compute は API を使用したインスタンスのヘルスチェック設定もサポートしています。詳細については、「ヘルスチェック設定の更新」をご参照ください。