Firebaseを使った本番環境で誤ってユーザデータを削除してしまったお話

この記事は[本番環境でやらかしちゃった人 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/yarakashi-production)の8日目の記事です。

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。
![mogmet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/63d6b6ed-20f6-2a03-d918-036da2c798eb.jpeg)
最近無事に誕生日を迎えることができました。今年もまた邁進していこうと思います。

本日はFirebaseを使ったユーザ投稿型のコンテンツであるサービスで起こった、ある惨劇について紹介しようと思います。

## どんな惨劇が起こったか
### エピローグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/ed9a4ed2-9e2b-df62-4f50-50ce91775982.png)

今回舞台になるのはユーザコンテンツ型であるサービスでのお話。
ユーザが活発に投稿をしてくれますが、中には定期的にコンテンツを削除してくださいとの依頼もきていました。

ある寒い日のこと。
この日はいつもより寒いせいか削除の依頼が少し多めにきておりました。（寒いせいではないとおもう）

その中の一つに「削除依頼」とだけ書かれた依頼がきておりました。
この削除依頼が騒動になるとは、このときの僕らはまだ誰も想定しておりませんでした。

### そして、惨劇は起こる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/9b7a23e3-5303-7956-91ac-3481e021374a.png)

「削除依頼」とかかれた依頼を見た運営者はコンテンツの削除ではなく、Firebase Authenticationの**アカウントごと**削除してしまいました。
このサービスではアカウント削除をきっかけとして、そのユーザが持つコンテンツごとまるっとユーザを削除する仕組みになっていました。
そのため、後ほどユーザから

「ログインできなくなりました」

とのお問い合わせが発生し、ようやく惨劇の深刻さが判明しました。

## 復旧編

事態を確認してユーザとコンテンツをなんとかして復旧する方法を調べました。
その結果、２つの復旧方法が考えられました。
結論としては後者の方法で復旧を行うことができました。

### 1. バックアップファイルからデータをリストアして必要なデータを再度importする

このサービスではfirestoreを使っており、毎日バックアップを取得していました。
そのためバックアップからリストアを試みることにしました。

リストア手順に関しては以前自分が書いた記事が大いに役立ちました。

https://qiita.com/mogmet/items/44ab5fd4e1be48e17b36

そして、インポートについてはfirefooに必要なドキュメントだけexportしてimportする機能があるので、これを使ってインポートしようとしました。

https://qiita.com/mogmet/items/08a973b510a6f135b5f9

しかし、結論としてこの方法だと初回のリストアがIAMの権限周りでうまくインポートできませんでした...!
（あとで原因調べたい）
![CleanShot 2022-12-08 at 20.11.40@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/82679a9b-3260-3208-f4fc-97625731fb98.png)

時間もなくて急いでいたので、この方法は一旦捨てることにしました。

※ちなみにエミュレータでimportも試みたのですが、サイズが大きすぎて全然インポートすることができませんでした。

### 2. 手動で復元する

ではどうやって戻したかというと、基本的にデータは論理削除していたため、手動でがんばって削除を戻し回って復元することができました。
論理削除に関しては昔から色々やり方があるので是非下記記事を御覧ください。

https://blog.mogmet.com/ronsakucasual-1/

（この勉強会全然カジュアルじゃなかったけどめちゃくちゃ内容濃くて面白かったなぁ。。。）

また、Firebase Authenticationの復元に関しては、これもfirefooが大活躍しました。
firefooにはUIDを指定したユーザの作成ができるため、消えてしまったUIDを指定して再度ユーザを作成することで無事復元することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/57a2365a-9031-5801-bc7b-f1b134085d4d.png)

こうして無事にユーザ様のもとへコンテンツを戻すことができました。

## 惨劇はなぜおこってしまったのか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7ad4d936-216e-023b-9d03-2b6494ef4307.png)

3点考えられます。

第一に、依頼があるとslackに通知がくるのですが、削除依頼と普通の問い合わせがごっちゃになっているのでパッと見わかりづらかったというところがあります。
第二に、基本的にユーザ側でアカウントの削除はできるようになっているのですが、アカウント削除はユーザ自身にやってもらうという運用が周知できていなかった点があります。
そして最後の点が、**ユーザがコンテンツを削除できない**仕様になっている点です。

## 惨劇を起こさないためにできること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/ef7210af-588e-37be-f001-77d667bc59a6.png)

仕様の話でいうと、根本的にユーザがコンテンツ削除できるようにしちゃえば解決ですね。

今回の問題は管理者権限がある人だと誰もが起こしてしまうる惨劇になります。
そのため日頃から権限をなるべく最小に絞って必要な人にだけ権限を付与するように運用するという「最小権限の原則」に乗っ取ることで、被害を起こしづらくする事ができます。

しかし、惨劇を0にすることはできないので、今回のケースのようにデータを論理削除しておき、物理削除は後日別の仕組みで実装するなどの段階を踏むような設計にすることでカバーすることができます。

もちろんバックアップを取っておくことも大きい対策になるでしょう。
是非下記記事を参考にバックアップをサクッと実装してしまいましょう。

https://qiita.com/mogmet/items/8b8735f05a6627d7f82f

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/2885ea7b-0f2a-9fdb-f460-691892703f94.png)
ヒューマンエラーで惨劇はおこりましたが、論理削除しておくことによって惨劇から帰還することができました！
（本当に論理削除の設計しておいてよかった・・・）
みなさんもなるだけ物理削除しないように気をつけて行きましょう！

最後に、[Firebase Advent Calendar 2022](https://qiita.com/advent-calendar/2022/firebase)というのも開催しているので是非参加者お待ちしております・・・！

あと、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

https://next-freelance.net/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com