STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

MongoDBの本番データを使って安全に動作確認できるようにする

最初に

こんにちは、STORES ECチーム、SREグループ所属の渋谷です。皆さんは本番データを使って動作確認や検証することがありますでしょうか? 我々も、稀ではありますが本番と同等のデータで動作確認や検証する場合があります。今回は、直近で本番のデータで動作確認を行いたいことがあったので、それらを行うために用意したデータの作成方法について紹介したいと思います。

データを安全に使う

さて、本番データにはお客様からお預かりした大切なデータが含まれます。それら大切なデータを動作確認や検証にそのまま使ってしまうと、不要な人間が閲覧できてしまったり、データの流出、意図しない保管、メールの誤送信など様々なリスクが発生します。それらを発生させないために、個人情報や閲覧されてはいけないデータはマスクし、安全に使えるようにする必要があります。

やったこと

MongoDBのデータをダンプする

弊社のEC事業ではほとんどのデータを MongoDB Atlas というクラウドサービスに保存しています。本番環境にはごく限られた人だけがアクセスできるようになっており、動作確認や検証に使うには一度本番データを全て出力し、安全なデータにしてから確認環境に入れる必要があります。

MongoDB ではデータの出力方法は主に2つ用意されていて mongodumpmongoexport があります。ただし、これらは用途が違うため以下でご紹介します。

mongodump

mongodumpMongoDB からデータをバイナリーエクスポートするためのツールです。 MongoDB Inc が開発を主導しオープンソースで開発されています。スタンドアロン、レプリケート、シャーディング、いずれの構成でもデータを出力できます。データを入れる場合は mongorestore を使用します。

ただ、シャーディングされているDBの場合トランザクション中のアトミック性が保証できないため、他の構成と同じ方法でエクスポートができません。

mongoexport

mongoexportMongoDB からJSONCSVでエクスポートするためのツールです。こちらもオープンソースで開発されています。 mongoexportJSONまたはCSVで出力できるため加工や、他のシステムとの連携がやりやすくなります。データを入れる場合は mongoimport を使用します。

mongoexport はプロダクションのデータのバックアップとしては使用できません。JSONがBSONのデータ型を全て保証していないためです。バックアップする場合は mongodump を必ず使用しましょう。

mongoexport type-fidelity — MongoDB Manual

データをマスクする

マスクする場合、BSONでは加工が難しいため、 mongoexportJSONで出力し、プログラムから加工する方法を選択しました。JSONの加工はプログラムから簡単に行えるため、マスクするツールは社内でRubyを使って自作しています。マスクしたいフィールドの指定をYAMLで管理できるようにし、レビューによるフィールドの見落とし防止やメンテナンス性を保てるようにしました。

※ これはYAMLの例です。実際のものと異なります。

---
[collection名]:
  - path:
      - [field名]
    type: [型]
  - path:
      - email
    type: email

注意点

mongodumpmongoexport ではインデックスは出力されません。データをインポートした後に本番と同等にするにはインデックスを貼る必要があります。弊社ではインデックスを貼るのに元々定義してある Ruby on Railsrake task があるためそちらで行っています。

mongodump data-exclusion — MongoDB Database Tools

終わりに

EC事業では本番と同等のデータを使うことはそこまで多くありませんが、大きめの修正や変更、インフラのバージョンアップなどがあった場合はパフォーマンスの検証や、アプリが正常に動くかどうかの確認が必要になります。定期的にマスクした安全なデータを用意することで、それらが確実に安全に実行できる環境を作る必要があります。

参考