Cloud Functions for Firebaseの利用で、異様にGCPのStorageが消費されると思ったら..
知っている人には当たり前の知識かもですが、地味に不安だったことなのでメモ。
起こったこと
Firebase でアプリを作っていたら、なぜか Storage のリソースが異様に消費されてることに気がつきました。
このプロジェクト自体は Cloud Functions for Firebase をメインに使っていて、Storage 自体にはほぼファイルはありませんでした。
しかし、上記画像の通り異様にアクセスされています。
さらに GCP で Storage をみると見覚えのないファイルが大量に!
なぜ...🤔
原因
原因は Cloud Functions for Firebase のデプロイ時に自動保存されるソースコードでした。
Cloud Functions for Firebase のデプロイは以下手順で行われるようです。
- 関数のソースコードを含むアーカイブを Cloud Storage のバケットにアップロード
- アップロードされた ソースコードを使って Cloud Build でコンテナイメージを構築
- 構築されたイメージを Container Registry にプッシュ
- Functions のコール時に Container Registry からコンテナを作成して実行
なので、ローカルから firebase deploy --only functions
をするたびに Cloud Storage にバケットが作成されていたのですね。
※ 上記内容は所属しているコミュニティ(エンジニアと人生)の Slack で教えてもらったことです。疑問を分報に書いたら即 @moga 氏 からコメントもらえました。本当に感謝🙏
対処
このままだと Storage のリソースが消費され、無駄な費用がかかることもあるので適宜削除しましょう。
Cloud Storage のライフサイクルで削除を実行するのがオススメです。
以下手順で設定を行いました。
(1)GCP で Storage コンソールを開く
(2)対象のバケットを選択しライフサイクルのタブを開く
(3)ルールを追加を選択し、「オブジェクトを削除する」を選ぶ
(4)条件を「年齢」値を「1 日」にする
これでバケットに追加されてから 24 時間経過後に自動的に削除されます。
解決!
※ バケットを削除しても Cloud Functions for Firebase の実行自体は問題なく動作します(起動用の実態は Container Registry にあるので)。
Discussion
私も個人の趣味プロジェクトでこの現象が起き、毎月1~2円取られるのが気になっていたので助かります。
なお、自動保存されたデータはFirebaseコンソールでは通常見えていませんが、Storage画面の詳細メニューから「バケットを追加」で
gcf-sources-...
や{region}.artifacts....
を閲覧することができます。なるほど!! 知らなかったです!
ありがとうございます。
最近のことではあるのですが、GCF用のGCSバケット内のオブジェクトを手動またはライフサイクルルールで削除するのはその後のデプロイでエラーが出る可能性があって非推奨になっている(まだ英語版にしか反映されていないのですが公式ドキュメント, Issue Tracker)ので、stackoverflowポストのFirebaseエンジニアの回答にあるようにContainer Registryでコンテナ削除を行なって間接的にバケットのオブジェクトを整理するほうが安全かもしれません。