2日溶かした。
k8sのingress-controllerの下でサーバーを動かしていたところ、Cloudflare Workers経由のhttpsリクエストに対してだけ308を返す状況に陥った。
手元からcurlでhttpsリクエストを送るとちゃんと200が返ってきていて、何故かCloudflare Workersからfetchするときだけredirect loopに陥る。
原因
- HTTPSを送っているつもりがHTTPでリクエストを送っていた。
https://で始まるURLを指定しても、CloudflareのEncryption Modeの設定次第ではhttpで送られる。
今回発生した事象の流れは以下の通り。
- Cloudflare Workersでfetch APIを使ってhttpsでデータを取得しようとする。
- Encryption Modeの設定がFlexになっているとプロトコルがhttpsからhttpに自動で変換される。
- k8sのIngressがリクエストを受け取るがhttpなのでhttpsにリダイレクトするよう308を返す。
- 2に戻るので無限ループ
同じ罠に嵌る人が多いのかGoogleで調べると上の方に公式のドキュメントが出てくるが、
k8s側の設定を疑っていてしっかり読んでいなかった。