本番環境やらかしアドベントカレンダー(2枠目)の12日目の投稿です。
おことわり
最近多忙のため、投稿が遅れてすみませんでした。(13日になってからの投稿です)
そのため、後から内容を少しずつ追記していきます。
私は、今年夏に前の会社を退職し、次の会社へ移ったのですが、前の会社での自身のやらかしを話を話せる範囲で記載致します。
はじめに
前職で行っていたことですが、それはスマートフォンゲームの全世界同時運営を行っていました。
スマートフォンゲームでは他社含めよくある話ですが、日本版は先にリリースし、人気が出た後に、海外のユーザーの期待の声にも応える形で、世界版(日本以外のユーザーを対象)を出す、という形でリリースを行いました。
その世界版のリリースを準備する際にやらかしそうになったので、ここで話します。
サーバー環境について
日本版と世界版についてですが、運営担当していたゲームの場合は、同じリージョンにwebサーバーを複数台置き、1つのwebサーバーについて、日本版と世界版のサーバーコードを両方配置し、ロードバランサのみで、日本版のユーザーに使うサーバーか、世界版のユーザーに使うサーバーかを振り分けられるようにしていました。
全世界同時運営のため、日本版と世界版でほぼ同一コードであったこと、日本版と世界版のコードの本番デプロイも同一タイミングであることから、同時にデプロイできる利便性も考慮してそのように作ったのだと思います。(あとはインフラ側の管理のしやすさとかかな)
やらかしそうになった話
私は運用作業を行うエンジニア(オペレーター)で、その時私が行う作業は、世界版のリリースが間も無く控えている状況でして、世界版の本番環境のデータベースはスタッフがデバッグでたくさん遊んでいたので、一度データリセットする必要があり、そのリセット作業を私が行うという、いかにも怖い作業がありました。
しかも、データリセットする際は、staging用のwebサーバーにsshして、そこではデータリセットスクリプトに環境変数を渡すために、「日本版か世界版か」「stgか本番か」を設定し、リセットする必要がありました。
そうです。ここで、「日本版」「本番」を選択した状態で、データリセットすると今の日本版の本番が消えてしまう、という怖い状態です。。
私は、不幸にも、「日本版か世界版か」の設定を忘れて、データリセットスクリプトを実行しそうになりました。
が、しかし、実行直前に「世界版」に切り替える設定を忘れていることに気づき、設定し直すことでなんとかなりました。ふう、助かった。。。
ただしスクリプトは安全にも作られていた
非常に怖い話でしたが、もし私が間違えて実行していたら実際に日本版の本番データはまっさらになっていたのか。これは実は起きませんでした。
なぜかというと今回の手順は正確には
DROP DATABASE (世界版本番データ) をデータベース名間違っていないことを確認した上で手動でコマンド実行する
↓
データリセットスクリプトを実行する (ここで、しているのは実際はCREATE DATABASEとCREATE TABLEと初期データ投入)
だったので、データリセットスクリプトとは言っても、実際はDROP DATABASEはしておらず、初期テーブルとデータの投入してしていなかったので、間違えて実行していても、日本版本番はもちろんCREATE DATABASEはされているのでただエラーになってスクリプトが止まるだけ、だったので何も問題は起きなかったわけです。
学び
ということで、スクリプトが安全に作られていて安心しました。人間集中力が切れることはいくらでもありますから、やらかしても、大丈夫なように作ることは大事ですね。
あと、同一サーバーとはいえ、日本版、世界版の環境変数をセットした状態でsshするコマンドを作るとか、そもそもこういうスクリプトを実行する際は別サーバー(日本版、世界版で環境別)にするとか、他でも対策できるアイデアはありそうですね。
(あとは、スクリプトのドライランも大事ですが、手順書上yオプションつけてドライラン潰していたのもよくなかったな、と思い出しました🥺)
なお、現職はこういった作業を行うメンバーは相当限られており、私は権限を持っていないので(事故ることはないので)安心しておりますw