詳細検索

Backup automático de AMI com awscli

Avatar
por komi

Backup automático de AMI com awscli
Traduzido do 日本語 • Ver original

Olá. Aqui é a Komiya do OPS.

Parecia haver demanda dentro da empresa,
Procurei ferramentas de Python mais rápido que Java, mas não consegui encontrar AWSCLI, então fiz isso.
Não usamos julgamento automático que não pode ser tomado por tag. Se você especificar o número de gerações no bkup_num, pode obter várias gerações.
É uma especificação que especifica o ID da instância no argumento 1 e o nome do host no argumento 2.
--no-reboot, então a instância em execução não será reiniciada.
Mesmo que houvesse EBS na área de dados, o comando ami parecia receber múltiplos comandos sozinho, então
Tentei determinar se era um dispositivo de sistema operacional ou de dados e marcar de forma fácil de entender.

※※Aponta※※
--no-reboot Quando o alvo de recuperar a AMI era o servidor Mysql DB do motor de armazenamento MyISAM, os dados foram corrompidos e parados.
Se você realmente quer adquirir um AMI e não for um InnoDB, seria melhor parar com uma recomendação de manutenção.
*A AWS não garante a integridade dos dados relacionados à aquisição de AMI não disruptiva.
 URL de referência: http://docs.aws.amazon.com/ja\_jp/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html
Isso significa que você deve ter cuidado com servidores de armazenamento (manutenção recomendada).

・Instale awscli se não estiver incluído
Como colocar: (Se não estiver incluído, instale o pip awscli. Pip é adicionado com easy_install)
AWS Command Line Tool para Python | Developers.IOEasy_install em Python - Hane @ Diary Tentei usar AWS Command Line Interface (awscli) - Dias adequados para um ex-usuário do RX-7

Crie uma chave de acesso AWS e um arquivo de configuração de região que você chamará do script.
[shell]# cat /root/.ec2/aws.config ------------ [default] aws_access_key_id=< access key id> aws_secret_access_key= region=ap-northeast-1 ------------[/shell]
・Investigação de comando (Vou postar primeiro)
[shell]# aws ec2 copy-image help ------------ copy-image DESCRIPTION Inicia a cópia de uma AMI da região de origem especificada para a região onde a solicitação foi feita. É uma cópia inter-regiões, então não preciso mais agora. ------------ create-image Cria uma AMI apoiada por Amazon EBS a partir de uma instância suportada por Amazon EBS que está rodando ou parada. create-image [--dry-run | --no-dry-run] --instance-id --name [--descrição ] [--no-reboot | --reboot] [--block-device-mappings ] Comando:

AWS EC2 Create-Image ---Instance-ID i-10A64379 --nome "Meu servidor" --descrição "Uma AMI para meu servidor"

Saída:

{ "ImageId": "ami-5731123e" } ------------ describe-images Se você quiser gerenciar gerações, seria uma boa ideia usar o imageid ou nome de host que apareceu após buscar tags na opção --filter. ------------ describe-instances Isso é o que você usa para obter o RootDeviceName. ------------ desregistrar-imagem desregistra a AMI especificada. Depois que você desregistra uma AMI, ela não pode ser usada para iniciar novas instâncias. SINOPSE deregistrar-imagem [--dry-run | --no-dry-run] --image-id Command:

AWS EC2 Deregister-Image --Image-ID AMI-4FA54026

Saída:

{ "return": "true" } ------------ NAME create-tags - SINOPSE create-tags [--dry-run | --no-dry-run] --resources --tags EXEMPLOS Command:

AWS EC2 create-tags --resources ami-78a54011 --tags Key=Stack,Value=production

Saída:

