ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

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ヘッダーを設定してやるのがベターらしい

developer.mozilla.org

設定

前提として対象のサービスはアプリケーションとサービストップページでドメインを分けていて、サービストップページだけ検索エンジンに登録されればいいかという構成。

そして色々考えた結果、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を利用してメンテナンスモードフラグのようなものを管理し切り替えを行っている人などがいた。みんなそれぞれ何かしらの工夫をしてて、中にはそれキャッシュどうするんだというものがいくつかあったのでやる時はちゃんとキャッシュ周りを調べてからやったほうが良さそう。

*1:firebase様御社のプロダクトであるbotのために503返すメンテナンスモードボタン実装してください。。