LoginSignup
17
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-08

この記事は本番環境でやらかしちゃった人 Advent Calendar 2022の8日目の記事です。

こんにちは。virapture株式会社でCEOしながらラグナロク株式会社でもCKOとして働いている@mogmetです。
mogmet.jpg
最近無事に誕生日を迎えることができました。今年もまた邁進していこうと思います。

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

どんな惨劇が起こったか

エピローグ

image.png

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

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

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

そして、惨劇は起こる

image.png

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

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

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

復旧編

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

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

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

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

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

しかし、結論としてこの方法だと初回のリストアがIAMの権限周りでうまくインポートできませんでした...!
(あとで原因調べたい)
CleanShot 2022-12-08 at 20.11.40@2x.png

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

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

2. 手動で復元する

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

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

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

image.png

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

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

image.png

3点考えられます。

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

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

image.png

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

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

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

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

まとめ

image.png
ヒューマンエラーで惨劇はおこりましたが、論理削除しておくことによって惨劇から帰還することができました!
(本当に論理削除の設計しておいてよかった・・・)
みなさんもなるだけ物理削除しないように気をつけて行きましょう!

最後に、Firebase Advent Calendar 2022というのも開催しているので是非参加者お待ちしております・・・!

あと、ワンナイト人狼オンラインというゲームを作ってます!よかったら遊んでね!

他にもCameconOffcha、問い合わせ対応が簡単にできるCSmart、フリーランスのコミュニティのNextFreelanceといったサービスも作ってるのでよかったら使ってね!

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

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

17
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
1