Cloud Run + Cloudflare CDNの構成で試したこと

Next.jsのフルスクラッチをCloud Runでデプロイ、CDNとしてCloudflareを使う。今回はCloud Runはデプロイ済みでCDNを設定するところから。

Cloud RunのCDNは選択肢がいろいろあるみたい。
(Cloudflare Workersを使ったやつもやってみたけど、うまくプロキシ出来なかったのとキャッシュ周りの実装がよくわからなかったので断念した。)

まず前提として、Cloudflareは自分で保有していないドメインに対してCDN適用できないのでCloud Run側でデフォルトで発行される*.run.appみたいなURLに対しては紐付けができない。そのためCloud Runのカスタムドメインマッピング機能を利用してCloud Runのサービスに独自ドメインを紐づけてやる。

Cloud Run側のカスタムドメインマッピングの設定は簡単にできた。Cloudflare側のCNAMEレコード追加も特に問題なし。設定が反映されるまで15 - 30分程度かかった。
※ 2024/11/23現在カスタムドメインマッピングはプレビュー機能のため本番環境での使用はおすすめしないと書いてある。

カスタムドメインでアクセスするとリダイレクトが繰り返し行われている旨のメッセージが出てアクセスできない。
ChatGPTに聞くと、
httpsアクセス → Cloudflare → httpアクセス → Cloud Run → https要求 → Cloudflare → http → Cloud Run → https要求 → ...
みたいにリダイレクトループになってしまっているとのこと。
Cloudflare側のSSL/TLSの暗号化モードを「フル」にすることでCloudflare, Cloud Run間の通信もhttpsになるとのこと。これで解決。
※ 上のカスタムドメインマッピングの設定前にこっちを先にする必要があるのかも?

カスタムドメインを設定してCloudflareのCDNを噛ませることが出来たので、それを回避されてしまうCloud RunのデフォルトのURLを無効にしたい。
こちらもプレビュー版だけど、gcloud CLIを使って可能。コンソール画面からはまだ出来ないみたい。

躓いたところ
- デフォルトURLの無効化をしてからカスタムドメインマッピングを設定しようとするとずっとローディング状態になって終わらない。デフォルトURLは有効な状態でカスタムドメインマッピングを行う必要がある。
- 開発環境とかの場合はZero Trustで認証かけたりすることもあると思うが、Zero Trustは設定したCNAMEレコードのプロキシをONにしないと効かない。
- プロキシONになってZero Trustが効いている状態でカスタムドメインマッピングの設定をするとこれも処理が終わらない?(時間かかっていただけなのか未検証。Zero Trust噛ませている場合は一旦プロキシOFFでCNAMEレコード登録したほうが良いかも?)

NEXT TODO: 躓いたところは証明書あたりが関係してそうなのでちょっと調べる必要がある。