Статьи

Автоматизация резервного копирования и восстановления экземпляров Amazon EC2, часть вторая

Часть вторая. Восстановление экземпляра EC2 по снимку.

Уровень умения: Средний.
Операционная система (ы): Linux.

Последний раз в первой части …

Мы остановились в конце первой части с запланированным моментальным снимком, запускаемым из cron Во второй части мы узнаем, как восстановить сбойный экземпляр EC2, поддерживаемый AWS EBS, из снимка всего несколькими командами.

Сценарии Бедствия

Каковы некоторые ситуации, которые заставили бы нас сделать полное восстановление экземпляра? Здесь только несколько:

  • Повреждение файловой системы
  • Вредоносное вторжение
  • Аппаратный сбой
  • Расширенное общее отключение Amazon, влияющее на ваш экземпляр, но не на другие
  • Человеческая ошибка

Сценарии восстановления

У вас есть другой экземпляр EC2

Это мой предпочтительный подход. Поскольку я поддерживаю несколько экземпляров, у них всех запущено резервное копирование cron Если у вас есть другой экземпляр, но на нем еще не установлены и не работают инструменты API EC2, ознакомьтесь с инструкцией по настройке этой части первой части.

У вас нет другого экземпляра

Ниже приведены некоторые возможные варианты для рассмотрения:

  • Создайте новый экземпляр T1.micro «только для администратора». Они довольно недорогие ежемесячно и все еще дают вам полную функциональность. Они достаточно дешевые, чтобы работать на полную ставку, поэтому вам не придется суетиться во время кризиса.
  • Используйте эти инструкции для клонирования существующего единственного экземпляра. Это может быть дорогостоящим, если вы работаете с большим экземпляром и делаете точную его бегущую копию. Менее дорогостоящим способом было бы клонировать экземпляр и оставить его выключенным до тех пор, пока он не понадобится.
  • Используйте вашу домашнюю систему для обеспечения функциональности. Пожалуйста, смотрите превосходный учебник Джона Дегнера для получения инструкций. Подробные инструкции для этого решения выходят за рамки этого учебного пособия, но эти примеры могут легко использоваться в этой ситуации.

Выберите метод — Консоль AWS или Командная строка

В этот учебник включены оба метода — GUI и CLI. У каждого есть свои преимущества, и я оставляю за вами выбор того, который вы предпочитаете

Предпосылки:

  • Успешное завершение первой части , в частности /opt/bin/instanceid/opt/bin/ec2do
  • Метод с графическим интерфейсом: доступ к веб-интерфейсу AWS Management Console
  • Метод CLI: root-доступ к работающему экземпляру Linux с поддержкой AWS EC2 EBS, например:
     ssh -i AWSKeyPair.pem ec2-user@{yourInstance_FQDN_or_IP}
    % sudo su
    root@yourInstance#

План графического интерфейса консоли управления AWS

  1. Соберите информацию о вашем экземпляре (ах).
  2. Соберите информацию о доступных снимках.
  3. Создайте образ машины Amazon (AMI) из выбранного снимка.
  4. Запустите новый экземпляр из только что созданного AMI.

Метод GUI: информация об экземпляре

Можно легко настроить столбцы в представлении «Экземпляр» для отображения именно того, что вам нужно:

  • Нажмите на Экземпляры в левом меню навигации.

  • Нажмите кнопку Показать / Скрыть справа

  • Выберите нужные столбцы и нажмите Применить

  • Найдите и запишите следующую информацию:
    Идентификатор AMI, имя корневого устройства, тип, группы безопасности, имя пары ключей и идентификатор ядра

  • Нажмите на AMI в левом меню навигации, затем введите идентификатор AMI из предыдущего шага в указанное поле. Этот AMI появится ниже. Нажмите кнопку «Показать / Скрыть», чтобы проверить архитектуру и корневое устройство, затем нажмите «Применить». Убедитесь, что корневым устройством является EBS, и запишите архитектуру:

Метод GUI: создание AMI из снимка

  • Нажмите «Снимки» в левом меню навигации, затем нажмите на заголовок столбца «Начинается», пока последние снимки не окажутся вверху. Прочитайте описания, пока не найдете тот, который является снимком файловой системы ROOT (/), BOOTABLE. Найдя его, нажмите на него один раз и убедитесь, что флажок в первом столбце отмечен. Также запишите емкость. Наконец, нажмите кнопку «Создать изображение».

  • Заполните форму с информацией, которую вы записали по пути и нажмите «Да, Создать».

