2012-03-12 2 views
5

Я пытаюсь создать сценарий для резервного копирования тома автоматически.Как автоматически снижать объем экземпляра Amazon EC2?

Я следую за этот 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, экземпляр ID, но я не понимаю, сценарий и как параметризировать объем, что я хочу для резервного копирования.

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

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

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

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

EDIT:

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

Создание моментального снимка для тома: ([ec2-describe-volume]) с описание: -03-13-2012 Информация о моментальном снимке ниже: Client.InvalidParame terValue: Значение (([ec2-describe-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 

ответ

4

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

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

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

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

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

    VOLUME_LIST=(`ec2-describe-volumes --filter attachment.instance-id=$MY_INSTANCE_ID | awk '{ print $2 }'`) 
    
+0

ок много спасибо за объяснения, я искал весь день, и я спросил себя на вопросы о «глобальном» варах :-) Спасибо за маленькие improvments о id экземпляра и списке томов, список томов вызвал у меня некоторые проблемы. Я изменю описание, и я исправлю «Client.InvalidParameterValue: Value (([ec2-describe-volume])) для параметра volumeId недействителен. Ожидаемый:« vol -... ». ошибка, которая по-прежнему :-) – clement

+0

Будьте осторожны с изменением описания. Убедитесь, что вы добавили кавычки вокруг него, чтобы быть осторожным. Если вы получаете сообщение об ошибке Client.InvalidParameterValue, то это потому, что либо идентификатор тома пуст, либо текст, используемый вами для описания есть пробелы и его часть чтения описания для идентификатора тома – bwight

+0

У меня снова есть эта проблема. Это весь процесс, напечатанный на экране: Создание моментального снимка для тома: ([ec2-describe-volume]) с описание: -03-13-2012 Информация о моментальном снимке ниже: Client.InvalidParameterValue: Значение (([ec2-describe-volume])) для параметра volumeId недопустимо. Ожидаемое: 'vol -...'. Процесс закончился в 03-13-2012-08: 11: 35 – clement

9

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

#!/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 

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

Надеется, что это помогает вам, Sebastian

0

Heres функция я написал я n 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 
0

Я не знаю о вас, но я предпочитаю делать 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 
1

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

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

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

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

  • Вы можете выбрать только местные приложенный тома или пультов ДУ, а

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

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

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

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

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

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

  • Вы можете определить выполнение «POSTSCRIPT», чтобы выполнить любую суму после взятия снимки (например, электронной почты, говоря Вам об этом)

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

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

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

Смежные вопросы