Skip to content

Instantly share code, notes, and snippets.

@azizvc
Last active March 15, 2018 12:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save azizvc/66875896be7c11f789561f8bb03c34ef to your computer and use it in GitHub Desktop.
Save azizvc/66875896be7c11f789561f8bb03c34ef to your computer and use it in GitHub Desktop.
Backup automático dos Volumes EC2 em PHP

Backup automático dos Volumes EC2 em PHP

IAM - Configure um usuário com as seguintes permissões

  • EC2
    • LIST
      • DescribeSnapshots
      • DescribeVolumes
    • WRITE
      • CreateSnapshot
      • CreateTags
      • DeleteSnapshot

Instale o AWS CLI no servidor

  pip install awscli

Configure o AWS CLI usando as credenciais do usuário que foi criado

  aws configure

Copie o arquivo backup-ec2.php para um diretório de sua preferência

  /home/ubuntu/backup-ec2.php

Coloque a rotina no Cron

  crontab -e
  0 0 * * * * php -f /home/ubuntu/backup-ec2.php > /dev/null

A rotina irá rodar todos os dias

O Script está configurado para reter os backups por 7 dias, voce pode alterar isso na constante RETENCAO_DIAS

Para ver uma implementação em Node para usar com Lambda e CloudWatch veja esse link.

<?php
/**
* Script de backup de Maquinas EC2
* @author Aziz Vicentini <aziz(at)php-br.net>
*/
define('RETENCAO_DIAS',7);
#pega a lista de volumes
exec("aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,Tag:Tags}' --output json", $arrRetornoVolumes);
$arrVolumes = json_decode(implode("\r\n",$arrRetornoVolumes),true);
foreach ($arrVolumes as $arrVolume) {
unset($arrRetornoCriarBackups);
#faz backup de todos os volumes
exec("aws ec2 create-snapshot --volume-id ".$arrVolume['ID']." --description 'Backup automatico' --output json", $arrRetornoCriarBackups);
$arrCriarBackup = json_decode(implode("\r\n",$arrRetornoCriarBackups),true);
foreach ($arrVolume['Tag'] as $arrTags) {
if($arrTags['Key'] == 'Name'){
$tagName = $arrTags['Value'];
break;
}
}
#coloca tags nos backups, tag de nome do volume e tag para marcar o que pode ser removido após a data de retenção
exec("aws ec2 create-tags --resource ".$arrCriarBackup['SnapshotId']." --tags Key=Name,Value='".$tagName."'");
exec("aws ec2 create-tags --resource ".$arrCriarBackup['SnapshotId']." --tags Key=Remover,Value=Sim");
}
#pega a lista de backups
exec("aws ec2 describe-snapshots --query 'Snapshots[*].{ID:SnapshotId,Time:StartTime,Tag:Tags}' --filters Name='tag:Remover',Values='Sim' --output json", $arrRetornoSnapshots);
$arrSnapshots = json_decode(implode("\r\n",$arrRetornoSnapshots),true);
foreach ($arrSnapshots as $arrSnapshot) {
#remove os backups que estão fora da data de retenção
if(strtotime($arrSnapshot['Time']) < strtotime('-'.RETENCAO_DIAS.' DAYS')){
exec("aws ec2 delete-snapshot --snapshot-id ".$arrSnapshot['ID']);
}
}
@lira
Copy link

lira commented Mar 10, 2018

Xuxa o terror do AWS

@lira
Copy link

lira commented Mar 10, 2018

Era Ziza kkk

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment