Первоначально опубликовано в моем блоге: 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://your-bucket-name /home/ubuntu/s3/your-bucket-name/
Преимущества:
- Масштабируемость - поддерживает огромные ведра 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 configure
Подготовка
Подготовим локальный каталог резервного копирования 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 the current date and time
echo '-----------------------------'
date
echo '-----------------------------'
echo ''
# Echo script initialization
echo 'Syncing remote S3 bucket...'
# Actually run the sync command (replace {BUCKET_NAME} with your S3 bucket name)
/usr/bin/aws s3 sync s3://{BUCKET_NAME} /home/ubuntu/s3/{BUCKET_NAME}/
# Echo script completion
echo 'Sync complete'
Не забудьте заменить {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
, как часто запускать наш сценарий и где он находится в локальной файловой системе, написав команду. Формат этой команды следующий:
m h dom mon dow command
Следующая команда настраивает 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, следуя этому руководству < / а>.
person
Elad Nava
schedule
03.10.2015