はじめに
個人で運営しているRailsアプリケーションでDBにPostgreSQLを使用しています。
データ数が多くなってきたため、本番と同等のデータで開発をしたく本記事では、本番環境のバックアップとローカル環境での復元方法の手順を記述しています。
概要図
1 本番環境のサーバーでバックアップコマンドを使用してdumpファイルを取得します。
2 dumpファイルをS3へアップロードします。
3 ローカル環境にてS3バケットからdumpファイルをダウンロードします。
4 ダウンロードしたdumpファイルをローカル環境のDBへリストアします。
本番環境でのバックアップ
下記スクリプトを用意して、本番環境のサーバーにて実行します。
backup.sh
#!/bin/bash
source ~/.bashrc
# スクリプトのディレクトリを取得
script_dir=$(dirname "$0")
# 「Backup」ディレクトリを作成
backup_dir="$script_dir/backup"
mkdir -p "$backup_dir"
# バックアップファイルの保存先とファイル名を指定
DATE=$(date +%Y%m%d_%H%M%S)
backup_file="$backup_dir/db_schema_${DATE}.dump"
# データベース接続情報を指定
host="$DB_HOST"
port="$PORT"
username="$DATABASE_USERNAME"
database="$DATABASE_NAME"
password="$DATABASE_PASSWORD"
# pg_dumpコマンドを実行してバックアップを作成
PGPASSWORD="$password" pg_dump --file "$backup_file" --host "$host" --port "$port" --username "$username" --verbose --format=c --blobs --no-owner --no-privileges --inserts --encoding "UTF8" --schema "public" "$database"
# S3へアップロード
sudo aws s3 cp "$backup_file" s3://[サービス名]/production/
ローカル環境での復元
restore.shell
#!/bin/bash
# S3バケット名とプレフィックス(ディレクトリパス)を指定
bucket_name=[バケット名]
prefix="production/"
# S3バケット内のオブジェクト一覧を取得し、最新のオブジェクトを検索
latest_object=$(aws s3api list-objects-v2 --profile [プロファイル名] --bucket "$bucket_name" --prefix "$prefix" --query "sort_by(Contents, &LastModified) | [-1]" --output json)
# 最新のオブジェクトからファイル名を取得
latest_object_key=$(echo "$latest_object" | jq -r '.Key')
# ダウンロードするファイルの名前を動的に設定(ここではオブジェクトキーの末尾を使用)
backup_file="downloaded_files/$(basename "$latest_object_key")"
# S3からファイルをダウンロード
aws s3 cp "s3://$bucket_name/$latest_object_key" "$backup_file" --profile [プロファイル名]
# データベース接続情報を指定
host="db"
port="5432"
username=[ユーザー名]
password=[パスワード]
database=[サービス名]
# pg_restoreコマンドを実行してバックアップを作成
PGPASSWORD="$password" pg_restore --host "$host" --port "$port" --username "$username" --dbname "$database" --no-owner --no-privileges --clean --verbose --schema "public" "$backup_file"
注意点
-
環境変数の取り扱い: 上記のスクリプトは環境変数を利用しています。これらの変数が正しく設定されていることを確認してください。また、パスワードなどの機密情報は公開しないようにしましょう。
-
sudoの使用: sudoを使用してS3にファイルをアップロードしていますが、必要に応じて適切な権限を持つユーザーで操作することを推奨します。
-
データの取り扱い: 本番環境のデータは機密情報を含む場合があります。取り扱いには十分注意し、不必要に外部に公開しないよう心がけてください。