前提
- aws cliがインストールされていること
- バックアップ先S3に書き込み権限を持つIAMユーザのプロファイルが実行端末に設定されていること($ aws configure --profile プロファイル名)
- ログファイルはローテーションされていてファイル名にタイムスタンプが付与されていること。(本スクリプトはファイル名にタイムスタンプを付与しません)
環境
- Amazon Linux AMI release 2018.03
- aws-cli/1.15.83
- Python/2.7.14
- Linux/4.14.42-52.37.amzn1.x86_64
- botocore/1.10.82
実行結果
スクリプト内定義で指定したファイルが圧縮されてバックアップ先S3のバックアップ先ルートの年/月フォルダの下に格納されます。
(例. mybucket/backup/logs/2018/10/application.2018-10-10.zip)
元のファイルは所定日数(KEEP_DAYSで指定)を経過すると削除します。
※月をまたぐ時に前月分が当月にまざります。
bashスクリプト
#!/bin/bash
set -Ceu
export AWS_PROFILE=<プロファイル名>
AWS_CLI=/usr/bin/aws # $ which aws の実行結果を設定
TARGET_DIR=<バックアップ対象ログファイルが格納されているディレクトリのフルパス>
TARGET_FILE='application.20*.log' # ファイル名(正規表現)
# 元ファイル(および圧縮ファイル)の保持期間
KEEP_DAYS=2
# バックアップ先(年月はスクリプトで付与するので含めない)
S3_BACKUP_ROOT_DIR=<バケット名>/path/to
# 圧縮
find $TARGET_DIR -name $TARGET_FILE -type f -exec zip -r {}.zip {} \;
# S3ディレクトリと同期する。圧縮前のファイル(拡張子log)は同期しない
DIR_YEAR=`date '+%Y'`
DIR_MONTH=`date '+%m'`
$AWS_CLI s3 sync ${TARGET_DIR} s3://$S3_BACKUP_ROOT_DIR/$DIR_YEAR/$DIR_MONTH/ --acl private --exclude '*.log'
# 古いファイルの削除
find ${TARGET_DIR} -mtime +$KEEP_DAYS -exec rm -f {} \;