本稿の目的
BIツール導入の実務案件を担当しました。
今回のBIツール導入案件では、「本サービス運用に影響が出ないよう、本サービス用データベースからデータを分析用に取ってくること」「分析ように取ってきたデータにマスキング処理を施し、BIツールのユーザーが閲覧できないようにすること」の2点を担保する方法を考えて実装するのが一番の山場でした。
そこで本稿では、「要件」「課題」「解決策」に分けて上記2点についての詳細かつ正確な説明を試みます。また、最後に実装したコードも掲載しております。ぜひご覧ください。
要件
BIツールを導入するに当たって、下記の要件(クライアントの要望)を満たす必要がありました
要件1. 本サービス運用に影響が出ないよう、本サービスのデータベース以外のところにBIツールが参照するようにしてほしい
要件2. BIツールの利用者(従業員)に個人情報が見えないようにusernameとemailにはマスキング処理を施してほしい
要件3. 以上をできるだけコストをかけないで実現してほしい
課題
課題1. 要件1を満たすために、本番データベースを何らかの形でエクスポートする必要がありました。
課題2. 要件2を実現するためにマスキング処理用のプログラムを作成する必要がありました
課題3. BIツールがアクセスするDBサーバーのデータベースにマスキング処理を実施する方針だと、本サービスのデータベースからデータを移したばかりの時に、まだマスキング処理ができていない状態が発生し、BIツールのユーザーが個人情報を閲覧できてしまう可能性があります。なので、本番DBサーバーでもBIツール用DBサーバーでもない第3の場所でマスキング処理を実行する必要がありました
課題4. 第3の場所でマスキング処理実施後のデータをBIツール用データベースに何らかの形でエクスポートする必要がありました
課題5. 要件3を満たすために、マスキング処理用の場所は必要な作業が終われば削除するようにすべきでした
課題6. 以上全てを定期的に自動実行できなければなりません。
解決策
・課題1に対しては、本サービスのRDSのスナップショットを作成して、それから別のRDSを復元することで対処しました。
・課題2のマスキング処理用のプログラムは、Rubyを使って作成しました。
・スナップショットの復元により作成したRDSのデータベースにマスキング処理を施すことで、課題3の解決を図りました。
・課題4を解決するため、マスキング処理を施したテーブルを含む全データベースのdumpファイルを作成し、それをBIツール用のRDSで復元するようにしました。
・マスキング処理したデータのエクスポートが完了してすぐに、スナップショットから復元したRDSを自動的に削除するようにしました。これにより、課題5をクリアしました。
・シェルスクリプトにAWS CLIなどのコマンドを記述し、これをcronで定期実行することで課題6を解決しました。同じスナップショット名で何回も自動実行できるよう、作成したスナップショットは毎回削除しています。
コード
#!/bin/bash
#スナップショットの作成
/usr/bin/aws rds create-db-snapshot \
--region ap-northeast-1 \
--db-instance-identifier database-0 \
--db-snapshot-identifier hogehoge
#スナップショットの作成を待つ
/usr/bin/aws rds wait db-snapshot-available \
--region ap-northeast-1
#スナップショットからRDSを復元する
/usr/bin/aws rds restore-db-instance-from-db-snapshot \
--region ap-northeast-1 \
--db-snapshot-identifier hogehoge \
--db-instance-identifier database-3 \
--availability-zone ap-northeast-1c \
--db-subnet-group-name redash-db-sub-groupe \
--vpc-security-group-ids sg-0cdd1b46c92f20dd7 \
--db-parameter-group-name redash-db-param \
--no-multi-az
#RDSの立ち上がりを待つ
/usr/bin/aws rds wait db-instance-available \
--region ap-northeast-1
#dokugaku_engineerデータベースにマスキング処理
/bin/bash -lc "~/.rbenv/shims/ruby ~/app/masking.rb"
#マスキングしたデータベースからダンプファイルを作成
mysqldump --defaults-file=~/etc/.my.cnf --set-gtid-purged=OFF \
--single-transaction dokugaku_engineer > dokugaku_engineer.dump.spl
#BI専用RDSのデータベースにダンプデータを投入
mysql --defaults-file=~/etc/your.cnf dokugaku_engineer < dokugaku_engineer.dump.spl
#作成したスナップショットを削除
/usr/bin/aws rds delete-db-snapshot \
--region ap-northeast-1 \
--db-snapshot-identifier hogehoge
#作成したRDSを削除
/usr/bin/aws rds delete-db-instance \
--region ap-northeast-1 \
--db-instance-identifier database-3 \
--skip-final-snapshot