Pull to refresh

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

Reading time3 min
Views5.8K
Всем привет.

Хочу поделиться скриптом для $subj. Возможно, кому-то он окажется полезен.

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

Собственно, сам скрипт: ec2-automate-backup2ami.sh
Описание: README.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

UPD Добавлена возможность автоматического копирования созданных в процессе бэкапа образов AMI в другие регионы. Для включения этой опции в командной строке запуска скрипта необходимо указать ключ -y, а в настройки инстанса добавить соответствующий тэг. Регион выбирается перед созданием бэкапов случайным образом из всех возможных или из списка, заданного в командной строке ключом -o (разделитель — пробел). Иными словами, все копии попадут в один регион в рамках одного запуска скрипта.
Например:
/usr/local/bin/ec2-automate-backup2ami.sh -s tag -t "Backup=true" -k 14d -p -h -u -n -y "CopyRegion=true" -o "us-west-1 eu-west-1"

В приведенном примере скрипт:
  • забэкапит все инстансы, у которых присутствует тэг Backup со значением true (-s, -t)
  • удалит бэкапы, созданные более 13 дней назад (-k, -p)
  • добавит к бэкапу разные информационные тэги (-h, -u, -n)
  • скопирует все бэкапы в один случайно выбранный при старте скрипта регион из двух перечисленных (-y, -o)

Список названий регионов можно получить с помощью команды ec2-describe-regions.

После копирования к исходному AMI будет добавлен тэг CopyRegion со значением, соответствующем региону, куда он был скопирован. А к скопированному AMI — тэг SourceRegion, определяющий регион-источник.
Tags:
Hubs:
Total votes 9: ↑9 and ↓0+9
Comments0

Articles