Я управляю Экземпляр с поддержкой EBS который действует как сервер сборки группы разработчиков программного обеспечения (на котором работает Jenkins и множество других сервисов). Сервер работает Linux (последняя версия Ubuntu от официальные AMI).
Я бы хотел взять регулярные автоматические снимки тома EBS, связанного с экземпляром. Мне нужно хранить только одну последнюю резервную копию (т.е. старые снимки следует удалять), и лучше всего один раз в день.
Кажется, что Amazon не предоставляет такую услугу резервного копирования из коробки, поэтому вам придется либо использовать сторонние скрипты, либо использовать собственное решение.
У меня вопрос, как это сделать проще всего? Хотелось бы минимального количества хлопот, настроек и внешних зависимостей. Насколько мне известно, установка этого сценария в качестве синхронизированного сценария в самой системе Linux является допустимым вариантом.
Основываясь на концепции Джоника, я создал скрипт python с помощью boto. Вы предоставляете ему список томов для создания моментальных снимков и количество конечных снимков для каждого тома:
# Define the snapshots manage. We'll snapshot the specified volume ID, and only keep the X newest ones.
snapshots = [("vol-XXXXXXXX", 30), ("vol-YYYYYYYY", 180)]
import boto.ec2
auth = {"aws_access_key_id": "YOURACCESSKEY", "aws_secret_access_key": "YOURSECRETKEY"}
ec2 = boto.ec2.connect_to_region("YOURREGIONNAME", **auth)
description = "automated backup"
for volume, num_trailing in snapshots:
snaps = ec2.get_all_snapshots(filters={"volume-id": volume, "description": description})
print "%s: Creating new snapshot. %s automated snapshots currently exist." % (volume, len(snaps))
ec2.create_snapshot(volume, description)
purgeable = sorted(snaps, key=lambda x: x.start_time)[:-num_trailing]
print "Deleting snapshots for %s > %s: %s" % (volume, num_trailing, purgeable)
for snap in purgeable:
ec2.delete_snapshot(snap.id)
Я установил это как задание Jenkins (через плагин Python), настроенное на ежедневное выполнение. Если вы используете IAM для управления учетными данными, обратите внимание, что это потребуется в политиках ec2: DescribeRegions, DescribeVolumes, CreateSnapshot, DeleteSnapshot, DescribeSnapshots, CreateTags (из-за реализации Boto).
Ладно, чего бы это ни стоило, вот что я сделал. Я надеюсь, что мои слабые скрипты побудят людей публиковать лучшие решения!
Я написал два простых сценария bash и автоматизировал их с помощью cron. (Сейчас я запускаю их на локальном сервере, так как считать (?) Не рекомендуется помещать сертификаты AWS в сами экземпляры / AMI / EBS.)
Чтобы создать новый снимок:
# ESB volume associated with the instance we want to back up:
EBS_VOL_ID=vol-xxxxyyyy
ec2-create-snapshot --region eu-west-1 -K pk.pem -C cert.pem -d "Automated backup" $EBS_VOL_ID
Чтобы удалить все, кроме последнего снимка:
EBS_VOL_ID=vol-xxxxyyyy
ec2-describe-snapshots --region eu-west-1 -K pk.pem -C cert.pem | grep "Automated backup" | grep "$EBS_VOL_ID" | awk '{ print $5 "\t" $2 }' | sort > .snapshots
latest_id=$(tail -n1 .snapshots | awk '{ print $2 }')
cat .snapshots | awk '{ print $2 }' > .snapshot_ids
for i in $(cat .snapshot_ids)
do
if [ "$i" != "$latest_id" ]
then
echo "Deleting snapshot $i"
ec2-delete-snapshot --region eu-west-1 -K pk.pem -C cert.pem $i
fi
done
(Это анализирует соответствующую информацию о снимках из ec2-describe-snapshots
output и создает временный файл с записями [timestamp tab snapshot-id] (например, 2011-06-01T10:24:36+0000 snap-60507609
), где самый новый снимок находится в последней строке.)
Ноты:
--region
со всеми командами. В противном случае, например, ec2-create-snapshot
произойдет сбой, если идентификатор тома неизвестен. (YMMV, если вы используете регион по умолчанию «us-east-1».)Отказ от ответственности: для меня это стало отчасти упражнением в программировании на Bash / Unix, особенно в сценарии сокращения. Я с готовностью признаю, что вы, скорее всего, получите гораздо более четкий результат, например, Python, когда вам нужна логика типа «сделать что-нибудь для всех, кроме последнего элемента в списке». И даже с Bash вы, вероятно, могли бы сделать это более элегантно (например, вам действительно не нужны временные файлы). Так, пожалуйста, не стесняйтесь публиковать другие решения!
Я расширил идею сценария Джоника, чтобы сохранить несколько снимков. Код слишком длинный, чтобы уместиться в комментарии, поэтому я добавляю новый ответ. В этом коде предполагается, что для инструментов CLI настроены все правильные переменные среды. Кроме того, по умолчанию делается снимок текущего экземпляра.
# Look up our instance ID using the magic URL
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# The number of previous backups we want to keep
N=3
# get list of locally attached volumes via EC2 API:
VOLUME_LIST=$(ec2-describe-volumes | grep ${INSTANCE_ID} | awk '{ print $2 }')
DATE=$(date '+%Y-%m-%d-%H%M%S')
sync
# actually creating the snapshots
for VOLUME in $(echo $VOLUME_LIST); do
echo "Processing volume $VOLUME"
SNAPSHOT_LIST=$(ec2-describe-snapshots | grep completed | grep "Automatic snapshot" | grep $VOLUME | awk '{print $5 "\t" $2}' | sort | head "--lines=-$N" | awk '{print $2}')
ec2-create-snapshot $VOLUME -d "Automatic snapshot on $DATE"
for SNAPSHOT in $(echo $SNAPSHOT_LIST); do
ec2-delete-snapshot $SNAPSHOT
done
done
Если вы открыты для внешних коммунальных услуг, проверьте Skeddly.
Раскрытие: Я генеральный директор Eleven41 Software, компании, стоящей за Skeddly.
Я написал сценарий на PHP, который автоматизирует снимки состояния EBS и удалит старые. Он даже отправит вам результаты снимков по электронной почте. Вы должны настроить AWS PHP SDK и PHPMailer для работы с электронной почтой, но оба эти шага довольно просты. Затем вы просто запускаете сценарий каждую ночь с помощью CRON или запланированных задач Windows. Подробные инструкции и код можно найти в моем блоге: