Как автоматически сделать снимок тома экземпляра Amazon EC2? - PullRequest
5 голосов
/ 12 марта 2012

Я пытаюсь сценарий для резервного копирования тома автоматически.

Я следую этому сценарию EBS-Snapshot.sh, найденному на github :

#!/bin/bash

# export EC2_HOME='/etc/ec2'  # Make sure you use the API tools, not the AMI tools
# export EC2_BIN=$EC2_HOME/bin
# export PATH=$PATH:$EC2_BIN
# I know all of the above is good to have solution, but not re-usable
# I have captured all of the above in a particular file and lemme execute it
source /etc/environment

PURGE_SNAPSHOT_IN_DAYS=10

EC2_BIN=$EC2_HOME/bin

# store the certificates and private key to your amazon account
MY_CERT='/path/to/certificate-file'
MY_KEY='/path/to/private-file'
# fetching the instance-id from the metadata repository
MY_INSTANCE_ID='your ec2-instance-id'

# temproary file
TMP_FILE='/tmp/rock-ebs-info.txt'

# get list of locally attached volumes via EC2 API:
$EC2_BIN/ec2-describe-volumes -C $MY_CERT -K $MY_KEY > $TMP_FILE
VOLUME_LIST=$(cat $TMP_FILE | grep ${MY_INSTANCE_ID} | awk '{ print $2 }')

sync

#create the snapshots
echo "Create EBS Volume Snapshot - Process started at $(date +%m-%d-%Y-%T)"
echo ""
echo $VOLUME_LIST
for volume in $(echo $VOLUME_LIST); do
   NAME=$(cat $TMP_FILE | grep Name | grep $volume | awk '{ print $5 }')
   DESC=$NAME-$(date +%m-%d-%Y)
   echo "Creating Snapshot for the volume: $volume with description: $DESC"
   echo "Snapshot info below:"
   $EC2_BIN/ec2-create-snapshot -C $MY_CERT -K $MY_KEY -d $DESC $volume
   echo ""
done

echo "Process ended at $(date +%m-%d-%Y-%T)"
echo ""

rm -f $TMP_FILE

#remove those snapshot which are $PURGE_SNAPSHOT_IN_DAYS old

У меня естьдва файла для аутентификации X509, идентификатор экземпляра, но я не понимаю сценарий и как параметризовать том, который я хочу резервировать.

Я не понимаю первую строку (источник) и EC2_BIN,При такой конфигурации он перечисляет все тома и делает снимок всех этих ...

Что касается комментария снимка, как я могу изменить эту строку, чтобы добавить текст?

DESC=$NAME-$(date +%m-%d-%Y)

Мне жаль, что я начинающий, но я не понимаю весь сценарий

РЕДАКТИРОВАТЬ:

Я получаю эту ошибку с этим новым кодом:

Создание снимка для тома: ([ec2-description-volume]) с описанием: -03-13-2012 Ниже приведена информация о снимке: Client.InvalidParameterValue: Value (([ec2-description-volume]))для параметра volumeId недопустимо.Ожидаемый: 'vol -...'.Процесс завершился в 03-13-2012-08: 11: 35 -

И это код:

#!/bin/bash

#Java home for debian default install path:
export JAVA_HOME=/usr
#add ec2 tools to default path
#export PATH=~/.ec2/bin:$PATH


#export EC2_HOME='/etc/ec2'  # Make sure you use the API tools, not the AMI tools
export EC2_BIN=/usr/bin/
#export PATH=$PATH:$EC2_BIN
# I know all of the above is good to have solution, but not re-usable
# I have captured all of the above in a particular file and lemme execute it
source /etc/environment

PURGE_SNAPSHOT_IN_DAYS=60

#EC2_BIN=$EC2_HOME/bin

# store the certificates and private key to your amazon account
MY_CERT='cert-xx.pem'
MY_KEY='pk-xx.pem'
# fetching the instance-id from the metadata repository

MY_INSTANCE_ID=`curl http://169.254.169.254/1.0/meta-data/instance-id`

# temproary file
TMP_FILE='/tmp/rock-ebs-info.txt'

# get list of locally attached volumes via EC2 API:
$EC2_BIN/ec2-describe-volumes -C $MY_CERT -K $MY_KEY > $TMP_FILE

#VOLUME_LIST=$(cat $TMP_FILE | grep ${MY_INSTANCE_ID} | awk '{ print $2 }')
VOLUME_LIST=(`ec2-describe-volumes --filter attachment.instance-id=$MY_INSTANCE_ID | awk '{ print $2 }'`)

sync

