firebase hostingのメンテナンスモードを考える
firebase hostingを利用しているサービスでメンテナンスモードの実装を考えた結果をまとめる。
理想
- SEO的に503 service unavailable を返したい
- firebaseの機能だけでやりたい(cloud runとか使わない)
- 全アクセスを503ページへ
tl;dr
SPAモードのhostingでいい感じに503を返す方法がない。soft503で雰囲気を出すしかないっぽい。*1
たぶんhard503を出そうと思うとcloud runとかを使ってステータスコード503のレスポンスを作って返すしかなさげ。
とりあえずindex.html
の代わりに出したいページ(例:503.html
)を出すために雑にindex.html
にリダイレクトしてるものを503.html
に置き換えるとキャッシュされてしまった結果サービス再開のタイミングが作業が終わってキャッシュが消えた時になってしまうので、直接503.html
をステータス200
で返してはいけない。
またMDN見てるとRetry-After
ヘッダーを設定してやるのがベターらしい
設定
前提として対象のサービスはアプリケーションとサービストップページでドメインを分けていて、サービストップページだけ検索エンジンに登録されればいいかという構成。
そして色々考えた結果、index.html
の代わりに503.html
がキャッシュされてしまう事だけは避けたかったので以下の事を妥協。
- 503ページがステータスコード
200
で返ることを受け入れる - メンテナンスの度にruleを書き換えてデプロイする
設定したredirectルール
追加した部分以外を省略すると、以下のredirect設定を追加した。
{ "redirects": [ { "source": "/", "destination": "/503.html", "type": 307 }, { "source": "**/!(*.html|*.ico|*.png|*.jpg|*.txt|*.js|*.json|*.css)", "destination": "/503.html", "type": 307 } ] }
"source": "/"
で/
のパスのものをリダイレクトして、"source": "**/!(*.html|*.ico|*.png|*.js|*.json|*.css)"
で静的なリソース以外のリクエストをリダイレクトする。
その他の実装
色々調べたらfirebaseを使っているのでcloud datastoreを利用してメンテナンスモードフラグのようなものを管理し切り替えを行っている人などがいた。みんなそれぞれ何かしらの工夫をしてて、中にはそれキャッシュどうするんだというものがいくつかあったのでやる時はちゃんとキャッシュ周りを調べてからやったほうが良さそう。