😊

間違えてCloud Functionsを全部Deleteしたけど首は飛ばなかった話

2024/12/01に公開

はじめに

この記事は GMOメディア株式会社 Advent Calendar 2024 の1日目の記事です。

間違えてCloud Functionsを全部Deleteしたけどギリ耐えて首は飛ばなかった話です。

軽く構成とあらすじ

私のチームでは、Cloud Functions for FirebaseというFirebaseの機能を使っています。

https://firebase.google.com/docs/functions?hl=ja

メインはTypeScriptですが、機械学習などの処理はPythonで書いています。
GitHubレポジトリは別ですが、同じプロジェクトで管理しています。

元々はFirebaseがPythonに非対応だったので、対応している普通のCloud Functionsを使って書いていましたが、Pythonに対応したので、Firebase対応に書き直したところ、タイトルの全Deleteが発生しました。

事の発端

書き直し自体は簡単で、デコレーターやコードの構成をちょちょいと変えるだけでした。
以下のコマンドでexportしている全ての関数をデプロイできます。便利ですね。

firebase deploy --force --only functions

forceオプションがあるとコードにはもう存在しないFunctionsを削除してくれるのでつけています。
しかし、このコマンドが全Deleteの原因です。
その時の絶望的なログのスクショがこちらです。

Pythonのデプロイが完了した後に、TypeScriptで書かれたCloud Functionsが全て消えてしまいました。
不幸中の幸いだったのは、Dev環境だったので、吹き飛ばしても、本番環境は残っていたことです。

なぜDeleteされたのか

firebase.jsonの設定が悪かったのが原因です。

{
  "functions": [
    {
      "source": "functions",
      "codebase": "default" // ここが問題
      "ignore": [
        "venv",
        ".git",
        "firebase-debug.log",
        "firebase-debug.*.log",
        "*.local"
      ]
    }
  ]
}

codebase の設定が default になっていたのが原因でした。
この項目がどういう意味かは、公式ドキュメントにも書いてあります。

https://firebase.google.com/docs/functions/organize-functions?hl=ja&gen=2nd

内部で利用されるsuffix?のようなもので、何を指定してもfunctionsの名前は変わりません。
しかし、別レポジトリに同じ codebase を持つfirebase.jsonがある状態で、同じプロジェクトにデプロイするともう片方をDeleteしますか?と確認が出ます。
forceオプションをつけていたので、確認なしでデプロイが進んでしまい、全Deleteが発生しました。

対策

codebase が被らないようにすればいいだけなので、対策は簡単です。

{
  "functions": [
    {
      "source": "functions",
      "codebase": "python" // ここを変更。他レポジトリと被らなければOK
      "ignore": [
        "venv",
        ".git",
        "firebase-debug.log",
        "firebase-debug.*.log",
        "*.local"
      ]
    }
  ]
}

まとめ

今回のインシデントは、一見些細に見える設定パラメータが、実は重要な意味を持っていたという典型的な例でした。
開発者として、「動いているから良い」という考えは非常に危険です。設定ファイルのパラメータは、それがDockerであれ、CI/CDであれ、クラウドサービスであれ、各々が明確な目的と影響範囲を持っています。それらを理解せずに使用することは、今回のような予期せぬ結果を招く可能性があります。
幸い今回は開発環境での出来事でしたが、この経験を通じて、設定値の持つ意味を深く理解することの重要性を、身をもって学ぶことができました。
みなさんも、「動いているから良い」と思って使っている設定値はありませんか?今一度、その設定値が持つ意味を確認してみることをお勧めします。

GitHubで編集を提案
GMOメディアテックブログ

Discussion