14Room

みんな泣きながらオトナになったんだ。

ゾンビDBの作り方 at AWS

概要

開発メンバーからの要望で毎日、本番DBから取ったバックアップを元にデータをリフレッシュするDBを作りました。 何度データを壊しても次の朝には復活してるので社内ではコレをゾンビDBと呼んでいます。

やってることは、

1.定期的に取ってるsnapshotからvolumeを作成 2.mysql止める 3.古いvolumeをアンマウント 4.古いvolumeをdetach 5.新しいvolumeをattach 6.新しいvolumeをマウント 7.mysql起動

やりたいことはシンプルですが、awsから必要な情報を取ってくるのが少々面倒です。

前提条件

  • aws cliがインストールされている
  • IAM roleで実行サーバにEC2フルアクセス権限がついてる
  • DB_backup_20141205xxxみたいなスナップショットが存在する

シェルスクリプト

#!/bin/bash

date=`date +%Y%m%d%H`
DESCRIPTION="DB_backup_$date"
instance=`curl http://169.254.169.254/latest/meta-data/instance-id`


# Create new DB volume
snap=`/usr/local/bin/aws ec2 describe-snapshots --filters Name=description,Values=$DESCRIPTION"*" --query Snapshots[*].SnapshotId --output text`
VAR="$snap"
ary=($VAR)

attach_volume=`/usr/local/bin/aws ec2 create-volume --availability-zone us-east-1d --volume-type gp2 --snapshot-id ${ary[0]} --query VolumeId --output text`

# Stop mysql
sleep 10
sudo /usr/sbin/service mysql stop
#/sbin/swapoff /var/lib/mysql/swap

# Unmount
sleep 10
sudo /bin/umount -f /var/lib/mysql

# Detach old volume
sleep 10
detach_volume=`/usr/local/bin/aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$instance Name=attachment.device,Values=/dev/sdf --query Volumes[].Attachments[].[VolumeId] --output text`

/usr/local/bin/aws ec2 detach-volume --volume-id $detach_volume --instance-id $instance

# Attach new volume
sleep 60
/usr/local/bin/aws ec2 attach-volume --volume-id $attach_volume --instance-id $instance --device /dev/sdf

# Remount volume
sleep 60
sudo /bin/mount -a

# Start mysql
sleep 10
sudo /usr/sbin/service mysql start

# Delete old volume
/usr/local/bin/aws ec2 delete-volume --volume-id $detach_volume

その他

前の処理が完全に終わってなかったりするので適当にsleepを入れてます。