Метод с графическим интерфейсом: запуск экземпляра из AMI

  • Нажмите на AMI в левом меню навигации, затем введите имя нового AMI в поле поиска. Щелкните один раз в строке и убедитесь, что флажок установлен в начале строки.

  • На этом этапе кнопка запуска должна быть включена. Нажмите на нее, и появится Мастер запросов экземпляров. Выберите желаемый тип экземпляра, затем нажмите «Продолжить»:

  • Далее укажите идентификатор ядра и установите флажок «Предотвращение случайного завершения», затем нажмите «Продолжить»:

  • Введите имя для нового AMI и нажмите «Продолжить»:

  • Выберите пару ключей, затем нажмите «Продолжить»:

  • Выберите или создайте группу безопасности, затем нажмите «Продолжить»:

  • Наконец, проверьте всю информацию, затем нажмите Launch:

Если вы зашли так далеко, то вы успешно клонировали экземпляр с помощью метода консоли GUI. Поздравляем!

План командной строки

  1. Установите примеры сценариев, найденные ниже.
  2. Соберите информацию о вашем экземпляре (ах).
  3. Соберите информацию о доступных снимках.
  4. Создайте экземпляр клона и запустите его.

Метод CLI: установка скрипта

Сценарии, приведенные в нижней части этого руководства, помогают автоматизировать каждый шаг процесса, предоставляя ключевые элементы рабочего процесса, которые позволяют нам быстро выполнить работу.

ВАЖНО: Пожалуйста, создайте каждый из этих сценариев в каталоге /opt/bin

Кроме того, убедитесь, что правильно настроили права на выполнение для всех новых скриптов:

 root@yourInstance# chmod 750 /opt/bin/*

Метод CLI: информация об экземпляре

Нам нужно собрать немного данных, прежде чем мы сможем продолжить. Рекомендуется хранить запись конфигурации экземпляра ПЕЧАТНОЙ и ЛЕГКО доступной. Параметр ‘-l’ (ell) указывает сценарию работать в режиме LOCAL, который выводит информацию только для текущего экземпляра, а также сообщает архитектуру ОС. Нелокальный вызов этого сценария НЕ предоставляет арку ОС.

 # /opt/bin/instanceinfo -l
ami=ami-31509058
arch=i686
device=/dev/sda1
group=Web-Server
instanceid=i-29765a07
kernel=aki-407d9529
keypair=AWSKeyPair
privatedns=ip-10-100-100-100.ec2.internal
privateip=10.100.100.100
publicdns=ec2-100-200-200-200.compute-1.amazonaws.com
publicip=100.200.200.200
region=us-east-1a
type=c1.medium
volume=vol-723ebc42

Метод CLI: информация о доступных снимках

Найти доступные снимки для нужного объема:

 # /opt/bin/ec2do describe-snapshots | grep {VOLUME_FROM_LAST_STEP}

Выберите снимок, который вы хотите использовать в качестве источника для клона, и перейдите к шагу создания клона!

Метод CLI: создание и запуск клона

 # /opt/bin/clone -a x86_64 -n "MY-AMI-FROM-SNAPSHOT" -d "AMI-FROM-SNAP-20110818" -r "/dev/sda1" -s "snap-248adc04" -kern aki-427d952b -z 10 -g "My-Security-Group" -t "t1.micro" -k "KeyPairNameHere"

Опции для / opt / bin / clone

— архитектура ОС (/ bin / arch)
-n Новое имя AMI
Новое описание AMI
-r корневое устройство
-s Снимок ID
идентификатор ядра
-z размер нового тома
-g Группа безопасности для использования в новом экземпляре
-t Тип экземпляра для запуска
-k пара ключей для использования в новом экземпляре

Если вы зашли так далеко, значит, вы успешно клонировали экземпляр, используя метод командной строки. Поздравляем!

Метод CLI: сценарии

ВАЖНО: Пожалуйста, создайте каждый из этих сценариев в каталоге /opt/bin
Кроме того, убедитесь, что правильно настроили права на выполнение для всех новых скриптов:

 root@yourInstance# chmod 750 /opt/bin/*

/ Опт / bin / instanceinfo

Вот простой Perl-скрипт для вывода списка элементов, которые нужно найти для каждого имеющегося у вас экземпляра:

 #!/usr/bin/perl
#
## instanceinfo
#
use strict;
$|  = 1;

my $args		= {};
$args->{'local'}	= 0;
$args->{'instanceid'}	= '';
while ($ARGV[0] =~ /^-/) {
	$_ = shift;
	$args->{'local'}	= 1,	next if /^-l$/;
}

if ($args->{'local'}) {
	$_	= `/opt/aws/bin/ec2-metadata -i`;
	$args->{'instanceid'}	= (split)[1];
}

open(IN,"/opt/bin/ec2do describe-instances $args->{instanceid} |") or die;

my $settings			= {};
chomp($settings->{1}->{'arch'}	= `/bin/arch`) if $args->{'local'};

