前提
目的
サーバデータの定期バックアップ
手法
- バックアップ先
- S3
- データ
- zip化
- 間隔
- cron
- 過去分
- 指定個数だけ保持
- それ以上のものは自動で削除
準備
aws側
awsの認証情報の作成
- セキュリティ認証情報
- サーバからS3へアクセスするために必要
- 発行URL
- 再発行不可能
S3に保存場所を作成
サーバ側
パッケージインストール
yum install -y zip
aws cliのインストール
- aws cli
- CLIでAWSを操作するための公式ライブラリ
- セキュリティ認証情報を登録することで有効化
- 実行したユーザに基づいて紐づけられる
- 下記を統一
- バックアップshellの実行権限を持つユーザ
- 「aws configure」を実行して、認証情報を紐づけるユーザ
- cronにバックアップshellを設定するユーザ
CentOS7
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install awscli
aws configure
CentOS6
pythonは2.7以上必須
yum install -y centos-release-scl-rh
yum install -y python27
scl enable python27 bash
curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip install awscli --upgrade
aws configure
実装
環境に応じて変更する個所
- 保存ディレクトリ
- s3ディレクトリ
- 保存上限個数
- バックアップ対象
コード
#!/bin/sh
# 対象名
SRC_NAME=cs
# 保存ディレクトリ
DIR_TMP=/home/centos/backup
# S3ディレクトリ
DIR_S3=s3://backup
# 保存上限個数
LIMIT=3
# 前回ファイル削除
rm -rf $DIR_TMP/$SRC_NAME/*
# 日時取得
TODAY=`date +%Y%m%d%H%M`
# ディレクトリ作成
mkdir -p $DIR_TMP/$SRC_NAME/$TODAY
# 情報取得
cp -r /var/www/html $DIR_TMP/$SRC_NAME/$TODAY
mysqldump -u mysql -r $DIR_TMP/$SRC_NAME/$TODAY/mysqldump.sql --single-transaction --default-character-set=binary -B table_name
# 圧縮
zip -r $DIR_TMP/$SRC_NAME/$TODAY.zip $DIR_TMP/$SRC_NAME/$TODAY
# 転送
aws s3 cp $DIR_TMP/$SRC_NAME/$TODAY.zip $DIR_S3/$SRC_NAME/
# 過程ファイル削除(念のため、zipは次回まで残す)
rm -rf $DIR_TMP/$SRC_NAME/$TODAY
# 期限切れファイル削除
COUNT=0
for l in `aws s3 ls $DIR_S3/$SRC_NAME/ | sort -nr`; do
if echo $l | grep "zip"; then
# 上限以上のファイル削除
if [[ $COUNT -ge $LIMIT ]]; then
aws s3 rm $DIR_S3/$SRC_NAME/$l
fi
# カウンタ更新
COUNT=$(( COUNT + 1 ))
fi
done
cron設定
crontab -e
0 1 * * * sh /home/centos/backup.sh