Скрипт для резервного копирования EC2-instance в AMI

Скрипт для резервного копирования EC2-instance в AMI

338
ПОДЕЛИТЬСЯ

Всем привет.

Желаю поделиться скриптом для $subj. Может быть, кому-то он окажется полезен.

Постановка задачки: есть некое количество EC2-серверов в AWS , разбросанных по различным регионам. Требуется заавтоматизировать их резервное копирование так, чтоб восстановление было легким и скорым.

Фактически, сам скрипт: ec2-automate-backup2ami.sh
Описание: README.backup2ami.md
Скрипт-обертка для пуска по крону: ec2-backup-wrapper.sh

Для работы скрипта предварительно нужно:

Установить пакет ec2-api-tools (у меня он версии 1.6.7.3)
Подредактировать скрипт-обертку, указав путь к ec2-automate-backup2ami.sh и к лог-файлу
Сделать в AWS IAM отдельного юзера для бэкапов и назначить ему похожую политику:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1389911824000",
"Effect": "Allow",
"Action": [
"ec2:CreateImage",
"ec2:CreateSnapshot",
"ec2:CreateTags",
"ec2:DeleteSnapshot",
"ec2:DeregisterImage",
"ec2:DescribeRegions",
"ec2:DescribeSnapshotAttribute",
"ec2:ModifySnapshotAttribute",
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeSnapshots",
"ec2:DescribeTags",
"ec2:DescribeVolumeAttribute",
"ec2:DescribeVolumeStatus",
"ec2:DescribeVolumes"
],
"Resource": [
"*"
]
}
]
}

Сделать файл с параметрами доступа для сделанного юзера:
[ec2-user@zenoss ~]$ cat .stage
export AWS_ACCESS_KEY=access_key
export AWS_SECRET_KEY=secret_key
export AWS_ACCESS_KEY_ID=access_key
export AWS_SECRET_ACCESS_KEY=secret_key
Указать EC2_HOME
Пометить каждый инстанс, требующий бэкапа, тэгом Backup со значением true

Кронтаб смотрится приблизительно так:
[ec2-user@backup ~]$ crontab -l
PATH=$PATH:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
EC2_HOME=/usr/local
SHELL=/bin/bash

00 2 * * * ./ec2-backup-wrapper.sh stage "alerts1@mydomain.cc alerts2@mydomain.cc"

В случае ошибки выполнения он будет выслан на указанные почтовые адреса. Итог работы скрипта записывается в лог-файл вида ec2-automate-backup2ami.stage.log.

Стоит направить внимание, что файл с параметрами именуется .stage, а скрипт вызывается с заглавием без точки.

Опосля удачного выполнения, в AWS AMI покажется образ с именованием ec2ab_server.domain.cc_YYYY-MM-DD и со последующими тэгами:

Name — заглавие инстанса EC2
InitiatingHost — FQDN бэкап-сервера
PurgeAfterFE — дата удаления вида в формате unix time
PurgeAfter — дата удаления вида в формате YYYY-MM-DD (только для удобства администратора, скрипт употребляет PurgeAfterFE)
PurgeAllow — разрешает автоматическое удаление вида (по умолчанию — true)
Instance — ID инстанса EC2
Created — дата сотворения вида в формате YYYY-MM-DD

PS Скрипт сотворен на базе ec2-automate-backup (бэкап EBS-дисков, без итерации по регионам) от colinbjohnson, за что ему огромное спасибо!

PPS Может быть, под Mac OS/X скрипт будет работать некорректно (см. четвертую строку в функции get_purge_after_date()), но у меня способности проверить нет.

PPPS Перед созданием снэпшотов скрипт не сбрасывает буферы файловых систем, потому бэкап может оказаться неконсистентным. Для сотворения консистентных снэпшотов лучше применять ec2-consistent-snapshot habrahabr.ru