#create the snapshots
echo "Create EBS Volume Snapshot - Process started at $(date +%m-%d-%Y-%T)"
echo ""
echo $VOLUME_LIST
echo "-------------"
for volume in $(echo $VOLUME_LIST); do
   NAME=$(cat $TMP_FILE | grep Name | grep $volume | awk '{ print $5 }')
   DESC=$NAME-$(date +%m-%d-%Y)
   echo "Creating Snapshot for the volume: $volume with description: $DESC"
   echo "Snapshot info below:"
   $EC2_BIN/ec2-create-snapshot -C $MY_CERT -K $MY_KEY -d $DESC $volume
   echo ""
done

echo "Process ended at $(date +%m-%d-%Y-%T)"
echo ""

rm -f $TMP_FILE

#remove those snapshot which are $PURGE_SNAPSHOT_IN_DAYS old

Ответы [ 7 ]

9 голосов
/ 27 августа 2012

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

#!/bin/bash

# Set Environment Variables as cron doesn't load them
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export EC2_HOME=/usr
export EC2_BIN=/usr/bin/
export PATH=$PATH:$EC2_HOME/bin
export EC2_CERT=/home/ubuntu/.ec2/cert-SDFRTWFASDFQFEF.pem
export EC2_PRIVATE_KEY=/home/ubuntu/.ec2/pk-SDFRTWFASDFQFEF.pem
export EC2_URL=https://eu-west-1.ec2.amazonaws.com # Setup your availability zone here

# Get instance id of the current server instance
MY_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# get list of locally attached volumes 
VOLUMES=$(ec2-describe-volumes | grep ${MY_INSTANCE_ID} | awk '{ print $2 }')
echo "Instance-Id: $MY_INSTANCE_ID" 

    # Create a snapshot for all locally attached volumes
    LOG_FILE=/home/ubuntu/ebsbackup/ebsbackup.log
    echo "********** Starting backup for instance $MY_INSTANCE_ID" >> $LOG_FILE
    for VOLUME in $(echo $VOLUMES); do
        echo "Backup Volume:   $VOLUME" >> $LOG_FILE
        ec2-consistent-snapshot --aws-access-key-id ASDASDASDASD --aws-secret-access-key asdfdsfasdfasdfasdfasdf --mysql --mysql-host localhost --mysql-username root --mysql-password asdfasdfasdfasdfd --description "Backup ($MY_INSTANCE_ID) $(date +'%Y-%m-%d %H:%M:%S')" --region eu-west-1 $VOLUME
done
echo "********** Ran backup: $(date)" >> $LOG_FILE
echo "Completed"

Я устанавливаю cronjob в /etc/cron.d/ ebsbackup

01 * * * * ubuntu /home/ubuntu/.ec2/myscriptname

Это работает довольно хорошо для меня ...: -)

Надеюсь, это поможет вам, Себастьян

4 голосов
/ 12 марта 2012

Хорошо, хорошо,

  1. Первая строка, в которой он работает (источник).Это так же, как./ И т.д. / окружающая среда.В любом случае все, что он делает, - это загружает файл со списком переменных среды, которые требует amazon.По крайней мере, это то, что я предполагаю.
  2. Он делает этот сценарий намного сложнее, чем нужно.Ему не нужно запускать команду ec2-description-instances и сохранять вывод в файл, а затем выводить grep и т. Д. ...
  3. Вы можете поместить все, что хотите для DESC.Вы можете просто заменить все справа от = на любой текст, который вы хотите.Обязательно поставьте вокруг него кавычки.

Я бы изменил две вещи в этом скрипте.

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

    MY_INSTANCE_ID=`curl http://169.254.169.254/1.0/meta-data/instance-id`
    
  2. Вместо вызова ec2-description-volume и сохранения вывода во временный файл и т. Д. Просто используйтеотфильтруйте команду и скажите ей, какой идентификатор экземпляра вы хотите.

    VOLUME_LIST=(`ec2-describe-volumes --filter attachment.instance-id=$MY_INSTANCE_ID | awk '{ print $2 }'`)
    
1 голос
/ 22 апреля 2014

Я сталкивался со многими людьми, которые искали инструмент для администрирования снимков EBS. Я нашел несколько инструментов в интернете, но они были просто сценариями и неполными решениями. Наконец я решил создать программу более гибкую, централизованную и простую в администрировании.

Идея состоит в том, чтобы иметь централизованную программу для управления всеми моментальными снимками EBS (локальными для экземпляра или удаленных пользователей)

Я создал небольшую программу на Perl, https://github.com/sciclon/EBS_Snapshots

