間違えてCloud Functionsを全部Deleteしたけど首は飛ばなかった話
はじめに
この記事は GMOメディア株式会社 Advent Calendar 2024 の1日目の記事です。
間違えてCloud Functionsを全部Deleteしたけどギリ耐えて首は飛ばなかった話です。
軽く構成とあらすじ
私のチームでは、Cloud Functions for FirebaseというFirebaseの機能を使っています。
メインは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
になっていたのが原因でした。
この項目がどういう意味かは、公式ドキュメントにも書いてあります。
内部で利用される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であれ、クラウドサービスであれ、各々が明確な目的と影響範囲を持っています。それらを理解せずに使用することは、今回のような予期せぬ結果を招く可能性があります。
幸い今回は開発環境での出来事でしたが、この経験を通じて、設定値の持つ意味を深く理解することの重要性を、身をもって学ぶことができました。
みなさんも、「動いているから良い」と思って使っている設定値はありませんか?今一度、その設定値が持つ意味を確認してみることをお勧めします。
Discussion