Skip to content

Instantly share code, notes, and snippets.

@azizvc
Last active March 15, 2018 12:18
Show Gist options
  • Select an option

  • Save azizvc/66875896be7c11f789561f8bb03c34ef to your computer and use it in GitHub Desktop.

Select an option

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

lira commented Mar 10, 2018

Copy link
Copy Markdown

Era Ziza kkk

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