my $counter	= 0;
while (<IN>) {
	if (/^RESERVATION/) {
		$counter ++;
		$settings->{$counter}->{'group'} = (split)[3];
	}
	if (/^INSTANCE/) {
		next unless /running/;
		my @line	= split;
		$settings->{$counter}->{'ami'} = $line[2];
		$settings->{$counter}->{'publicdns'} = $line[3];
		$settings->{$counter}->{'privatedns'} = $line[4];
		$settings->{$counter}->{'keypair'} = $line[6];
		$settings->{$counter}->{'type'} = $line[8];
		$settings->{$counter}->{'region'} = $line[10];
		$settings->{$counter}->{'kernel'} = $line[11];
		$settings->{$counter}->{'publicip'} = $line[13];
		$settings->{$counter}->{'privateip'} = $line[14];
	}
	if (/^BLOCKDEVICE/) {
		my @line	= split;
		$settings->{$counter}->{'device'} = $line[1];
		$settings->{$counter}->{'volume'} = $line[2];
	}
	if (/^TAG/ and /name/i) {
		$settings->{$counter}->{'name'} = (split)[4];
	}
}

foreach my $counter (sort keys %$settings) {
	print '='x60,"n$settings->{$counter}->{name}n",'='x60,"n";
	foreach my $key (sort keys %{$settings->{$counter}}) {
		print "$key=$settings->{$counter}->{$key}n";
	}
}

/ Опт / bin / ec2run

Эта оболочка сценария просто позволяет нам запускать новый экземпляр, когда нам нужно, с надлежащей средой в любое время.

Пожалуйста, не забудьте изменить пример ниже, чтобы включить вашу конкретную информацию.

 #!/bin/bash
#
## ec2run Wrapper
#
export EC2_HOME='/opt/aws/apitools/ec2'  # Make sure you use the API tools, not the AMI tools
export EC2_BIN=$EC2_HOME/bin
export EC2_PRIVATE_KEY=/root/.ec2/pk-{your_32_char_rand}.pem
export EC2_CERT=/root/.ec2/cert-{your_32_char_rand}.pem
export PATH=$PATH:$EC2_BIN
export JAVA_HOME=/usr/java/latest
/opt/aws/bin/ec2run $*

/ Opt / бен / клон

Основным сценарием оболочки для этого урока является clone

Пожалуйста, не забудьте изменить пример ниже, чтобы включить вашу конкретную информацию.

 #!/usr/bin/perl
#
## clone
#
use strict;
$|	= 1; # unbuffered output

#######################################################################################################
## some defaults - change these to match your environment, or override from the command line

my $settings	= {};
$settings->{'snap'}	= '';
$settings->{'name'}	= '';
$settings->{'desc'}	= '';
$settings->{'key'}	= 'AWSKeyPair';
$settings->{'type'}	= 't1.micro';
$settings->{'kern'}	= 'aki-427d952b';
$settings->{'arch'}	= 'x86_64';
$settings->{'size'}	= 10;
$settings->{'group'}	= 'Production';
$settings->{'root'}	= '/dev/sda1';

#######################################################################################################
## Process the command line
while ($ARGV[0] =~ /^-/) {
	$_ = shift;
	$settings->{'arch'}	= shift,	next if /^-a$/;
	$settings->{'desc'}	= shift,	next if /^-d$/;
	$settings->{'key'}	= shift,	next if /^-k$/;
	$settings->{'kern'}	= shift,	next if /^-kern$/;
	$settings->{'name'}	= shift,	next if /^-n$/;
	$settings->{'snap'}	= shift,	next if /^-s$/;
	$settings->{'type'}	= shift,	next if /^-t$/;
	$settings->{'size'}	= shift,	next if /^-z$/;
	$settings->{'group'}	= shift,	next if /^-g$/;
	$settings->{'root'}	= shift,	next if /^-r$/;
}

#######################################################################################################
## more defaults...
chomp($settings->{'desc'}	= 'AMI-FROM-SNAPSHOT-' . `/bin/date '+%Y%m%d'`) unless $settings->{'desc'};

#######################################################################################################
## CREATE AN AMI LINKED TO THE SNAPSHOT
my $cmd	= qq|/opt/bin/ec2do register -n $settings->{name} -d $settings->{desc} --root-device-name $settings->{root} -b "$settings->{root}=$settings->{snap}" -a $settings->{arch} --kernel $settings->{kern}|;
print "Executing: $cmdn";
chomp($_ = `$cmd`);
my $ami	= (split)[1];
print "New AMI ID: $amin";

#######################################################################################################
## LAUNCH THE NEW AMI
$cmd	= qq|/opt/bin/ec2run $ami -b "$settings->{root}=snap-$settings->{snap}:$settings->{size}:true" -g $settings->{group} -t $settings->{type} -k $settings->{key}|;
print "Executing: $cmdn";
system($cmd);

print "Done.n";

Резюме

Поздравляем! Отличная работа — вы автоматизировали свое восстановление.

Ссылки на ресурсы

http://aws.amazon.com/ec2/faqs/
http://docs.amazonwebservices.com/AWSEC2/latest/CommandLineReference/
От нуля до облака: настройка песочницы EC2, часть 2

AlexGul изображения на Shutterstock