{ "return": "true" } ------------ # aws ec2 delete-snapshot ajuda NOME delete-snapshot - DESCRIÇÃO Exclui o snapshot especificado. SINOPSE delete-snapshot [--dry-run | --no-dry-run] --snapshot-id ------------ # aws ec2 describe-snapshots ajuda NOME describe-snapshots - SINOPSE describe-snapshots [--dry-run | --no-dry-run] [--snapshot-ids ] [--owner-ids ] [--restauráveis-por-usuários-ids ] [--filtros ] Sintaxe: --filtros (lista) o tag :key =*value* - A combinação chave/valor de uma tag atribuída ao recurso. Descrição Como buscar o amiid da chave e obter o snapshotid que você quer remover ------------ metadados

# /usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id i-292a442c ------------[/shell]

・Criar um script

Se você tem um argumento, pode criar essa instância; se não, criar sua própria AMI.
Coloque o return imageid em um arquivo e marque com ele,
Neste momento, a tag é determinada como OS conforme o snapshot do RootDeviceName ser determinado ou não, e o nome do dispositivo também está incluído no nome da tag.
Pesquise com o filtro de nome do host com o return imageid para obter todos os imageids relacionados ao host e ordená-los em ordem decrescente pelo campo data e hora.
O processo é deletar as linhas da geração que você quer manter, apagar o imageid antigo do alvo e apagar o deregist e o snapshot.

O número de gerações é definido em uma variável chamada bkup_num.

[shell]# vi /opt/bin/aws_image_bkup.sh ------------ #!/bin/bash # #aws_image_bkup.sh: backup da AMI com awscli # dependências: comando aws # alterar histórico: 20140314 - criar komiyay # exportar PATH=$PATH:/usr/local/bin export AWS_CONFIG_FILE=/root/.ec2/aws.config

