Cloud Functionsのタイムアウトについて

この記事は GMOアドマーケティング Advent Calendar 2021 2日目の記事です。

こんにちは。
GMOアドマーケティングの@zakisanbaimanです。
業務でGoogle Cloud Functionsを使っていますが、タイムアウト対策を行ったので共有しておきます。

Cloud Functionsとは

GCPのサーバレスバッチのサービスであり、関数の実行時間に対して従量課金されるFunctions as a Service(FaaS)です。
AWSで言うところのLambdaですね。

タイムアウトの挙動確認

環境

  • ランタイム: Node.js 14
  • リージョン: us-central1
 

Cloud Functions設定

▼タイムアウトは5秒に設定

正常時

▼5秒タイムアウトのところ、4秒で処理を完了させる   ▼正常にレスポンスが返ってくる ▼タイムアウト以内に処理を正常終了できています

 

タイムアウト時

▼5秒タイムアウトのところ、6秒で処理を完了させる ▼呼び元ではエラーとなる ▼5秒経過した時点でタイムアウトとなり、処理が中断されています。 タイムアウトはデバッグレベル(λ)として出力されるため気づきにくいです。

対策

1. タイムアウト設定を延ばす

タイムアウト自体は関数の編集画面で設定することができます。

2. Cloud Monitoringでタイムアウトを通知

タイムアウトしたことに気づくには「timeout」の文字列がログに出力されたら通知するという仕組みが良いかなと思います。
まずGCPコンソール→ロギング→ログベースの指標を選択し、「指標を作成」します。
検索条件にヒットした件数を指標化したいため、指標タイプは「Counter」を選択します。
また、フィルタには「timeout」の文字列が引っかかるように部分一致で条件指定します。
  指標を作成したら、それに基づいて通知を作成します。

Metricには先程作成した指標がセットされていると思います。
他の設定は全てデフォルトでOKです。
Condition: is above、Threshold: 0となっているため、条件一致したログ件数が対象期間内で0より大きければ通知するという設定になります。 SAVEした後は通知先をメールやSlackなどに設定するだけです。

3. 再実行オプションを使う

Cloud Function作成時、トリガータイプによっては再実行オプションが利用できます。
※HTTPトリガーのみ、再実行オプションが利用できないようです。

最後に

Cloud Functionsのタイムアウト対応する中でいくつか方法があったので共有させて頂きました。
バッチ〜ロギング〜通知までGCP内で完結できるのは非常に楽だったので、引き続きエラー周りを整備していきたいと思います。
最後までお読み頂きありがとうございました。

参考

GCP公式ドキュメント 明日はmaykeartさんによる「PHPカンファレンス2021」に関しての記事です。
引き続き、GMOアドマーケティング Advent Calendar 2021 をお楽しみください!   ■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://note.gmo-ap.jp/n/n02cbeb6edb0d ■noteページ ~ブログや採用、イベント情報を公開中!~
https://note.gmo-ap.jp/