Первоначально опубликовано в моем блоге: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
Периодически синхронизируйте сегмент S3 с сервером EC2
Этого можно легко достичь, используя несколько утилит командной строки, которые позволяют синхронизировать удаленную корзину S3 с локальной файловой системой.
s3cmd
Сначала s3cmd
выглядело очень многообещающе. Однако после того, как я попробовал его на моем огромном ведре S3, он не смог масштабироваться, из-за ошибки Segmentation fault
. Тем не менее, он отлично работал с небольшими ведрами. Поскольку это не сработало для огромных ведер, я решил найти альтернативу.
s4cmd
Более новая, многопоточная альтернатива s3cmd
. Это выглядело даже более многообещающе, однако я заметил, что он продолжал повторно загружать файлы, которые уже присутствовали в локальной файловой системе. Это не то поведение, которого я ожидал от команды синхронизации. Он должен проверить, существует ли удаленный файл локально (проверка хэша / размера файла будет аккуратной), и пропустить его при следующем запуске синхронизации в том же целевом каталоге. Я открыл проблему ( bloomreach / s4cmd / # 46 ), чтобы сообщить об этом странном поведении. А пока я решил найти другую альтернативу.
awscli
И тут я нашел awscli
. Это официальный интерфейс командной строки Amazon для взаимодействия с различными облачными сервисами, включая S3.
Он предоставляет полезную команду синхронизации, которая быстро и легко загружает файлы удаленной корзины в вашу локальную файловую систему .
$ aws s3 sync s3: // имя-вашего-ведра / home / ubuntu / s3 / имя-вашего-ведра /
Льготы:
- Масштабируемость - поддерживает огромные ведра S3
- Многопоточность - быстрее синхронизирует файлы за счет использования нескольких потоков.
- Умный - синхронизирует только новые или обновленные файлы
- Быстро - благодаря многопоточности и интеллектуальному алгоритму синхронизации
Случайное удаление
Удобно, что sync
команда не удаляет файлы в папке назначения (локальной файловой системе), если они отсутствуют в источнике (корзина S3), и наоборот. Это идеально подходит для резервного копирования S3 - в случае удаления файлов из корзины, повторная синхронизация не удалит их локально. И если вы удалите локальный файл, он также не будет удален из исходного сегмента.
Настройка awscli в Ubuntu 14.04 LTS
Начнем с установки awscli
. Есть несколько способов сделать это, однако мне показалось, что проще всего установить его через apt-get
.
$ sudo apt-get install awscli
Конфигурация
Затем нам нужно настроить awscli
с помощью нашего идентификатора ключа доступа и секретного ключа, которые вы должны получить от IAM , создав пользователя и присоединив политику AmazonS3ReadOnlyAccess . Это также помешает вам или любому, кто получает доступ к этим учетным данным, удалить ваши файлы S3. Обязательно введите свой регион S3, например us-east-1
.
$ aws настроить
Подготовка
Подготовим локальный каталог резервного копирования S3, желательно в формате /home/ubuntu/s3/{BUCKET_NAME}
. Обязательно замените {BUCKET_NAME}
свое настоящее имя сегмента.
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}.
Начальная синхронизация
Давайте продолжим и синхронизируем ведро в первый раз с помощью следующей команды:
$ aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
Предполагая, что корзина существует, учетные данные и регион AWS верны, а целевая папка действительна, awscli
начнется загрузка всей корзины в локальную файловую систему.
В зависимости от размера корзины и вашего интернет-соединения это может занять от нескольких секунд до часов. Когда это будет сделано, мы продолжим и настроим автоматическое задание cron, чтобы поддерживать локальную копию корзины в актуальном состоянии.
Настройка Cron Job
Идите вперед и создайте sync.sh
файл в /home/ubuntu/s3
:
$ nano /home/ubuntu/s3/sync.sh
Скопируйте и вставьте следующий код в sync.sh
:
#! / bin / sh
# Отображение текущей даты и времени
эхо '-----------------------------'
Дата
эхо '-----------------------------'
эхо ''
# Инициализация эхо-скрипта
echo 'Синхронизация удаленного сегмента S3 ...'
# Фактически запустите команду синхронизации (замените {BUCKET_NAME} на имя вашей корзины S3)
/ usr / bin / aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
# Завершение эхо-скрипта
echo "Синхронизация завершена"
Не забудьте заменить {BUCKET_NAME} на имя вашего сегмента S3 дважды на протяжении всего сценария.
Совет от профессионалов: вы должны использовать /usr/bin/aws
ссылку на aws
двоичный файл, так как crontab
выполняет команды в ограниченной среде оболочки и не сможет найти исполняемый файл самостоятельно.
Затем убедитесь, что chmod
скрипт может быть выполнен crontab
.
$ sudo chmod + x /home/ubuntu/s3/sync.sh
Давайте попробуем запустить скрипт, чтобы убедиться, что он действительно работает:
$ /home/ubuntu/s3/sync.sh
Результат должен быть похож на этот:
Затем давайте отредактируем текущего пользователя, crontab
выполнив следующую команду:
$ crontab -e
Если это ваш первый запуск crontab -e
, вам необходимо выбрать предпочтительный редактор. Рекомендую выбрать, так nano
как с ним проще всего работать новичкам.
Частота синхронизации
Нам нужно указать, crontab
как часто запускать наш сценарий и где он находится в локальной файловой системе, написав команду. Формат этой команды следующий:
mh dom mon dow команда
Следующая команда настраивает crontab
запуск sync.sh
сценария каждый час (задается параметрами минута: 0 и час: *) и направляет выходные данные сценария в sync.log
файл в нашем s3
каталоге:
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
Вы должны добавить эту строку в конец crontab
редактируемого файла. Затем сохраните файл на диск, нажав Ctrl + W, а затем Enter . После этого вы можете выйти nano
, нажав Ctrl + X . crontab
теперь будет запускать задачу синхронизации каждый час.
Совет от профессионала: вы можете убедиться, что ежечасное задание cron выполняется успешно /home/ubuntu/s3/sync.log
, проверив его содержимое на предмет даты и времени выполнения и проверив журналы, чтобы увидеть, какие новые файлы были синхронизированы.
Все готово! Теперь ваша корзина S3 будет автоматически синхронизироваться с вашим сервером EC2 каждый час, и все будет в порядке. Обратите внимание, что со временем, когда ваша корзина S3 станет больше, вам, возможно, придется увеличить размер тома EBS вашего сервера EC2, чтобы разместить новые файлы. Вы всегда можете увеличить размер тома EBS, следуя этому руководству .