2012-03-12 18 views
5

Estoy intentando una secuencia de comandos para hacer una copia de seguridad de un volumen de forma automática.Cómo capturar automáticamente un volumen de una instancia de Amazon EC2?

que siga esta secuencia de comandos que se encuentran en EBS-Snapshot.shgithub:

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

tengo los dos archivos para la autenticación X509, el identificador de instancia, pero no entiendo el guión y cómo parametrizar el volumen que quiero hacer copias de seguridad.

No entiendo la primera línea (origen) y el EC2_BIN. Con esa configuración, enumera todos los volúmenes y hace una instantánea de todos estos ...

Para el comentario de la instantánea, ¿cómo puedo cambiar esta línea para agregar texto?

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

lo siento de ser un principiante, pero no entiendo todo el guión

EDIT:

consigo este error con este nuevo código:

Creación de instantáneas para el volumen: ([EC2-describe-volúmenes]) con Descripción: -03-13-2012 información instantánea a continuación: Client.InvalidParame terValue: Valor (([EC2-describe-volúmenes])) para parámetro VolumeID no es válido. Esperado: 'vol -...'. Proceso terminó a las 03-13-2012-08: 11: 35 -

Y este es el código:

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

Respuesta

4

Ok bien,

  1. La primera línea en la que se ejecuta (fuente). Eso es lo mismo que/etc/environment. De todos modos, todo lo que hace es cargar un archivo que tiene una lista de variables ambientales que requiere Amazon. Al menos esto es lo que supongo.
  2. que está haciendo este guión mucho más complicado de lo que tiene que ser. Él no necesita ejecutar el EC2-describe-instancias de comando y guardar la salida en un archivo y luego grep la salida etc ....
  3. Usted puede poner lo que desea para la descripción. Simplemente puede reemplazar todo a la derecha de = al texto que desee. Solo asegúrate de poner citas a su alrededor.

que cambiaría dos cosas acerca de este guión.

  1. Obtenga InstanceId en tiempo de ejecución en el script. No codificarlo en el script. Esta línea funcionará sin importar dónde se ejecuta la secuencia de comandos.

    MY_INSTANCE_ID=`curl http://169.254.169.254/1.0/meta-data/instance-id` 
    
  2. En lugar de llamar EC2-describe-volúmenes y guardar el resultado en un archivo temporal, etc ... sólo tiene que utilizar un filtro en el comando y decirle qué ID de instancia que desea.

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

bien mucho gracias por las explicaciones, me buscaron todo el día y me preguntó a mí mismo por las preguntas sobre "global" vars :-) Gracias por los pequeños realizando alguna mejora sobre la identificación de la instancia y la lista de volúmenes, la lista de volúmenes me causó algunos problemas. Voy a modificar la descripción y corregiré el "Client.InvalidParameterValue: Value (([ec2-describe-volumes])) para el parámetro volumeId no es válido. Esperado: 'vol -...'. ' error que todavía :-) – clement

+0

Tenga cuidado al cambiar la descripción. Asegúrese de agregar comillas para tener cuidado. Si está obteniendo un error Client.InvalidParameterValue, es porque o bien el ID de volumen está vacío o el texto está usando para la descripción tiene espacios y su parte de lectura de la descripción para el id. de volumen – bwight

+0

Tengo nuevamente ese problema. Este es todo el proceso impreso en la pantalla: Creación de instantánea para el volumen: ([ec2-describe-volumes]) con description: -03-13-2012 Información de instantánea a continuación: Client.InvalidParameterValue: Value (([ec2-describe-volumes])) para el parámetro volumeId no es válido. Esperado: 'vol -...'. Proceso finalizado al 03-13-2012-08: 11: 35 – clement

9

la solución anterior no funciona completamente para mí. Después de chat horas que con el apoyo del Amazonas, que ahora tengo este script de trabajo, que siempre va a crear instantáneas de todos los volúmenes conectados a la instancia actual:

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

I fijó una tarea programada en /etc/cron.d/ebsbackup

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

esto funciona bastante bien para mí ... :-)

esperanza esto ayuda para usted, Sebastián

0

Heres una función i escribió i n Ruby para hacer una instantánea de todos los volúmenes en todas las instancias en todas las regiones.

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

No sé usted, pero prefiero hacer AMI instantánea. Este guión vino de una idea de Craig, un empleado de Amazon. Estaban desarrollando una secuencia de comandos de instantáneas llamada Arche. Este script es simple: marcas una etiqueta en una instancia EC2 y la etiqueta Ec2 está AMIed. Lo probé en mi entorno. También puede cambiar los comandos en este script para hacer una copia de seguridad de la instantánea.

Antes de ejecutar esto, configure las variables de entorno de Linux con las teclas cert y 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

Me encontré con muchas personas que buscan una herramienta para administrar las instantáneas de EBS. Encontré varias herramientas en internet pero solo eran guiones y soluciones incompletas. Finalmente, decidí crear un programa más flexible, centralizado y fácil de administrar.

La idea es tener un programa centralizado para descartar todas las instantáneas de EBS (locales a la instancia o remotos)

he creado un pequeño programa en Perl, https://github.com/sciclon/EBS_Snapshots

Algunas características: * Programa se ejecuta en modo daemon o el modo de secuencia de comandos (crontab)

  • se puede elegir solamente local conectada volúmenes o mandos a distancia, así

  • Puede definir archivo de registro

  • Se puede definir para cada cantidad volumen de instantáneas

  • Se puede definir para cada volumen de la frecuencia entre ellos

  • frecuencia y cantidad funcionará como una "round-robin" cuando alcanza el límite eliminando la instantánea más antigua.

  • puede reajustar en un solo paso la cantidad que quiero decir si tiene 6 instantáneas y modifica la cantidad en 3, el proceso se reajustará automáticamente.

  • Se puede definir una ejecución "prescrito", Usted puede añadir su código a ejecutar antes de ejecutar la instantánea, por ejemplo, que le gustaría tratar de desmontar el volumen o deje de algún servicio, o tal vez para comprobar la carga instancia. El proceso principal esperará el código de salida, "0" significa éxito, puede definir si continúa o no según el código de salida.

  • Se puede definir una ejecución "PostScript" para ejecutar cualquier alforja después de tomar la instantánea (por ejemplo, un correo electrónico que le dice al respecto)

  • Puede agregar "Instantáneas Protegida" para omitir la instantánea se define, Quiero decir que estarán en "solo lectura" y nunca serán borrados.

  • puede reconfigurar el script "sobre la marcha" cuando se ejecuta en modo daemon, el script acepta señales e IPC.

  • Tiene un "caché local" para evitar solicitar la API varias veces. Puede agregar o modificar cualquier configuración en el archivo de configuración y volver a cargar sin matar el proceso.

Cuestiones relacionadas