Очередной подход к бекапу больших файлов на 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/"