Некоторые функции: * Программа работает в режиме демона или скрипта (crontab)

  • Вы также можете выбрать только локально подключенные тома или удаленные устройства

  • Вы можете определить файл журнала

  • Вы можете определить для каждого объема количество снимков

  • Вы можете определить для каждого тома частоту среди них

  • Частота и количество будут работать как «циклический перебор», когда достигнут предел, удаляющий самый старый снимок.

  • Вы можете перенастроить за один шаг количество, которое я имею в виду, если у вас есть 6 снимков, и вы измените количество в 3, процесс перенастроит его автоматически.

  • Вы можете определить «предварительное» выполнение. Вы можете добавить свой код для выполнения перед выполнением снимка, например, вы хотели бы попытаться отключить том или остановить какую-либо службу, или, возможно, проверить загрузку экземпляра. , Родительский процесс будет ожидать код выхода, «0» означает успех, вы можете определить, продолжить или нет, в зависимости от кода выхода.

  • Вы можете определить выполнение "postscript" для выполнения любого сценария после создания снимка (например, по электронной почте с сообщением об этом)

  • Вы можете добавить «Защищенные снимки», чтобы пропустить определенный снимок, я имею в виду, что они будут «только для чтения» и никогда не будут удалены.

  • вы можете перенастроить скрипт «на лету», когда он работает в режиме демона, скрипт принимает сигналы и IPC.

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

0 голосов
/ 16 апреля 2018

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

Дополнительная информация Для создания правила

  1. Откройте консоль CloudWatch по адресу https://console.aws.amazon.com/cloudwatch/.

  2. На панели навигации выберите События, Создать правило.

Для источника события выполните следующие действия:

a. Choose Schedule.

b. Choose Fixed rate of and specify the schedule interval (for example, 5 minutes). Alternatively, choose Cron expression and specify a cron expression (for example, every 15 minutes Monday through Friday, starting at the current time).

Для целей выберите Добавить цель, а затем выберите EC2 Создать вызов API моментальных снимков.

В качестве идентификатора тома введите идентификатор тома целевого тома Amazon EBS.

Для разрешений AWS выберите вариант создания новой роли.Новая роль предоставляет встроенные целевые разрешения для доступа к ресурсам от вашего имени.

Выберите Настроить детали.

В качестве определения правила введите имя и описание дляrule.

Выберите Создать правило

0 голосов
/ 10 марта 2017

Я думаю, что лучший способ сейчас - использовать AWS Lambda для создания снимков ваших экземпляров EC2.Вы можете найти более подробную информацию по этой ссылке

http://www.iwss.co.uk/ec2-instance-snapshot-through-aws-lambda-function-using-phyton-2-7/

0 голосов
/ 20 февраля 2014

Я не знаю о вас, но я предпочитаю делать AMI вместо снимка.Этот сценарий возник из идеи Крейга, сотрудника Amazon.Они разрабатывали сценарий снимка под названием Arche.Этот скрипт прост - вы помечаете тег в экземпляре EC2, а тег Ec2 - AMIed.Я проверил это в моей среде.Вы можете изменить команды в этом скрипте, чтобы сделать резервную копию снимка.

Перед запуском сконфигурируйте переменные среды linux с ключами cert и pk.

#!/bin/bash
echo "AMI Backup is starting..."
echo "taking AMI Backup..."

day_of_year=$(date +%j)
week_of_year=$(date +%U)
week_of_year=$( printf "%.0f" $week_of_year )
year=$(date +%Y)

for INST in $(ec2-describe-instances --region=sa-east-1 --filter "tag:Backup=On" | awk '/^INSTANCE/ {print $2}')
do
        start_time=$(date +%R)
        ami=$(ec2-create-image $INST --name $INST$week_of_year --no-reboot | awk '{print $2}')
        ec2-create-tags $ami --tag Day_Year=$day_of_year > /dev/null
        ec2-create-tags $ami --tag Week_Year=$week_of_year > /dev/null
        ec2-create-tags $ami --tag Src_Instance=$INST > /dev/null
        ec2-create-tags $ami --tag Start_Time=$start_time > /dev/null
        end_time=$(date +%R)
        ec2-create-tags $ami --tag End_Time=$end_time > /dev/null
        echo "Created AMI $ami for volume $INST"
done

year=$(date +%Y)
expire_day=`expr $day_of_year  -  2`
expire_week=`expr $week_of_year  -  2`


echo "identifying AMI to be deleted"
for delete in $(ec2-describe-images --filter "tag:Week_Year=$expire_week" | awk '{ print $2;exit;}')
do
        ec2dereg $delete
        echo "deleted $delete"
done
0 голосов
/ 11 января 2014

Вот функция, которую я написал в Ruby, чтобы сделать снимок всех томов во всех экземплярах во всех регионах.

require 'aws-sdk'

def snapshot_all_attached_volumes(region)
  # For every instance in this region
  AWS::EC2.new(:region => region).instances.each do |instance|
    # get all the attached volumes
    instance.attachments.each do |mountpoint, attachment|
      # and create snapshots
      attachment.volume.create_snapshot(description = "Automated snapshot #{HOSTNAME}:#{$0}")
    end
  end
end

regions = AWS::EC2.regions.map(&:name)
regions.each do |region| 
  begin
    snapshot_all_attached_volumes(region)
    # delete_all_old_snapshots(region) 
  rescue
    puts "#{$!}"
  end 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...