最初に
こんにちは、STORES ECチーム、SREグループ所属の渋谷です。皆さんは本番データを使って動作確認や検証することがありますでしょうか? 我々も、稀ではありますが本番と同等のデータで動作確認や検証する場合があります。今回は、直近で本番のデータで動作確認を行いたいことがあったので、それらを行うために用意したデータの作成方法について紹介したいと思います。
データを安全に使う
さて、本番データにはお客様からお預かりした大切なデータが含まれます。それら大切なデータを動作確認や検証にそのまま使ってしまうと、不要な人間が閲覧できてしまったり、データの流出、意図しない保管、メールの誤送信など様々なリスクが発生します。それらを発生させないために、個人情報や閲覧されてはいけないデータはマスクし、安全に使えるようにする必要があります。
やったこと
MongoDBのデータをダンプする
弊社のEC事業ではほとんどのデータを MongoDB Atlas
というクラウドサービスに保存しています。本番環境にはごく限られた人だけがアクセスできるようになっており、動作確認や検証に使うには一度本番データを全て出力し、安全なデータにしてから確認環境に入れる必要があります。
MongoDB
ではデータの出力方法は主に2つ用意されていて mongodump
と mongoexport
があります。ただし、これらは用途が違うため以下でご紹介します。
mongodump
mongodump
は MongoDB
からデータをバイナリーエクスポートするためのツールです。 MongoDB Inc
が開発を主導しオープンソースで開発されています。スタンドアロン、レプリケート、シャーディング、いずれの構成でもデータを出力できます。データを入れる場合は mongorestore
を使用します。
ただ、シャーディングされているDBの場合トランザクション中のアトミック性が保証できないため、他の構成と同じ方法でエクスポートができません。
- 4.0以前
- 4.2以降
mongoexport
mongoexport
は MongoDB
からJSONかCSVでエクスポートするためのツールです。こちらもオープンソースで開発されています。 mongoexport
はJSONまたはCSVで出力できるため加工や、他のシステムとの連携がやりやすくなります。データを入れる場合は mongoimport
を使用します。
mongoexport
はプロダクションのデータのバックアップとしては使用できません。JSONがBSONのデータ型を全て保証していないためです。バックアップする場合は mongodump
を必ず使用しましょう。
mongoexport type-fidelity — MongoDB Manual
データをマスクする
マスクする場合、BSONでは加工が難しいため、 mongoexport
でJSONで出力し、プログラムから加工する方法を選択しました。JSONの加工はプログラムから簡単に行えるため、マスクするツールは社内でRubyを使って自作しています。マスクしたいフィールドの指定をYAMLで管理できるようにし、レビューによるフィールドの見落とし防止やメンテナンス性を保てるようにしました。
※ これはYAMLの例です。実際のものと異なります。
--- [collection名]: - path: - [field名] type: [型] - path: - email type: email
注意点
mongodump
、 mongoexport
ではインデックスは出力されません。データをインポートした後に本番と同等にするにはインデックスを貼る必要があります。弊社ではインデックスを貼るのに元々定義してある Ruby on Rails
の rake task
があるためそちらで行っています。
mongodump data-exclusion — MongoDB Database Tools
終わりに
EC事業では本番と同等のデータを使うことはそこまで多くありませんが、大きめの修正や変更、インフラのバージョンアップなどがあった場合はパフォーマンスの検証や、アプリが正常に動くかどうかの確認が必要になります。定期的にマスクした安全なデータを用意することで、それらが確実に安全に実行できる環境を作る必要があります。