WorkflowsからのHTTPリクエストがタイムアウトした時に調べたこと

WorkflowsからのHTTPリクエストがタイムアウトした時に調べたこと

Clock Icon2024.06.15

発生した事象

  • WorkflowsからCloud Functions関数をHTTPリクエストで呼び出して処理をしていたところ5分でタイムアウトになった
  • Cloud Functions関数のタイムアウト上限は20分にしていた

原因

  • WorkflowsのHTTPリクエスト(http.get,http.post,request)のタイムアウトのデフォルト値は5分(300秒)

経緯とわかったこと

経緯

WorkflowsのHTTPリクエスト方法のリファレンスを読んで、Cloud Functions関数へのHTTPリクエスト実装していました。
前述のリファレンスのタイムアウトに関しては以下の記載があり

TIMEOUT_IN_SECONDS: 省略可。例外がスローされるまでに、リクエストを実行できる時間(秒)。最大値は 1,800 秒です。

※引用:https://cloud.google.com/workflows/docs/http-requests

タイムアウト値の設定を省略した場合は最大1800秒まで待機するものと思い込んでおりました。

起きた事象

10分程度かかるCloud Functions関数をWorkflowsからhttp.getで呼び出したところ関数の処理開始から5分後にWorkflows側で以下のエラーが発生しました。

request timed out
in step "processFunctions", routine "main", line: 4
{
"message": "request timed out",
"tags": [
"TimeoutError",
"OSError"
]
}

わかったこと

WorkflowsからHTTPリクエストを実行するときに用いるライブラリ http.gethttp.postrequestのタイムアウトのデフォルト値は300秒でした。
http.gethttp.postrequestのリファレンスを調べたところ、timeoutに関して以下の記載がありました。

The request timeout, in seconds (default: 300.0). If the request takes longer than the timeout, a TimeoutError is raised. The maximum allowed timeout is 1800 seconds.
リクエスト・タイムアウトを秒単位で指定します (デフォルト: 300.0)。リクエストにタイムアウト以上の時間がかかると、TimeoutErrorが発生します。最大許容タイムアウトは1800秒です。(DeepL翻訳)

対応策

300秒以上かかるHTTPリクエストを行う場合はtimeoutフィールドに300以上の数字を設定します。以下は設定例です。

main:
  steps:
    - processFunctions:
        call: http.post
        args:
          url: "関数のURL"
          auth:
            type: OIDC
          timeout: 500
        result: processResul

上記yamlの実装では、指定した関数へのHTTPリクエストは500秒がタイムアウト上限となります。

反省点

Workflowsのリファレンスの中で、HTTPリクエスト方法の解説だけを読んで理解したつもりになってしまい、
実際にHTTPリクエストを実行するときに用いるhttp.getなどの標準ライブラリの仕様を確認しないまま使ってしまっていたため詰まってしまいました。最大値は1800秒とこちらに記載があったのでtimeoutフィールド省略時のタイムアウト上限は1800秒になると思い込んでいたことも原因です。
今後はもっと丁寧にリファレンスを追って実装をしていきたいと思います。

参考

HTTPリクエストを行う
http.get
http.post
http.request

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.