こんにちは。
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秒で処理を完了させる
1 2 3 4 5 6 7 8 9 10 11 12 13 |
exports.helloWorld = (req, res) => { let message = req.query.message || req.body.message || 'Hello zaki01'; // 4秒待機 sleep(4000).then( () => res.status(200).send(message) ) }; const sleep = (time) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve() }, time) }) } |
1 2 |
$ curl https://hogehoge.cloudfunctions.net/zaki01 Hello zaki01 |
タイムアウト時
▼5秒タイムアウトのところ、6秒で処理を完了させる
1 2 3 4 5 6 7 8 9 10 11 12 13 |
exports.helloWorld = (req, res) => { let message = req.query.message || req.body.message || 'Hello zaki01'; // 6秒待機 sleep(6000).then( () => res.status(200).send(message) ) }; const sleep = (time) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve() }, time) }) } |
1 2 |
$ curl https://hogehoge.cloudfunctions.net/zaki01 Error: could not handle the request |

対策
1. タイムアウト設定を延ばす
タイムアウト自体は関数の編集画面で設定することができます。
2. Cloud Monitoringでタイムアウトを通知
タイムアウトしたことに気づくには「timeout」の文字列がログに出力されたら通知するという仕組みが良いかなと思います。まずGCPコンソール→ロギング→ログベースの指標を選択し、「指標を作成」します。

また、フィルタには「timeout」の文字列が引っかかるように部分一致で条件指定します。


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

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/