if [ $# -eq 0 ]; então ecoa "Se você não especificar o id da instância, faça backup AMI para a instância local" eco "usage: $0 [instance-id] [hostname]" myInstanceID='/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id\' host_name='uname -n' else myInstanceID=$1 host_name=$2 fi

## default variables base='dirname "$0"' LOG=/opt/log/bkup.log CurrentImage_LOG=${base}/cimageid_${myInstanceID}.log #OLDimageID='cat ${CurrentImage_LOG}|grep ImageId|awk '{FS=":"; print $2}'|sed -e 's/[ "]//g'' current_result=/opt/log/current_result.log today='/bin/date +%Y%m%d' amitime='/bin/date +%Y%m%d_%H%M' datetime='/bin/date +%Y/%m/%d_%H:%M:%S' e-mail_to=<Endereço de e-mail de destino> #mail_to=<Endereço de e-mail de destino> bkup_num=1

## check_param. if [ -z ${myInstanceID} ]; então echo "erro: sem instance-id, encerrar script ${datetime}."| tee -a ${LOG} saída 1 fi

## função ### mail_send mail_send(){ echo ${mail_body}|tee -a ${LOG}|mail -s ${mail_title} ${mail_to} }

### create_ami create_ami(){ aws ec2 create-image --instance-id ${myInstanceID} --name "${host_name}_${amitime}" \ --description "${host_name}_${myInstanceID}_${datetime}" --no-reboot |tee ${CurrentImage_LOG} grep ImageId ${CurrentImage_LOG} res_create=$? }

### desregistrar_ami desregistrar_ami(){ se [ -z ${OLDimageID} ]; então res_deregister=0 else aws ec2 desregistrar-imagem ---image-id ${OLDimageID}|tee ${current_result} grep true ${current_result} res_deregister=$? se [ ${res_deregister} -ne 0 ]; então e-mail_body="NG desregistrar ami por ${myInstanceID}(${host_name}) em ${data-hora}" mail_titile="NG_ami_deregister_${today}" mail_send fi fi }

### delete_snapshot delete_snapshot(){ if [ -z ${OLDimageID} ]; então res_delsnap=0 else snapshot_ids='aws ec2 describe-snapshots --filters Name=description,Values=*${OLDimageID}* \ |grep SnapshotId|awk -F : '{print $2}'|sed -e 's/[ ",]//g'' for i in ${snapshot_ids} do aws ec2 delete-snapshot --snapshot-id ${i}|tee ${current_result} grep true ${current_result} res_delsnap=$? if [ ${res_delsnap} -ne 0 ]; então mail_body="NG delete ami snapshot(${i}) para ${myInstanceID}(${host_name}) at ${datetime}" mail_titile="NG_delete_ami-snapshot_${today}" mail_send fi done fi }

### create_tag create_tag(){ ### create tag for ami CurImageID='cat ${CurrentImage_LOG}|grep ImageId|awk '{FS=":"; print $2}'|sed -e 's/[ "]//g'' aws ec2 create-tags --resources ${CurImageID} --tags "Key=Name,Value=${host_name}_${today}" ### criar tags para snapshots rootDeviceName='aws ec2 describe-instances --instance-ids ${myInstanceID} \ |grep RootDeviceName|awk '{print $2}'|sed -e 's/[",]//g'' snapshot_ids='aws ec2 describe-snapshots --filters Name=description,Values=*${CurImageID}* \ |grep SnapshotId|awk -F : '{print $2}'|sed -e 's/[ ",]//g'' for i in ${snapshot_ids} do volume_id='aws ec2 describe-snapshots --snapshot-ids ${i}|grep VolumeId \ |awk '{print $2}'|sed -e 's/[",]//g'' deviceName='aws ec2 describe-volumes --volume-ids ${volume_id}|grep Device \ |awk '{print $2}'|sed -e 's/"//g'' if [ "${rootDeviceName}" == "${deviceName}" ]; então aws ec2 create-tags --resources ${i} \ --tags "Key=Name,Value=AMI_${host_name}_${today}-os_${deviceName}" senão aws ec2 create-tags --resources ${i} \ --tags "Key=Name,Value=AMI_${host_name}_${today}-data_${deviceName}" fi done }

## principal executivo >> ${LOG} exec 2>&1

Echo "iniciar backup da ami. ${datetime}" criar_ami

## girar_ami delete_images='aws ec2 describe-images --filters Name=name,Values=*${host_name}* \ |egrep -a 'ImageId| ImageLocation'|sed -e "N; s/\n//" -e 's/[",]//g'|awk '{print $2" "$4}' \ |sort -r -t _ -k 2,3|sed -e "1,${bkup_num}d"|awk '{print $1}'' for i in ${delete_images} do OLDimageID=${i} desregistrar_ami delete_snapshot feito

## se receber erro, então enviar e-mail. o outro caso, criar tags. se [ ${res_create} -ne 0 ]; então e-mail_body="NG criar ami para ${myInstanceID}(${host_name}) em ${datetime}" mail_titile="NG_create_ami_${today}" mail_send elif [ ${res_create} -EQ 0 ]; então criar_tag Fi Echo "fim backup ami. ${datetime}"

## logrotate DAY='date +%m%d' se [ $DAY = "0101" ] então OY='date -d '1 ano atrás' +%Y' mv $LOG $LOG.$OY encontrar /opt/log -name "$LOG.*" -type f -atime +730 -exec rm -f {} \; fi

Saída 0 ------------ # chmod +x /opt/bin/aws_image_bkup.sh[/shell]

Tente usá-lo
[shell]# bash -x /opt/bin/aws_image_bkup.sh i-292a442c komiya-test-mysql01 # cat /opt/bin/cimageid_i-292a442c.log # cat /opt/log/bkup.log [/shell]

Depois de rodar o teste, começou a funcionar sem problemas.
Como precaução,
Quando o AMI_NAME aparece, ambos parecem desaparecer e desaparecer, então acho que não vou fazer isso, mas é melhor não rodar duas vezes no mesmo minuto.
Se você ocupar os minutos, normalmente consegue um AMI,
Sinto que se o número de corridas aumentar demais, a taxa de uso vai aumentar, então recomendo usá-lo diariamente.

Se quiser manter a AMI antiga, defina o número de gerações na variável bkup_num.

Se você quiser pegar múltiplas instâncias de AMIs, pode criar uma lista e repeti-la da seguinte forma.
[shell]vi bkup-hosts.txt ---- i-xxxxx,hoge-web01 i-yyyyy,hoge-web02 ... ---- para i em 'cat bkup-hosts.txt' do instance-id='echo $i|awk -F, '{print $1}'' nome do host='echo $i|awk -F, '{print $2}'' /opt/bin/aws_image_bkup.sh ${instance-id} ${nome do host} feito[/shell]

Pode haver um padrão de que, se você só tiver dados, pode recuperá-los, economizar na quantidade de backup, e só precisa usar a AMI quando mudar.
Se você quiser pegar a AMI mais recente para autoscaling, etc., acho que backup automático de AMI certamente é necessário.
Será que o backup depende do plano de recuperação?

O que aprendi pessoalmente ao fazer um roteiro desta vez foi que
sed -e "N; s/\n//" Remover quebras ímpares de linha
É um lugar? Já usei outras coisas, mas senti que sabia que poderia fazer isso pesquisando por palavras-chave.
Parece que ele ainda não praticou.

・Bônus
Vou postar a receita do awscli chef.

Faça um livro de receitas
[shell]Livros de receitas de faca criar aws -o site-cookbooks[/shell]

Faça uma receita chamada awscli.rb
[shell]# vi site-cookbooks/aws/recipes/awscli.rb ----------------------------------------------------- se node["platform_version"] >= 6 pacote "python-setuptools" faça ação: instale finalizar bash "pip-awscli-install" não_if "qual aws" código <-EOC easy_install="" pip="" pip="" install="" awscli="" eoc="" end="" elsif="" node["platform_version"]="">= 5 && nó["platform_version"] < 6 bash "python26-pip-awscli-install" do not_if "which aws" code <-EOC yum -y install python26 python26-devel python26-distribute --enablerepo=epel easy_install-2.6 pip pip2.6 install awscli EOC end end

directory "/root/.ec2" do action :create end

awstest1 = Chef::EncryptedDataBagItem.load("awskeys","awstest1") awstest1key_id = awstest1["aws_access_key_id"] awstest1secret_key = awstest1["aws_secret_access_key"] awstest1region = awstest1["region"]

bash "set-aws-config" do not_if "grep access_key /root/.ec2/aws.config" code <-EOC echo="" '[default]'="">> /root/..ec2/aws.config eco "aws_access_key_id=#{awstest1key_id}" >> /root/.ec2/aws.config eco "aws_secret_access_key=#{awstest1secret_key}" >> /root/.ec2/aws.config eco "region=#{awstest1region}" >> /root/.ec2/aws.config fim EOC -----------------------------------------------------[/shell] Parece que os IDs de chave de acesso devem ser gerenciados com dados_bags.

[shell]awstest1 = Chef::EncryptedDataBagItem.load("awskeys","awstest1") awstest1key_id = awstest1["aws_access_key_id"] awstest1secret_key = awstest1["aws_secret_access_key"] awstest1region = awstest1["region"][/shell]

Registre uma chave de acesso AWS, etc., nos dados_bags\

[shell]faca solo data bag criar awskeys awstest1 --secret-file ~/.chef/encrypted_data_bag_secret { "id": "awstest1", "aws_access_key_id": "AKIAID4CBY76*", "aws_secret_access_key": "4+saCCqOQL8+CKnzdHOpc2CKg2oWmKRO*******", "region": "ap-nordeste-1" }

# knife solo data bag mostrar awskeys awstest1 --dados de arquivo secreto_bag_key AVISO: A opção criptografada_data_bag_secret definida no knife.rb foi sobreposta pela linha de comando. aws_access_key_id: AKIAID4CBY76*aws_secret_access_key: 4+saCCqOQL8+CKnzdHOpc2CKg2oWmKR*** ID: AWSTEST1 região: ap-nordeste-1[/shell]

Teste de Sintaxe
[shell]# teste de livros de receitas com faca aws[/shell]

Obrigado por ler o que foi dito acima.</-EOC></-EOC>

Related Articles