Criar e excluir volumes do Amazon EC2 usando um script de shell

3

Estou usando este script a seguir, que faz um backup regular de volumes no serviço de nuvem do Amazon AWS. Ele cria novos instantâneos dos volumes e deve remover instantâneos com mais de dois dias. Ele está criando novos snapshots muito bem, mas ao remover snapshots mais antigos, não está fazendo certo.

#!/bin/bash
#
# File: vol-snapshot.sh
TODAY='date +%m-%d-%Y'
echo "================================================"
echo "Starting SNAPSHOT creation and deletion process for $TODAY"
echo ""
echo "The script will create a snapshot of every single volume"
echo "It will delete snapshots older than two days"
echo ""
echo "Setting ENVIRONMENTAL VARIABLES FOR ec2"

##
#
export EC2_HOME='/usr/local/ec2'  # Make sure you use the API tools, not the     AMI tools
export EC2_BIN=$EC2_HOME/bin
export EC2_PRIVATE_KEY=$EC2_HOME/pk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
export EC2_CERT=$EC2_HOME/cert-XXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
export REGION=us-east-1d
export PATH=$PATH:$EC2_BIN
export OLD='date +%m-%d-%Y --date '2 days ago''
##
#

#
# To find the current location of JAVA_HOME, try env | grep JAVA_HOME
# It's necessary to put this environment variable in here because
# cron will not have access to your standard environment variables.
export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64
##

## Get Volumes
VOLUMES='ec2-describe-volumes | grep VOLUME | cut -f 2'
echo "The volumes are: $VOLUMES"
echo ""

echo "===================================="
echo "Creating snapshots of volumes: $VOLUMES"
echo ""
for volume in $VOLUMES
do 
  ec2-create-snapshot -C $EC2_CERT -K $EC2_PRIVATE_KEY -d "Creating     Snapshots for $TODAY" $volume
done

echo""
echo "====================================="
echo "Deleting snapshots older than two days for $VOLUMES"
echo ""
for volume in $VOLUMES
do
OLDEST='ec2-describe-snapshots -C $EC2_CERT -K $EC2_PRIVATE_KEY | grep     $volume | grep $OLD | sed -e 's/.*snap/snap/' | sed -e 's/\t.*//''
    if [ "x$OLDEST" != "x" ]; then
        ec2-delete-snapshot -C $EC2_CERT -K $EC2_PRIVATE_KEY $OLDEST
        else
        echo "No other snapshots to delete using this script."
    fi
done
echo "The end of script."

A seguinte linha é simplesmente dando instantâneos que tem apenas dois dias, mas não os que estão além disso.

OLDEST='ec2-describe-snapshots -C $EC2_CERT -K $EC2_PRIVATE_KEY | grep $volume | grep $OLD | sed -e 's/.*snap/snap/' | sed -e 's/\t.*//'

Além disso, isso deve ser colocado em um loop for antes de se?

Eu ficaria muito satisfeito se alguém puder me ajudar aqui.

    
por mezi 30.05.2012 / 15:10

3 respostas

1

Eu só sei quantos snapshots recentes eu quero manter (28 neste exemplo, incluindo aquele que eu acabei de criar, que ainda está 'pendente'), então remova qualquer versão mais antiga que isso:

for SNAPSHOT in 'ec2-describe-snapshots | grep $THIS_EBS_VOLUME | grep -v pending | head -n -27 | awk '{print $2}'' ; do
  ec2-delete-snapshot $SNAPSHOT
done
    
por 06.06.2012 / 18:16
1

Os carimbos de data e hora são construídos de modo que os tipos de seqüência ordenem cronologicamente. Então você pode encontrar os mais antigos com $TIMESTAMP < $CUTOFF .

  • Use ec2-describe-snapshots -C $EC2_CERT -K $EC2_PRIVATE_KEY | grep $volume para obter a lista dos instantâneos.
  • Foreach instantâneo:
    • Extraia o registro de data e hora
    • Se o carimbo de data / hora for < $OLD eliminá-lo
por 11.09.2012 / 08:45
0

Combinei algumas ideias de vários locais, por isso imaginei que compartilharia o que costumava excluir os instantâneos antigos para o caso de ajudar alguém.

    ec2-describe-snapshots | awk '{print $5 "\t" $2}' > /backups/tmp/snapshot_info_start.txt
    grep -v '^[A-Za-z]' /backups/tmp/snapshot_info_start.txt > /backups/tmp/snapshot_info.txt

    cat /backups/tmp/snapshot_info.txt | while read obj0

    do
            Snapshot_Name='cat /backups/tmp/snapshot_info.txt | grep "$obj0" | awk '{print $2}''
            Snapshot_Old='cat /backups/tmp/snapshot_info.txt | grep "$Snapshot_Name" | awk '{print $1}''
            Snapshot_Old_s='date "--date=$Snapshot_Old" +%s'

            if (($Snapshot_Old_s <= $SnapCheck_21_Day_s)) ;
            then
                    echo "Deleting Snapshot $Snapshot_Name ... "
                    ec2-delete-snapshot $Snapshot_Name

            else
                    echo "Not deleting snapshot $Snapshot_Name ...  "

            fi
    
por 12.02.2015 / 16:18