Search Posts

Visits: 751

バックアップ環境を整備した際のメモ

参考:
post1 s3cmdを使ってEC2からS3にDBバックアップ
post2 AWS S3 s3cmd で WARNING: Upload failed が出てファイルがアップできない件
データベースのバックアップを取得し、S3へも転送しています。
ほとんど、post1の手順で良かったのですが、zipファイルがUSに転送されてしまい、エラーが発生。post2を参考に設定変更し対応しました。

1. バックアップ用のS3バケット作成

1-1. バックアップ保存用のバケット作成

AWSマネージメントコンソールのS3メニューにアクセスして、「Create Bucket」を選択

Bucket Name: backup
Region: Tokyo

「Set Up Logging」を選択してログの設定

Enabled: チェックをonに
Target Buckt: backup-xyz  # バッケト名称はS3内でユニークなので、個別の名称に変更
Target Prefix: log/       # log/以下にログが保存される

1-2. バックアップバケット用グループ作成

AWSマネージメントコンソールのIAMメニューにアクセスして、「Groups」、「Create New Group」を選択
Set Permissionsの設定では作成したバックアップバケットに対してのみ全権限を持つbackupグループを追加します
「Policy Generator」を選択し、以下のように3つの権限を設定(下図参照)
backup-xyzは、バケット名、任意の値だがユニークでないと登録できない

# 1つ目
Effect: Allow
AWS Service: Amazon S3
Actions: All Actions Selected
Amazon Resource Name(ARN): arn:aws:s3:::backup-xyz

