Назад | Перейти на главную страницу

Автоматические снимки экземпляра EC2 с поддержкой EBS и Ubuntu

Я управляю Экземпляр с поддержкой 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), где самый новый снимок находится в последней строке.)

Ноты:

  • Поместите свой сертификат X509 и закрытый ключ в то место, где скрипты могут их найти.
  • Вы должен явно указать --region со всеми командами. В противном случае, например, ec2-create-snapshot произойдет сбой, если идентификатор тома неизвестен. (YMMV, если вы используете регион по умолчанию «us-east-1».)
  • Я использовал описание снимка («Автоматическое резервное копирование») в качестве маркера, чтобы избежать удаления скриптом удаления других снимков рассматриваемого тома (например, снимков, связанных с AMI).

Отказ от ответственности: для меня это стало отчасти упражнением в программировании на 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. Подробные инструкции и код можно найти в моем блоге:

http://www.caleblloyd.com/software/automatically-take-ebs-snapshots-and-delete-old-ones-with-php-script/