本番データを使った検証を手軽にできる仕組みの構築

ロジクラでエンジニアをしている高梨です!

前回のstagingDev環境構築に引き続き、DevOps周りの改善を紹介します! 普段開発を進めていると、本番のデータを利用したいと思うことがよくあったりしますよね?

例えばロジクラでは

  • 顧客からの不具合問い合わせの検証
  • 新機能の仕様検証
  • 新機能のパフォーマンス検証
  • ...etc

などなど、色々なタイミングで本番データを利用したいと思うタイミングがあります。

ただし手動でやろうとすると、本番環境のデータベース周りを触ることになるのでセキュリティ上のリスクや誤操作のリスクがかなり高く、なかなか気軽にできません。

ロジクラではこういった課題をクリアし、誰でも本番データを利用できるような仕組みを作ったので今回はそちらを紹介します!

仕組みの概要

冒頭にいったような、セキュリティ上のリスクや誤操作のリスクを回避し、手軽に本番データが利用できるようにするため、開発者が簡単なアクションをするだけで本番データをマスキングしたデータが入ったデータベース ( 社内ではcloneDB と呼んでいます) を立ち上げ、stagingDev環境からそれを確認できるようにすることをソリューションとしました。

処理の実行には、いつものように github actoinsを利用しています。 github actionsでは以下のようなスクリプトを叩いています。

DBの複製

#!/bin/sh
export AWS_PAGER=""

usage () { echo "Usage : $0 -c <CLONE_DB_CLUSTER_IDENTIFIER> -i <CLONE_DB_INSTANCE_IDENTIFIER> -P <MASTER_USER_PASSWORD>"; }
while getopts c:i:p: OPT
do
  case $OPT in
    c) CLONE_DB_CLUSTER_IDENTIFIER=$OPTARG
      ;;
    i) CLONE_DB_INSTANCE_IDENTIFIER=$OPTARG
      ;;
    p) MASTER_USER_PASSWORD=$OPTARG
      ;;
  esac
done

if [ ! "$CLONE_DB_CLUSTER_IDENTIFIER" ] || [ ! "$CLONE_DB_INSTANCE_IDENTIFIER" ] || [ ! "$MASTER_USER_PASSWORD" ]
then
  usage
  exit 1
fi

DB_SUBNET_GROUP_NAME=logikura-xxx
VPS_SECURITY_GROUP_ID=sg-xxx
SOURCE_DB_CLUSTER_IDENTIFIER=logikura-xxx

# DBClusterのclone
echo "cloning database..."
aws rds restore-db-cluster-to-point-in-time \
  --source-db-cluster-identifier $SOURCE_DB_CLUSTER_IDENTIFIER \
  --db-cluster-identifier $CLONE_DB_CLUSTER_IDENTIFIER \
  --restore-type copy-on-write \
  --use-latest-restorable-time \
  --db-subnet-group-name $DB_SUBNET_GROUP_NAME \
  --vpc-security-group-ids $VPS_SECURITY_GROUP_ID

## DBClusterにDBInstanceを作成
echo "creating database instance..."
aws rds create-db-instance \
  --db-instance-identifier $CLONE_DB_INSTANCE_IDENTIFIER \
  --db-cluster-identifier $CLONE_DB_CLUSTER_IDENTIFIER \
  --db-instance-class db.t3.medium \
  --engine aurora-postgresql
aws rds wait db-instance-available --db-instance-identifier $CLONE_DB_INSTANCE_IDENTIFIER
aws rds modify-db-cluster \
  --db-cluster-identifier $CLONE_DB_CLUSTER_IDENTIFIER \
  --master-user-password "${MASTER_USER_PASSWORD}" \
  --apply-immediately

すでにあるDBをリストアしています。コマンドの詳細は公式のドキュメント をご覧ください!

ただしこのままでは本番のデータがそのまま利用できてしまうのでセキュアではありません。問題に対応するため、隠しておきたいデータをマスキングする処理を実行しています。

マスキング

#!/usr/bin/env ruby
require 'optparse'
require 'securerandom'

clone_db_host = nil
opt = OptionParser.new
OptionParser.new do |opt|
  opt.on('--clone-db-host VALUE', 'clone db host name') { |v| clone_db_host = v  }
  opt.parse(ARGV)
end
raise "required clone_db_host" if clone_db_host.blank?

settings = YAML.load_file("config/settings/masking.yml")

raise "saftiy" if Rails.env.production?
raise "saftiy" unless clone_db_host.match(/clone/)

ActiveRecord::Base.establish_connection(
  ActiveRecord::Base.connection_config.merge(host: clone_db_host, database: "logikura_production"),
)
settings["tables"].each do |table_name, column_names|
  sql = "UPDATE #{table_name} SET"
  update_terms = column_names.map do |column_name|
    "#{column_name} = uuid_generate_v4()"
  end
  ActiveRecord::Base.connection.execute("UPDATE #{table_name} SET #{update_terms.join(', ')}")
end

ymlにtableとcolumnの定義を買いてuuidで埋めてるシンプルな実装です。

以上を実行するとこで、本番相当のデータを安全に利用することができます!

最後にgithub actionでdbのエンドポイントをコメントするようにしているので、そのエンドポイントを利用して検証などを進めています 🎉

f:id:logikura:20211229133344p:plain

エンジニア以外での利用

前回の記事 で検証環境( 通称stagingDev環境 )をbranchごとに手軽に作る仕組みを紹介させて頂きましたが、staginDevの立ち上げ処理には環境変数を設定できるフックポイントがあります。

test -f staging_dev.env && export $(cat staging_dev.env)
if [ -e "./deploy/staging_dev_env/${STAGING_DEV_BRANCH}.env" ]; then
  export $(cat ./deploy/staging_dev_env/${STAGING_DEV_BRANCH}.env | grep -v ^# | xargs);
fi

これを利用して、 branch_name.env

DB_HOST=xxx

のように書いておくと、立ち上げた環境が接続するDBホストの値をoverrideして変更することができます。 検証環境で手軽に本番データを扱うことができるので、開発者だけではなくカスタマーサクセスのメンバーやセールスのメンバーも、マスキングされた安全なデータを問い合わせの対応や機能検証の際に気楽に使うことができます!

まとめ

本番とほぼ同じデータをいつでも利用できるようにしたことで、より正確な検証を行うことができ、顧客への対応や機能リリーススピードが改善しました 🙌 ローカルやstagingだとレコード数が少ないので常に高速に動いてる感じになりますが、実際にお客さんの環境を再現することでボトルネックに気づけることがあります。

また、ロジクラの開発チームでは週に1度パフォーマンス改善の取り組みをチームで行っているのですが、その際の検証環境としても本番環境のデータをcloneしたデータベースが施策の検証のために役立っています!

スタートアップのフェーズでは機能開発に追われがちですが、このような基盤の改善を進めることでさらに開発スピードをあげていき、より良いサービスの提供を進めていっています 👍

最後に

ロジクラでは一緒に開発してくれるメンバーを募集しています!

マスキングスクリプト実行に時間がかかるので、もっと良いソリューションある方 & ロジクラに興味ある方はぜひ こちら をご覧ください!