Capturas instantâneas automatizadas da instância do EC2 com suporte do EBS executando o Ubuntu

6

Estou executando uma instância com suporte do EBS , que funciona como uma servidor de desenvolvimento da equipe de desenvolvimento de software (executando Jenkins e host de outros serviços). O servidor está executando o Linux (o mais recente Ubuntu das AMIs oficiais ).

Gostaria de tirar instantâneos automáticos e regulares do volume do EBS associado à instância. Eu só preciso manter um backup mais recente (por exemplo, os snapshots antigos devem ser removidos) e uma boa frequência seria uma vez por dia.

Parece que a Amazon não fornece esse serviço de backup pronto para uso, por isso você precisa usar scripts de terceiros ou implementar sua própria solução.

A minha pergunta é, qual é a maneira mais simples de conseguir isso? Eu gostaria de uma quantidade mínima de complicações, configurações e dependências externas. Configurar isso como algum tipo de script cronometrado na própria caixa do Linux é, no meu conhecimento, uma opção válida.

    
por Jonik 30.05.2011 / 16:25

5 respostas

4

Ok, pelo que vale a pena, aqui está o que eu fiz. Espero que meus scripts fracos incentivem as pessoas a postar melhores soluções!

Eu escrevi dois scripts bash simples e os automatizei usando cron . (Por enquanto eu executo estes em um servidor local, como eu acho (?) Não é recomendado colocar os certificados da AWS nas próprias instâncias / AMIs / EBSs.)

Para criar um novo instantâneo :

# ESB volume associated with the instance we want to back up:
EBS_VOL_ID=vol-xxxxyyyy

ec2-create-snapshot --region eu-west-1 -K pk.pem -C cert.pem -d "Automated backup" $EBS_VOL_ID 

Para remover todos, exceto o instantâneo mais recente :

EBS_VOL_ID=vol-xxxxyyyy

ec2-describe-snapshots --region eu-west-1 -K pk.pem -C cert.pem  | grep "Automated backup" | grep "$EBS_VOL_ID" | awk '{ print $5 "\t" $2 }' | sort > .snapshots

latest_id=$(tail -n1 .snapshots | awk '{ print $2 }')

cat .snapshots | awk '{ print $2 }' > .snapshot_ids
for i in $(cat .snapshot_ids) 
do
    if [ "$i" != "$latest_id" ]
    then
        echo "Deleting snapshot $i"
        ec2-delete-snapshot --region eu-west-1 -K pk.pem -C cert.pem $i
    fi
done

(Isso analisa as informações apropriadas de captura instantânea de ec2-describe-snapshots output e cria um arquivo temporário com entradas [timestamp snapshot-id] (por exemplo, 2011-06-01T10:24:36+0000 snap-60507609 ) onde o instantâneo mais recente está na última linha.)

Notas :

  • Coloque seu certificado X509 e chave privada em algum lugar onde os scripts possam encontrá-los.
  • Você deve especificar explicitamente --region com todos os comandos. Caso contrário, por exemplo, ec2-create-snapshot falharia com o ID do volume sendo desconhecido. (YMMV se você usar a região padrão "us-east-1".)
  • Usei uma descrição de snapshot ("Backup automatizado") como marcador para evitar que o script de remoção exclua outros snapshots do volume em questão (por exemplo, snapshots relacionados a AMIs).

Disclaimer: Isso se tornou em parte um exercício de programação Bash / Unix para mim, especialmente o script de poda. Admito prontamente que você provavelmente obteria um resultado muito mais claro com, por exemplo, Python, quando você precisa de lógica como "faça algo para todos, mas o último item de uma lista". E mesmo com Bash você provavelmente poderia fazer isso com mais elegância (por exemplo, você realmente não precisa de arquivos temporários). Então, sinta-se à vontade para postar outras soluções !

    
por 01.06.2011 / 13:40
5

Baseado no conceito de Jonik, criei um script python usando o boto. Você fornece uma lista de volumes para o instantâneo e quantos instantâneos à direita devem ser mantidos para cada volume:

# Define the snapshots manage. We'll snapshot the specified volume ID, and only keep the X newest ones.
snapshots = [("vol-XXXXXXXX", 30), ("vol-YYYYYYYY", 180)]

import boto.ec2
auth = {"aws_access_key_id": "YOURACCESSKEY", "aws_secret_access_key": "YOURSECRETKEY"}
ec2 = boto.ec2.connect_to_region("YOURREGIONNAME", **auth)
description = "automated backup"
for volume, num_trailing in snapshots:
  snaps = ec2.get_all_snapshots(filters={"volume-id": volume, "description": description})
  print "%s: Creating new snapshot. %s automated snapshots currently exist." % (volume, len(snaps))
  ec2.create_snapshot(volume, description)
  purgeable = sorted(snaps, key=lambda x: x.start_time)[:-num_trailing]
  print "Deleting snapshots for %s > %s: %s" % (volume, num_trailing, purgeable)
  for snap in purgeable:
    ec2.delete_snapshot(snap.id)

Eu configurei isso como um trabalho do Jenkins (via plug-in Python), configurado para ser executado diariamente. Se você estiver usando o IAM para gerenciar credenciais, observe que isso exigirá nas políticas ec2: DescreverRegiões, DescreverVolumes, CriarSessão, ExcluirSnapshot, DescreverRecursos, CriarTags (devido à implementação do boto).

    
por 13.01.2012 / 21:49
1

Se você estiver aberto a utilitários externos, confira Skeddly .

Divulgação : Sou o CEO da Eleven41 Software, a empresa por trás do Skeddly.

    
por 24.11.2011 / 20:44
1

Expandi a ideia do script de Jonik para permitir que vários instantâneos fossem mantidos. O código é muito longo para caber em um comentário, então estou adicionando uma nova resposta. Este código supõe que todas as variáveis de ambiente corretas foram configuradas para as ferramentas CLI. Além disso, o padrão é tirar um instantâneo da instância atual.

# Look up our instance ID using the magic URL
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# The number of previous backups we want to keep
N=3

# get list of locally attached volumes via EC2 API:
VOLUME_LIST=$(ec2-describe-volumes | grep ${INSTANCE_ID} | awk '{ print $2 }')
DATE=$(date '+%Y-%m-%d-%H%M%S')

sync

# actually creating the snapshots
for VOLUME in $(echo $VOLUME_LIST); do
    echo "Processing volume $VOLUME"
    SNAPSHOT_LIST=$(ec2-describe-snapshots | grep completed | grep "Automatic snapshot" | grep $VOLUME | awk '{print $5 "\t" $2}' | sort | head "--lines=-$N" | awk '{print $2}')
    ec2-create-snapshot $VOLUME -d "Automatic snapshot on $DATE"
    for SNAPSHOT in $(echo $SNAPSHOT_LIST); do
        ec2-delete-snapshot $SNAPSHOT
    done
done
    
por 08.07.2012 / 01:00
0

Eu escrevi um script em PHP que irá automatizar os snapshots do EBS e deletar os antigos. Ele enviará até mesmo os resultados dos instantâneos para você. Você deve configurar o AWS PHP SDK e o PHPMailer para funcionalidade de email, mas essas duas etapas são bem fáceis. Então você acabou de executar o script todas as noites com o CRON ou Tarefas Agendadas do Windows. Instruções detalhadas e código podem ser encontrados no meu blog:

link

    
por 27.05.2012 / 03:41