AWS - Script para criar instantâneos do EC2 e renomeá-los automaticamente

4

Atualmente, estou tentando configurar um script (usando o AWS CLI de um servidor Ubuntu) que fará o seguinte:

  • Crie um instantâneo de cada volume existente. Esses volumes já possuem uma tag NAME (como SERVER1, SERVER1DATA, SERVER2, SERVER2DATA, etc).

  • Renomeie os instantâneos tirados com a mesma tag NAMES (assim, no console da AWS, eu poderia filtrá-los por data e conseguir identificá-los facilmente).

A renomeação automática é o meu principal problema aqui.

Eu andei brincando com os comandos ec2-describe-volumes, ec2-create-snapshot e ec2addtag, mas meu script não é tão bom assim. Até agora eu fui capaz de configurar isso criando uma lista com VOLUME NAME e NAME TAG (esses parâmetros são então capturados pelo ec2addtag), mas eu teria que atualizar manualmente essa lista toda vez que eu adicionasse ou removesse um volume no ambiente .

Qualquer ajuda será muito apreciada.

    
por Nicolas 17.07.2014 / 18:45

4 respostas

5

Não estou certo de que entendi sua pergunta completamente, mas se o que você deseja é gerar uma lista de seus volumes, junto com tags de nome, algo como isso pode funcionar:

aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name"  --filters "Name=resource-type,Values=volume" --output json

Basicamente o que isso diz é "Dê-me o id do recurso e o valor da tag" name "para cada recurso do tipo" Volume ". Nesse caso, especifiquei json como a saída. Você também pode especificar" text " ou "tabela", dependendo de suas necessidades.

Outra abordagem:

aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text

Isso retornaria uma lista de seus volumes. Se você canalizasse isso para um arquivo de texto, o arquivo conteria apenas uma lista de identificadores de volume - um por linha.

Você pode então obter a tag "Nome" para cada volume na lista com algo assim:

aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name"  --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=vol-2e293949" --output json

Isso é basicamente dizer "me dê o id do recurso e o valor do nome da tag para o id especificado vol-2e293949.

Como você pode ver, os comandos da CLI podem ser difíceis de ler e a filtragem e a consulta são um pouco difíceis. (Estes exemplos usam uma versão recente do CLI da AWS

    
por 17.07.2014 / 21:04
4

Quanto a extrair o ID do snapshot do seu comando create-snapshot, você pode fazer isso sem precisar do awk / sed / grep / etc. usando alguns recursos da CLI (consulta e saída).

Por exemplo:

$ SNAP_ID='aws ec2 create-snapshot --cli-input-json file://$temp_file --query 'SnapshotId' --output text'
$
$ echo "snap id: "$SNAP_ID
snap id: snap-aaaabbbb
$
$ aws ec2 create-tags --resources $SNAP_ID --tags Key=Name,Value=$SOME_NAME
$

Observe que, com uma saída de json em vez de "text", ele envolve o ID de snapshot retornado com aspas duplas por padrão JSON.

    
por 08.12.2015 / 22:42
1

Algum tempo atrás eu escrevi este script bash para fazer exatamente isso para mim. Basicamente, você o instala em cada instância do EC2 que deseja fazer backup e, fornecendo a ele uma chave privada, um arquivo de certificado e as ferramentas da API do EC2, isso fará a autodescoberta do ID da instância, dos volumes anexados a ele e crie um instantâneo para cada volume.

Você deve marcar os volumes com Name e Device . Name é apenas um nome amigável que aparece na descrição do instantâneo. Device is é o nome real do dispositivo no servidor. /dev/sdf , por exemplo. Finalmente, ele irá girar seus instantâneos quando um limite predefinido for atingido. O padrão é 50. Quando o 51º instantâneo for criado, o mais antigo será excluído.

    
por 17.07.2014 / 21:16
1
#!/bin/bash

aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text > /tmp/volumes

for i in $(cat /tmp/volumes); do

aws ec2 create-snapshot --volume-id $i | awk {'print $2'} | grep snap* | sed 's/\"//g'|sed 's/\,//g' > /tmp/snapname

SNAPENAME=$(cat /tmp/snapname)

TAGNAME=$(aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=$i" --output text | awk '{ print $1 }') 

sleep 5

aws ec2 create-tags --resources $SNAPENAME --tags Key=Name,Value=$TAGNAME >/dev/null

done

É um pouco confuso e talvez desnecessário, mas faz o que é necessário: crie um instantâneo de todos os volumes disponíveis e (se eles tiverem tags NAME), renomeie-os com essas tags NAME.

    
por 18.07.2014 / 20:09