コンテンツに移動
デベロッパー

Google Cloud Functions のアンチパターンを回避する(第 3 回): アウトバウンド接続を正しく確立する方法

2021年11月16日
Google Cloud Japan Team

※この投稿は米国時間 2021 年 11 月 4 日に、Google Cloud blog に投稿されたものの抄訳です。

編集者注: 今後数週間にわたり、Google Cloud Functions の関数を記述するためのベスト プラクティスに注目するブログ投稿シリーズを公開していきます。これらのベスト プラクティスは、サポートチームがよく受ける質問や、よく見かける誤解を基にしています。  こうした問題をここでは「アンチパターン」と呼び、これらを回避する方法をご紹介します。  この記事は、そのシリーズの第 3 回です。

シナリオ

例えば、トリガー イベントに応答してなんらかのアウトバウンド接続を行う Cloud Functions 関数があり、関数が HTTP(S) POST リクエストを行い、ログに 500 エラーで失敗したとします。

よくある根本的な問題

Cloud Functions 関数でアウトバウンド接続の呼び出しを行う際に明示的なタイムアウト制限を設定しておらず、関数全体の実行時間を使い果たしてしまいました。関数全体のタイムアウト時間はデフォルトの 60 秒から最大 540 秒までさまざまに設定されているものの、アウトバウンド接続の呼び出しには制限を設けていないケースをよく見かけます。

調べる方法

「自分のユースケースは何か?」を見極める必要があります。目標はエラーレートを低くすることでしょうか?それともレイテンシを低くすることでしょうか?

エラーレートを下げることがより重要な場合は、関数のタイムアウトを最大の 540 秒に設定したうえで、関数の実行時間が許す限りアウトバウンド接続を手動で再試行します。なお、Google API を使用している場合は、デフォルトで接続を再試行するロジックが組み込まれているため、独自の実装は必要はありません。一例として Cloud Storage のデフォルトの再試行戦略と可能な構成についてご覧ください。しかし、再試行機能が組み込まれていないサードパーティのライブラリを使用している場合は、エラーをどのように処理するかを決定しなければなりません。Cloud Tasks を利用するのも選択肢の一つです。例えば、アウトバウンド リクエストが「ファイア アンド フォーゲット」シナリオ(レスポンスに基づいて何かアクションを起こすことを計画していない)であれば、Cloud Tasks を使ってアウトバウンド リクエストをスケジュールできます。この方法では、Cloud Tasks の再試行セマンティクスに依存できます。

ユーザー エクスペリエンスを最適化する必要があるなど、レイテンシの低減がより重要な場合は、Pub/Sub や Cloud Tasks を使用して、呼び出し元に適切なレスポンスを送信し、別の Cloud Functions 関数にリクエストを処理させることで、「呼び出しをオフロード」できます。例えば、ユーザーが公共料金の請求書のコピーをリクエストできる chatbot アプリがあるとします。この場合、ダウンロード リンクを取得するためにアウトバウンド呼び出しを行う Cloud Functions 関数を chatbot からトリガーするやり方が考えられます。例えば、生成に時間がかかることがわかっている公共料金の請求書のコピーをお客様から求められたとします(例えば、コスト削減のヒントとなる詳細な使用レポートと一緒になっている公共料金の請求書などです)。Cloud Functions 関数から Cloud Tasks を呼び出し、ダウンロード リンクを生成して準備ができた時点でお客様にメールを送信するタスクを設定します。一方で、詳細なレポートが出来上がったらメールで送ることをお客様に伝える応答を chatbot に返します。

アウトバウンド接続呼び出しをオフロードする方法

以下は、Cloud Functions 関数(chatbot に応答する機能など)を使って、公共料金の請求書のダウンロード リンクを生成するための HTTP Cloud Functions 関数を呼び出す Cloud Tasks タスクを作成する例です。なおこの例では、追加の構成が必要です。特に、タスクのキューとサービス アカウントの権限を構成する必要があります。「その他の役立つヒント」を参照してください。

以下は、chatbot と(理論的に)やり取りできる Cloud Functions 関数のコードです。次の関数「createABackgroundTask」は、Cloud Tasks タスクを作成し、その関数を呼び出すことができるサービス アカウントを指定します。

読み込んでいます...

以下は、タスクによって起動される Cloud Functions 関数のコードです。この例では、「generateDownloadLink」は認証済みの関数です。

読み込んでいます...

その他の役立つヒント

- Cloud デベロッパー アドボケイト Sara Ford

- テクニカル ソリューション エンジニア Martin Skoviera

投稿先