# 2つ目
Effect: Allow
AWS Service: Amazon S3
Actions: All Actions Selected
Amazon Resource Name(ARN): arn:aws:s3:::backup-xyz/*

# 3つ目
Effect: Allow
AWS Service: Amazon S3
Actions: ListAllMyBuckets
Amazon Resource Name(ARN): arn:aws:s3:::*

1-3. バックアップS3バケット用ユーザ作成

IAMメニューにアクセスして「Users」、「Create New Users」を選択

Enter User Names: backup

ユーザ作成時に表示される Access Key ID と Secret Access Key をメモしておきます
ユーザ作成後、ユーザ名をクリックして詳細メニューを表示
タブメニューの「Groups」から、「Add User to Groups」を選択してユーザをbackupグループに割り当てます。

2. s3cmd設定

2-1. s3cmdインストール

sudo yum --enablerepo epel install s3cmd

2-2. アクセスキー、シークレットキー設定

s3cmd –configureを実行
基本はデフォルトでEnter
Use HTTPS protocolのみYesに

s3cmd --configure

Access Key: ユーザ作成時にメモしておいたAccess Key ID
Secret Key: ユーザ作成時にメモしておいたSecret Access Key

Encryption password: 何も入力せずにEnter
Path to GPG program [/usr/bin/gpg]:何も入力せずにEnter
Use HTTPS protocol [No]:Yes
HTTP proxy server name: 何も入力せずにEnter
Test access with supplied credentials? [Y/n] y
Save settings? [y/N] y

「※ 1-2.で s3:ListAllMyBucketsを許可していない場合、以下のようにエラーになるので注意」と書かれていました。
私の場合、rootで作業していたので、別のところに.s3cfgファイルができており、ec2-userでs3cmd実行したところ、同じエラーが発生しました。このファイルの内容は、後で変更する必要があったが、まずはec2-userで再度s3cmd –configureを実行しました。

2-3 .s3cfgファイル修正

次のエラーとなるため、修正

Test access with supplied credentials? [Y/n] y
Please wait...
ERROR: Test failed: 403 (AccessDenied): Access Denied

修正は、次の4カ所です。

bucket_location = ap-northeast-1
host_base = s3-ap-northeast-1.amazonaws.com
host_bucket = %(bucket)s.s3-ap-northeast-1.amazonaws.com
simpledb_host = sdb.ap-northeast-1.amazonaws.com

2-4. サンプルをアップロードしてみる

vi sample.txt
s3cmd put sample.txt s3://backup-xyz/

上記コマンドを実行後、バケットを見るとsample.txtが追加されています。

3. バックアップを登録

MySQL

dump_mysql.sh

#!/bin/bash
PERIOD=7
BACKUPDIR=/home/ec2-user/backups/sql
TODAY=`date '+%Y%m%d'`
EXPIRE=`date --date "$PERIOD days ago" +%Y%m%d`
# バックアップログファイル名
BACKUPLOG=/home/ec2-user/backups/log/backupMySQL$TODAY.log
EXPIRELOG=/home/ec2-user/backups/log/backupMySQL$EXPIRE.log

dump() {
        mysqldump -u{ユーザID} -p{パスワード} -x $DB > $BACKUPDIR/mySQL$DB$TODAY.sql
        gzip -f $BACKUPDIR/mySQL$DB$TODAY.sql
        s3cmd put -rr $BACKUPDIR/mySQL$DB$TODAY.sql.gz s3://backup-XYZ/sql/mySQL$DB$TODAY.sql.gz

        rm -f $BACKUPDIR/mySQL$DB$EXPIRE.sql.gz
        s3cmd del s3://backup-XYZ/sql/mySQL$DB$EXPIRE.sql.gz
        echo "`date` database $DB FINISHED" >> $BACKUPLOG
}

# バックアップログファイル作成
rm -f $EXPIRELOG
touch $BACKUPLOG
chmod 600 $BACKUPLOG

echo "`date` BACKUP START" >> $BACKUPLOG
DB={データベース名1}
dump
DB={データベース名2}
dump

… 必要なデータベースを繰り返し …

echo "`date` BACKUP END" >> $BACKUPLOG

exit $?

PostgreSQL

dump_pgsql.sh

#!/bin/bash
PERIOD=7
BACKUPDIR=/home/ec2-user/backups/sql
TODAY=`date '+%Y%m%d'`
EXPIRE=`date --date "$PERIOD days ago" +%Y%m%d`
# バックアップログファイル名
BACKUPLOG=/home/ec2-user/backups/log/backupPgSQL$TODAY.log
EXPIRELOG=/home/ec2-user/backups/log/backupPgSQL$EXPIRE.log

dump() {
        pg_dump -U{ ユーザID } $DB > $BACKUPDIR/pgSQL$DB$TODAY.sql
        gzip -f $BACKUPDIR/pgSQL$DB$TODAY.sql
        s3cmd put -rr $BACKUPDIR/pgSQL$DB$TODAY.sql.gz s3://backup-xyz/sql/pgSQL$DB$TODAY.sql.gz

        rm -f $BACKUPDIR/pgSQL$DB$EXPIR.sql.gz
        s3cmd del s3://backup-xyz/sql/pgSQL$DB$EXPIRE.sql.gz
        echo "`date` database $DB FINISHED" >> $BACKUPLOG
}

# バックアップログファイル作成
rm -f $EXPIRELOG
touch $BACKUPLOG
chmod 600 $BACKUPLOG

echo "`date` database BACKUP START" >> $BACKUPLOG
DB={データベース名1}
dump
DB={データベース名2}
dump

… 必要なデータベースを繰り返し …

echo "`date` database BACKUP FINISHED" >> $BACKUPLOG

exit $?

cron登録

crontabへの登録
ec2-userでコマンド実行

# crontab -e

crontab登録内容
深夜2:00と3:00に実行するように登録します。

00 2 * * * /home/ec2-user/backups/dump_pgsql.sh
00 3 * * * /home/ec2-user/backups/dump_mysql.sh

データベース回復手順

MySQL

S3からファイルをダウウロードし、回復先にアップロードします。
次に、bzip2で解凍します。

# gunzip -c mySQL{データベース名}YYYYMMDD.sql.gz >mySQL{データベース名}YYYYMMDD.sql

回復するデータベースを作成した後、mysqlを実行します。

# mysql -u root -p
Enter password:
mysql> CREATE DATABASE {データベース名} default character set utf8;
Query OK, 1 row affected
mysql> exit
Bye

そのあとで、

# mysql -u{ユーザID} -p{パスワード}  {データベース名} < mySQ{データベース名}YYYYMMDD.sql

PostgreSQL

S3からファイルをダウウロードし、回復先にアップロードします。
回復するデータベースを作成します。

# createdb -E UTF8 {データベース名} -U{ユーザID}

次のコマンドで解凍し、復元します。

# gunzip -c pgSQL{データベース名}YYYYMMDD.gz | psql -U{ユーザID}  {データベース名}

[参考]ITpro

rootでのs3cmd実行

ファイルのバックアップはrootで行うので、s3cmd実行のため、/root/.s3cfgへ~ec2-user/.s3cfgをコピーしました。

tar.bz2形式の圧縮と復元

[参考]ITpro

# tar cjvf package.tar.bz2 package-dir
# tar xjvf package.tar.bz2