Очередной подход к бекапу больших файлов на Amazon S3. Когда возникла необходимость сделать зеркало бекапов на Amazon S3 я обнаружил что s3cmd все еще не знает как заливать файлы свыше 5GB на Amazon S3, хотя API начал поддерживать объекты размером до 5TB.
Для меня загадка почему в интернете почти нету готовых bash-скриптов для бекапа файлов свыше 5GB на Amazon S3 используя s3cmd. Либо все заливают бекапы используя duplicity или аналоги, либо у всех маленькие бекапы. Пришлось писать самому. Скрипт довольно простой и требует только наличия s3cmd.
#!/usr/local/bin/bash
FILES_DIR="/usr/backup/files_month" # Директория с бекапами
S3_TMP="/usr/backup/to_s3" # Временная директория
S3_BUCKET="my.bucket" # S3 Бакет
if [ ! -d "$FILES_DIR" ]; then
echo "Path '$FILES_DIR' is incorrect."
exit 1
fi
if [ ! -d "$S3_TMP" ]; then
echo "Path '$S3_TMP' is incorrect."
exit 1
fi
rm -rf "$S3_TMP/*"
cd "$FILES_DIR"
for i in `find . -type f -name "*.gz"`;
do
FILE_NAME=$(basename "$i");
FILE_SIZE=$(stat -f %z $i);
DIR_NAME=$(dirname "$i");
DESTINATION="$S3_TMP${DIR_NAME:1}/";
mkdir -p "$DESTINATION"
# Тут regexp для игнорирования некоторых папок/файлов
# в моем случае это папки user_testing и tmp
if [[ "$i" =~ (user_testing|tmp) ]]; then
echo "[ Ignored ]: $i";
elif [ $FILE_SIZE -gt 4200000000 ]; then
echo "[ Split ]: $i"
split -b 4G "$i" "${DESTINATION}${FILE_NAME}."
else
echo "[ Copy ]: $i -> ${DESTINATION}${FILE_NAME}"
cp "$i" "$DESTINATION$FILE_NAME";
fi
done
s3cmd sync \
--skip-existing \
--delete-removed \
"$S3_TMP/" \
"s3://$S3_BUCKET/"