amazon web services - Strategie di backup per bucket AWS S3




amazon-web-services amazon-s3 (4)

Originariamente pubblicato sul mio blog: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/

Sincronizza periodicamente il tuo bucket S3 su un server EC2

Ciò può essere facilmente ottenuto utilizzando più utilità della riga di comando che consentono di sincronizzare un bucket S3 remoto con il filesystem locale.

s3cmd
All'inizio, s3cmd sembrava estremamente promettente. Tuttavia, dopo averlo provato sul mio enorme secchio S3, non è riuscito a ridimensionarlo, sbagliando con un Segmentation fault . Ha funzionato bene su piccoli secchi, però. Dal momento che non funzionava con enormi secchi, ho deciso di trovare un'alternativa.

s4cmd
La più recente alternativa multi-threaded a s3cmd . Sembrava ancora più promettente, tuttavia, ho notato che continuava a ri-scaricare i file che erano già presenti sul filesystem locale. Questo non è il tipo di comportamento che mi aspettavo dal comando di sincronizzazione. Dovrebbe controllare se il file remoto esiste già localmente (il controllo di hash / file dovrebbe essere ordinato) e saltare nella prossima sincronizzazione eseguita sulla stessa directory di destinazione. Ho aperto un problema ( bloomreach/s4cmd/#46 ) per segnalare questo strano comportamento. Nel frattempo, ho deciso di trovare un'altra alternativa.

awscli
E poi ho trovato awscli . Questa è l'interfaccia ufficiale della riga di comando di Amazon per interagire con i diversi servizi cloud, incluso S3.

Fornisce un utile comando di sincronizzazione che scarica rapidamente e facilmente i file bucket remoti sul tuo filesystem locale .

$ aws s3 sync s3://your-bucket-name /home/ubuntu/s3/your-bucket-name/

Benefici:

  • Scalabile: supporta enormi bucket S3
  • Multi-thread: sincronizza i file più velocemente utilizzando più thread
  • Smart: sincronizza solo i file nuovi o aggiornati
  • Veloce: grazie alla sua natura multi-thread e all'algoritmo di sincronizzazione intelligente

Cancellazione accidentale

Convenientemente, il comando sync non cancellerà i file nella cartella di destinazione (filesystem locale) se mancano dall'origine (bucket S3) e viceversa. Questo è perfetto per eseguire il backup di S3 - nel caso in cui i file vengano eliminati dal bucket, la risincronizzazione non li eliminerà localmente. E nel caso in cui elimini un file locale, non verrà eliminato neanche dal bucket di origine.

Impostazione di awscli su Ubuntu 14.04 LTS

Iniziamo installando awscli . Ci sono diversi modi per farlo, tuttavia, ho trovato più facile installarlo tramite apt-get .

$ sudo apt-get install awscli

Configurazione

Successivamente, dobbiamo configurare awscli con il nostro ID chiave di accesso e la chiave segreta, che devi ottenere da IAM , creando un utente e allegando la politica di AmazonS3ReadOnlyAccess . Ciò impedirà anche a te oa chiunque abbia accesso a tali credenziali di eliminare i tuoi file S3. Assicurati di inserire la tua regione S3, ad esempio us-east-1 .

$ aws configure

Preparazione

Prepariamo la directory di backup S3 locale, preferibilmente in /home/ubuntu/s3/{BUCKET_NAME} . Assicurati di sostituire {BUCKET_NAME} con il nome del bucket effettivo.

$ mkdir -p /home/ubuntu/s3/{BUCKET_NAME}

Sincronizzazione iniziale

Andiamo avanti e sincronizziamo il bucket per la prima volta con il seguente comando:

$ aws s3 sync s3://{BUCKET_NAME} /home/ubuntu/s3/{BUCKET_NAME}/

Supponendo che il bucket esista, le credenziali e la regione AWS siano corrette e la cartella di destinazione sia valida, awscli inizierà a scaricare l'intero bucket sul filesystem locale.

A seconda delle dimensioni del bucket e della connessione Internet, potrebbero passare da pochi secondi a qualche ora. Fatto questo, procederemo e configureremo un cron cron automatico per mantenere aggiornata la copia locale del bucket.

Impostazione di un processo Cron

Vai avanti e crea un file sync.sh in /home/ubuntu/s3 :

$ nano /home/ubuntu/s3/sync.sh

Copia e incolla il seguente codice in sync.sh :

#!/bin/sh

# Echo the current date and time

echo '-----------------------------'
date
echo '-----------------------------'
echo ''

# Echo script initialization
echo 'Syncing remote S3 bucket...'

# Actually run the sync command (replace {BUCKET_NAME} with your S3 bucket name)
/usr/bin/aws s3 sync s3://{BUCKET_NAME} /home/ubuntu/s3/{BUCKET_NAME}/

# Echo script completion
echo 'Sync complete'

Assicurati di sostituire {BUCKET_NAME} con il nome del bucket S3, due volte in tutto lo script.

/usr/bin/aws pro: dovresti usare /usr/bin/aws per collegarti al binario aws , dato che crontab esegue i comandi in un ambiente shell limitato e non sarà in grado di trovare l'eseguibile da solo.

Quindi, assicurati di chmod lo script in modo che possa essere eseguito da crontab .

$ sudo chmod +x /home/ubuntu/s3/sync.sh

Proviamo a eseguire lo script per assicurarci che funzioni effettivamente:

$ /home/ubuntu/s3/sync.sh

L'output dovrebbe essere simile a questo:

Successivamente, modifichiamo il crontab dell'utente corrente eseguendo il seguente comando:

$ crontab -e

Se è la prima volta che esegui crontab -e , dovrai selezionare un editor preferito. Ti consiglio di selezionare nano perché è il metodo più semplice con cui i principianti possono lavorare.

Frequenza di sincronizzazione

Dobbiamo dire a crontab quanto spesso eseguire il nostro script e dove lo script risiede sul filesystem locale scrivendo un comando. Il formato per questo comando è il seguente:

m h  dom mon dow   command

Il seguente comando configura crontab per eseguire lo script sync.sh ogni ora (specificato tramite il minuto: 0 e ora: * parametri) e per fare in modo che l'output dello script sync.log a un file sync.log nella nostra directory s3 :

0 * * * * /home/ubuntu/s3/sync.sh > /home/ubuntu/s3/sync.log

Dovresti aggiungere questa linea alla fine del file crontab che stai modificando. Quindi, vai avanti e salva il file sul disco premendo Ctrl + W e quindi Invio . Puoi quindi uscire da nano premendo Ctrl + X. crontab eseguirà ora l'attività di sincronizzazione ogni ora.

/home/ubuntu/s3/sync.log : puoi verificare che il processo cron /home/ubuntu/s3/sync.log venga eseguito correttamente ispezionando /home/ubuntu/s3/sync.log , controllandone il contenuto per la data e l'ora di esecuzione e ispezionando i log per vedere quali nuovi file sono stati sincronizzati .

Tutto stabilito! Il tuo bucket S3 verrà ora sincronizzato automaticamente con il tuo server EC2 ogni ora e dovresti essere pronto. Si noti che con il passare del tempo, man mano che il bucket S3 diventa più grande, potrebbe essere necessario aumentare le dimensioni del volume EBS del server EC2 per accogliere nuovi file. Puoi sempre aumentare le dimensioni del tuo volume EBS seguendo questa guida .

Sto cercando alcuni consigli o best practice per eseguire il backup del bucket S3.
Lo scopo di eseguire il backup dei dati da S3 è impedire la perdita di dati a causa di quanto segue:

  1. Problema S3
  2. problema in cui ho cancellato accidentalmente questi dati da S3

Dopo alcune indagini vedo le seguenti opzioni:

  1. Utilizza le versioni http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
  2. Copia da un bucket S3 a un altro utilizzando AWS SDK
  3. Backup su Amazon Glacier http://aws.amazon.com/en/glacier/
  4. Backup su server di produzione, a sua volta sottoposto a backup

Quale opzione dovrei scegliere e quanto sarebbe sicuro memorizzare i dati solo su S3? Vuoi sentire le tue opinioni.
Alcuni link utili:


È possibile eseguire il backup dei dati S3 utilizzando i seguenti metodi

  1. Pianifica il processo di backup usando la datapipeline AWS, può essere fatto in due modi:

    un. Utilizzo di copyActivity di datapipeline mediante il quale è possibile copiare da un bucket s3 a un altro s3 bucket.

    b. Utilizzo di ShellActivity dei comandi datapipeline e "S3distcp" per eseguire la copia ricorsiva delle cartelle s3 ricorsive dal bucket all'altra (in parallelo).

  2. Utilizzare il controllo delle versioni all'interno del bucket S3 per mantenere una versione diversa dei dati

  3. Usa il ghiacciaio per il backup dei tuoi dati (usalo quando non hai bisogno di ripristinare il backup velocemente nei bucket originali (ci vuole del tempo per recuperare i dati dal ghiacciaio mentre i dati sono archiviati in formato compresso) o quando vuoi salvare un certo costo evitando di utilizzare un altro s3 bucket per il backup), questa opzione può essere facilmente impostata utilizzando la regola del ciclo di vita sul bucket s3 da cui si desidera eseguire il backup.

L'opzione 1 può darti più sicurezza diciamo nel caso in cui elimini accidentalmente il tuo secchio s3 originale e un altro vantaggio è che puoi archiviare il backup in cartelle di stampa in un altro secchio s3, in questo modo sai quali dati hai in una determinata data e puoi ripristinare un backup della data specifico. Tutto dipende dal tuo caso d'uso.


Mentre questa domanda è stata postata qualche tempo fa, ho pensato che fosse importante menzionare la protezione da eliminazione MFA con le altre soluzioni. L'OP sta cercando di risolvere per la cancellazione accidentale dei dati. L'autenticazione a più fattori (MFA) si manifesta in due diversi scenari qui:

  1. Eliminazione permanente delle versioni degli oggetti - Abilita eliminazione MFA nel controllo versioni del bucket.

  2. Cancellazione accidentale del bucket stesso - Impostare un criterio bucket che nega l'eliminazione senza l'autenticazione MFA.

Accoppiamento con la replica e il controllo delle versioning regioni per ridurre il rischio di perdita di dati e migliorare gli scenari di ripristino.

Ecco un post sul blog su questo argomento con maggiori dettagli.


Si potrebbe pensare che ora sarebbe più semplice mantenere una sorta di backup incrementali su una regione diff.

Tutti i suggerimenti sopra non sono soluzioni semplici o eleganti. Non considero veramente il ghiacciaio un'opzione, perché penso che sia più una soluzione di archiviazione che una soluzione di backup. Quando penso al backup, penso che il disaster recovery da uno sviluppatore junior cancellerà ricorsivamente un bucket o forse un exploit o un bug nella tua app che elimina materiale da s3.

Per me, la soluzione migliore sarebbe una sceneggiatura che esegue il backup di un bucket in un'altra regione, una al giorno e una alla settimana, in modo che se accade qualcosa di terribile, puoi semplicemente cambiare regione. Non ho un setup come questo, ho cercato di non averlo fatto perché ci sarebbe voluto un po 'di sforzo per farlo, ed è per questo che vorrei che ci fosse qualche soluzione di scorta da usare.







amazon-glacier