未分類
🛠️

Firebase App Hosting、簡単そうに見えて意外と沼る話

Firebase App Hosting は「動的ウェブアプリの開発とデプロイを効率化」すると言っている通り、確かに最初の立ち上げは本当に簡単です。
firebase init → apphosting.yaml 少し弄って → firebase deploy で動きます。firebase App Hosting、最高!

……でも実運用になるとGoogle CloudのSecret Manager周りやビルド時の挙動で頭を抱えました。
同じようにハマっている人(またはこれからハマりそうな人)のために、私が苦労したポイントをメモっておきます。

1. Secret Managerの権限問題でビルドがコケまくる

Google Cloud ConsoleからSecret Managerに値を入れて、IAMで「Secret Manager Secret Accessor」ロールを付与すれば動作すると複数のブログ記事を読みました。 でも実際に作ってみると「PermissionDenied」が発生してしまいました。

あれやこれやとコンソールから操作しましたが、成功しません
先人たちの通りに設定したつもりなんだけどな……
結論はfirebase CLIで設定できました。

# シークレットを作成(または更新)
# 指示にしたがって、値などを入力する
firebase apphosting:secrets:set シークレット名

# バックエンドにアクセス権を付与(これ超重要!)
# バックエンドIDは `firebase apphosting:backends:list` で確認できます。
firebase apphosting:secrets:grantaccess シークレット名 --backend あなたのバックエンドID

ちなみにこのコマンドで作られたSecret Managerと権限を見るとSecret Mangerのシークレットアクセサの他に閲覧権限も必要なようです。知らんけど

2. firebase.json の ignore で lib/ フォルダが消えてコンパイル失敗

Secret Managerの対応も終わって、あとは動くだろうと思ったらエラーになりました。
firebase.json に 必要なディレクトリまで ignore をしていたためです。

"ignore": [
  "**/node_modules/**",
  ".git",
  "firebase-debug.log",
  "firebase-debug.*.log",
  "functions",
  ".env*",
  "mise.toml",
  "app/(main)/private",
  "sandbox"
  "xxx"   ← プロジェクトルートのxxxフォルダを無視したくて書いた
]

これが原因で、lib/xxx みたいな共有ライブラリフォルダまで無視されていました。 ログには「xxx not found」しか出ない。
geminiに聞いたら、firebaseは相対パスは使えないよという回答があったので、importの書き方を疑いまくってました(無駄な時間…)。

解決策はシンプルでGitignoreと同じ用に「!」で除外したらよいようです。

"ignore": [
"xxx",
"!lib/xxx"   ← これで lib の中の xxx は残る
]

あとで気づいたのですが、zipダウンロードして中身確認すれば一発で原因が分かったはず。
そんなの知らないよ…

まとめ

Firebase App Hosting はすぐに公開できるので「効率」がいいと思います。 ただ、Google CloudやAWSに詳しくないと「設定がわからず困ることがある」サービスだなと実感しました。
特に横着して技術ブログなどを参考にすると内容が古かったりして、何が正しいのか分からなくなる場合もあります。
公式を見るクセをつけましょう(おまえがいうな)

これを読んでるあなたが同じところで詰まっていたら、少しでも時間短縮になれば嬉しいです!
逆に「俺はこうやって解決したよ」というTipsがあれば、コメントや要望フォームでぜひ教えてください。

それでは