Slide 1

Slide 1 text

2017 SpeeeKaigi #3 本番デー タを安全, 簡単に利用する 株式会社 Speee 佐々 木 延也 SpeeeKaigi 1

Slide 2

Slide 2 text

Pro le 佐々 木 延也 三重県出身 中日/HipHop/ ビシエド が好き 今年の8 月1 日 Speee 入社 前職はグルメ系Web サー ビスのWeb エンジニア/Android エンジニア SpeeeKaigi 2

Slide 3

Slide 3 text

みなさん 本番デー タでテストしてますか? SpeeeKaigi 3

Slide 4

Slide 4 text

本番デー タでテストするメリット SpeeeKaigi 4

Slide 5

Slide 5 text

本番デー タでテストするメリット 1. ユー ザー 目線にたってテストができる ( 失敗例) ユー ザー は写真の順番にこだわりを持っていることが多い。 しかし開発環境の画像デー タが適当だったため、 そのことに 気づかずデー タ修正時に順番がバラバラになってしまった。 SpeeeKaigi 5

Slide 6

Slide 6 text

本番デー タでテストするメリット 2. 色々 なパター ンのデー タでテストがで きる ( 失敗例) 特定の条件下でインポー トしたデー タには通常のライフサイ クルでは存在するはずのデー タがなく、 それが原因で EXCEPTION が発生した。 SpeeeKaigi 6

Slide 7

Slide 7 text

本番デー タでテストするメリット 3. パフォー マンスの検証ができる ( 失敗例) 開発DB と本番DB で統計情報が異なっていたため開発環境で はindex が使われていたが本番では使われていなかった。 そ れが原因でSlow クエリが頻発し一部のAP サー バー がダウン してしまった。 SpeeeKaigi 7

Slide 8

Slide 8 text

なぜ本番デー タのテストが活発で なかったのか? SpeeeKaigi 8

Slide 9

Slide 9 text

個人情報を保護してデー タを持っ てくるのが大変だから SpeeeKaigi 9

Slide 10

Slide 10 text

大変な理由① 1. 本番環境への影響を避ける必要性 mysqldump のオプションでテー ブルlock してしまったり するオペミスが起きうる。 レプリケー ションで持ってくる場合は本番DB の設定を変 える必要がある。 SpeeeKaigi 10

Slide 11

Slide 11 text

大変な理由② 2. 元の形式を維持する必要性 理由 アプリのバリデー ションにかからないようにするため ( 例) 電話番号 元デー タ ✕ ◯ 03-3333-4444 0000000000 03-1000-0000 SpeeeKaigi 11

Slide 12

Slide 12 text

大変な理由③ 3. DB のUnique 制約を回避する必要性 「 全て同じ文字列で埋める」 などの方法ではDB のUnique 制 約にかかってしまうことがある。 SpeeeKaigi 12

Slide 13

Slide 13 text

これらの要件を満たす、 いい解決 策がなかったので SpeeeKaigi 13

Slide 14

Slide 14 text

mozaic SpeeeKaigi 14

Slide 15

Slide 15 text

Gem を作った( まだprivate...) SpeeeKaigi 15

Slide 16

Slide 16 text

実現したい機能要件 1. 大規模なデー タのdump のパフォー マンスが問題ないこと 2. コマンド1つで実現できること 3. カラムごとにData Masking 方式を切り替えられること 4. 適切なData Masking 方式がなかったら、 ユー ザー が自分 でRuby のマスク処理を行えること 5. MySQL, PostgreSQL に対応 SpeeeKaigi 16

Slide 17

Slide 17 text

実現したい機能要件 1. 大規模なデー タのdump のパフォー マンスが問題ないこと 2. コマンド1つで実現できること 3. カラムごとにData Masking 方式を切り替えられること 4. 適切なData Masking 方式がなかったら、 ユー ザー が自分 でRuby のマスク処理を行えること 5. MySQL, PostgreSQL に対応 SpeeeKaigi 17

Slide 18

Slide 18 text

実現方法 SpeeeKaigi 18

Slide 19

Slide 19 text

3. カラムごとにData Masking 方式を切り替えられること --- user: root host: localhost port: 3306 db: name: sample_development rdbms: mysql tables: - name: owners columns: - name: phone_number method: tel # Data Masking 方式 - name: users columns: - name: mail method: email # Data Masking 方式 SpeeeKaigi 19

Slide 20

Slide 20 text

3. カラムごとにData Masking 方式を切り替えられること 組み込みのData Masking 方式 方式 マスク方法 tel 電話番号の体裁を保ったままマスクする email メー ルアドレスの体裁を保ったままマスクする shuf e 各レコー ドの順番を入れ替える blackout 任意の文字、 数字で埋める SpeeeKaigi 20

Slide 21

Slide 21 text

4. 適切なData Masking 方式がなかったら、 ユー ザー が自分 でRuby のマスク処理を行えること mask メソッドとコンストラクタを持つRuby のクラスを指定 ディレクトリに格納し、YAML の設定ファイルにクラス名を 小文字で記載すると独自のマスク処理を行える。 module Mozaic::MaskMethod::Plugin class SampleMask def initialize(records, column_name); ;end def mask; ;end end end SpeeeKaigi 21

Slide 22

Slide 22 text

今後追加する予定の機能 Data Masking 方式のブラッシュアップ Plugin 機構の導入 差分更新できるようにする 環境変数からクレデンシャルを取得できるようにする PostgreSQL 対応 SpeeeKaigi 22

Slide 23

Slide 23 text

ご清聴ありがとうございました SpeeeKaigi 23