Migrate my blog from GCS+GCLB+CloudCDN to Firebase Hosting

Dec 25, 2022 14:57 · 193 words · 1 minute read

背景 🔗

このブログを始めたきっかけは、GoogleCloud さんが weekly で主催する社内勉強会にて、登壇した内容がその年の聴講者数首位だったらしく $300 分のクレジットをいただいたので、せっかくならブログでも運用してみるか、というところからになります。

$300 もあるし、せっかくなら独自ドメインがいいなー、ということで、最初の構成としては一番お手軽に「GCS にファイルを置き、GCLB で HTTPS を終端させつつ、CloudCDN でキャッシュ」としていました(証明書にも managed cert が使えて手間がないため)。

ところがこのクレジット、有効期限が12ヶ月でありそろそろ期限が切れそう。今の構成だと月に $15 程度かかるので地味にダメージがあります…。

ということで、運用構成の見直しを図りたいと思います。

方針 🔗

以下の要件を満たすように、方針を考える。

  • ランニングコストは限りなく ¥0/月 に近づける。
  • ドメインは独自のものを利用する。

色々調べた中だと Firebase Hosting が良さそうでした。
Spark プランだと無料で使えます。

※ セルフホストする方向性でも検討してみてはいました。

  • GCE の無料枠内で配信する形にする。
    • GCLB が使えないので、TLS 終端も自前で設定する。
      • nginx を使う(rate limit とかもできるし)。
    • Managed Certificate が使えないので、Let’s Encrypt。
      • Certbot で更新処理も自動化する。

ただ、この方針だとコンテンツの更新方法を工夫する必要があり、

  • GCS Fuse で GCE に GCS バケットを仮想的にマウントする。
  • FTPS サーバを立ててローカルから送る。
  • SSH サーバーを立てて scp で送る。
  • コンテナに抱き込む。
  • github/GCS にアップロードし、cron job で定期的に更新チェックさせる。

など、どれもちょっとめんどくさそう…

せっかく static site generate で静的コンテンツとして生成しているのに、web サーバーが必要になってしまうのもイマイチ…

マネージドバンザイ、ということで firebase にしました。

設定からデプロイまで 🔗

まずは project を作成します。

もともと使っていた GCP プロジェクトに関連づけると、GCP プロジェクトで課金が有効になっているため Spark プランが使えないよ、と言われてしまったので、新規の firebase project として作成しました。

次に ドキュメントに従って 、Firebase CLI を入れます。

firebase init でプロジェクトを初期化します。

? What do you want to use as your public directory? public
? Configure as a single-page app (rewrite all urls to /index.html)? No
? Set up automatic builds and deploys with GitHub? No
? File public/404.html already exists. Overwrite? No
i  Skipping write of public/404.html
? File public/index.html already exists. Overwrite? No
i  Skipping write of public/index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!

もともと hugo で public を生成しているので、それをそのまま使ってもらう形になります。

エミュレータを使って動作確認します。

firebase emulators:start --project <myproject>

問題ければデプロイ。

firebase deploy --only hosting --project <myproject>

あとは独自ドメインの追加ですが、コンソールから使いたいドメインを設定して、 DNSチャレンジ で所有権を証明するだけでした。

これで完了、楽すぎる…