はじめに
この記事は、本番環境などでやらかしちゃった人 Advent Calendar 2023 の7日目です。
私はIT関連企業ではないサービス業の人間ですが、IT関連全般のことをやってます。
現在ノーコード開発としてはかなりメジャーな Bubble というプラットフォーム上でサービスを展開しているのですが、そこでのやらかしを共有したいとおもいます。
Bubbleとは
Qiitaにはノーコードエンジニアはあんまりいなさそうなので説明します。
Bubbleは、プログラミング知識がなくても使えるノーコードプラットフォームです。ドラッグ&ドロップでウェブアプリを作れるので、、技術がない人でも簡単にアプリ開発が可能です。このプラットフォームのいいところは、見た目のデザインからデータベースまで、全部自分で作れる点。プログラミングがわからなくても、条件分岐やデータ操作などの複雑なことができます。
Bubbleの特徴は、使いやすくてカスタマイズが自由自在。デザインも自分の好きなようにできるし、必要な機能はプラグインで追加できます。Google MapsやFacebookといったサービスと組み合わせるのも簡単。技術者でなくても、自分のアイデアを形にするのにぴったりなツールです。
(by ChatGPT)
Bubbleのリリース
Bubbleには、わりといい感じのバージョン管理システムがあります。
アプリケーションは、Live(本番環境) と Main(開発環境のメインブランチ) があり、Mainから分岐したいくつかのブランチを切れます。リリースの際には、MainからLiveへのコピー(デプロイ)を行います(サブブランチからのLiveデプロイは不可能)。この際には、コンフリクトの検知や解決(どっちを生かすのか)ができます。
一方、データベースはLive と Dev という2つのバージョンのみで、開発環境の全ブランチはDevデータベースを共有しています。
そして、各テーブル単位にLive ↔ Devの一括コピーが行なえます。部分的なコピー機能などはなく、テーブルまるごとしかありません。
我々のサービスでは、データベースにいくつかのマスタデータ用のテーブルがありました。マスタデータは、DevとLiveで同じものを利用したいので、頻繁にDev to Liveのテーブルコピーを行っていました。
テーブルコピーのUI
こちらの画像をごらんください。これがBubbleのデータベースコピー機能のUIです。
まず、コピーの方向(Live to DevまたはDev to Live)を指定します。
次に、コピー対象のテーブルを選択します。
最後に、呪文を記入してConfirmボタン押下でコピーが実施できます。
そして、コピー対象の選択プルダウンには、「All types」が存在します。
もう、何が起きるか、おわかりでしょうか。
そして事件は起こった
ある日、私はとあるマスタデータをDevで編集し、それをLiveにコピーしました。
5分後、「なんかログインできないんだけど」という同僚の声。
ん、なんだろう。
Liveのデータベースを見る。Userテーブルの数が明らかにすくない。まるで開発環境のような少なさ…。
もしかして。
原因発覚、そして
そう、私はテーブルコピーの対象に「All types」が選択されていたのに気づかず、コピーを実行していたのです。
Live環境のUserを含む、すべてのデータは、Devデータによって置き換えられていました。しかも、まだデータのコピーは完了しておらず実行中。あと何十分かかかりそう。途中で止めることはできない。
止まらない冷や汗。
事情をみんなに説明。
約1時間かかって、データコピーが完全に終了。途中で止めたいのに、止められない、待つしかないという地獄の時間。
今度はBubbleのデータベースリストア機能を使って、事件が起こる前の状態に戻す指示を実行。これまた時間がかかる。
さらに1時間後、ようやく元通りになりました。お客様やチームに、大変ご迷惑をおかけしました。
学び
2時間のサービス停止時間によって得られたものは、「ちゃんと確認する」「一人でやらない」ということでした。それ以降、データコピーの際には複数人の監視下で実施するようにしています。
また、自分でUIを設計する際にも、BubbleのこのUIはアンチパターンとして気にするようになりました。
トランザクションデータを含む全テーブルコピーと、マスタデータ1テーブルのコピーという、目的も影響範囲も異なる行為が、全く同じUIで実施できてしまう、という問題。
本来あるべきなのは、テーブル単位に、「このテーブルは一括コピーを禁止する」というような機構をつけ、さらに全テーブルコピーと1テーブルコピーの確認UIに差をつけることでしょう。
そして、あれから数年
Bubble側も、この問題をようやく認識してくれたようです。
なんと、下記のようにAll typesを選択している際に、注意書きがつくようになりました。
…こんなんじゃ絶対また事故起こるとおもうよ!!