Os instantâneos da máquina são a cópia "grossa": todo o disco, para quando algo se estraga. Mas às vezes quer algo mais fino e mais barato: uma cópia diária de uma pasta (os carregamentos do site, os documentos, um despejo da base de dados) num sítio fora da máquina, de onde possa recuperar um único ficheiro sem restaurar nada. Isso é o S3, e a ferramenta de linha de comandos da AWS traz um comando, aws s3 sync, que copia só o que mudou. Agendado todas as noites, é a cópia de ficheiros mais barata e fiável que pode ter.
Antes de começar: o que significa cada coisa
- S3 e bucket
- O S3 é o armazém de ficheiros da Amazon; um bucket é a "pasta raiz" onde os guarda, com nome único no mundo.
- AWS CLI
- A ferramenta de linha de comandos da AWS: um programa que se instala na máquina e permite dar ordens à AWS escrevendo comandos.
- sync (sincronizar)
- Comparar uma pasta com o bucket e copiar só o que é novo ou mudou. Da primeira vez copia tudo; das seguintes, pouco.
- Chave de acesso
- O utilizador e palavra-passe para programas. Aqui será usada pela máquina para falar com o S3; deve ter permissão só para esse bucket.
- Cron
- O agendador de tarefas do Linux: executa um comando à hora que lhe disser, todos os dias.
- Controlo de versões
- Opção do S3 que guarda as versões anteriores de um ficheiro. Protege de uma cópia noturna substituir algo bom por algo estragado.
Passo a passo
Crie o bucket
Consola do S3, Criar bucket, nome único (
copias-miempresa-web), mesma região que a máquina (assim a transferência entre ambos não gasta quota nem é cobrada), bloquear todo o acesso público ativado, controlo de versões ativado e encriptação por defeito. Crie.Crie uma chave que só possa escrever nesse bucket
No IAM, crie uma política com este conteúdo (mude o nome do bucket) e um utilizador
copias-webcom essa política e uma chave de acesso, como explica o guia do utilizador IAM com permissões mínimas:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::copias-miempresa-web" }, { "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"], "Resource": "arn:aws:s3:::copias-miempresa-web/*" } ] }Se essa chave um dia vazasse, a única coisa que alguém poderia fazer era mexer nesse bucket. Nada mais.
Instale a ferramenta da AWS na máquina
Por SSH, em Ubuntu ou Debian:
sudo apt update && sudo apt install -y awscli(No Amazon Linux já vem instalada.) Configure-a com a chave do passo anterior:
aws configurePede-lhe o identificador da chave, o segredo, a região (
eu-west-1, por exemplo) e o formato de saída (deixejson). Ficam guardados na pasta do utilizador, legíveis só por ele.Teste o comando à mão
aws s3 sync /var/www/html/uploads s3://copias-miempresa-web/uploads --deleteDa primeira vez demora, porque carrega tudo; verá cada ficheiro a passar. Das seguintes só carrega o que mudou. A opção
--deleteapaga no bucket o que já não está na pasta, para que a cópia seja um espelho; com o controlo de versões ativado, o apagado continua recuperável. Confirme na consola do S3 que os ficheiros lá estão.Acrescente a base de dados, se a tiver
Para que a cópia tenha também a base de dados, despeje-a antes para um ficheiro na mesma pasta que se sincroniza, por exemplo com um pequeno script
/usr/local/bin/copia.sh:#!/bin/bash mysqldump -u usuario -pCONTRASEÑA nombre_bd | gzip > /var/copias/bd-$(date +%F).sql.gz find /var/copias -name "bd-*.sql.gz" -mtime +7 -delete aws s3 sync /var/copias s3://copias-miempresa-web/bd aws s3 sync /var/www/html/uploads s3://copias-miempresa-web/uploads --deleteDê-lhe permissões de execução (
chmod 700) e teste-o comsudo /usr/local/bin/copia.sh. A linha dofindapaga na máquina os despejos com mais de uma semana; no S3 ficam.Agende-o todas as noites
sudo crontab -eAcrescente no fim uma linha para as 3:30 da madrugada (hora da máquina, que costuma ser UTC):
30 3 * * * /usr/local/bin/copia.sh >> /var/log/copia.log 2>&1Guarde. No dia seguinte veja
/var/log/copia.loge a data dos ficheiros no S3. Ponha ainda uma regra de ciclo de vida no bucket que apague as versões antigas passados 30 ou 90 dias, para que não cresça sem fim (guia nesta secção).
O que pode correr mal
"Access Denied" ao sincronizar
A política não cobre o que pede: confirme que o nome do bucket está exato nas duas linhas de Resource, e que a primeira (ListBucket) não leva /* e a segunda sim.
A cópia demora horas
Primeira execução com muitos ficheiros pequenos: normal. Se todas as noites demora, há ficheiros que mudam sempre (caches, registos): exclua-os com --exclude "cache/*".
A palavra-passe da base de dados está no script
Melhor pô-la no ficheiro ~/.my.cnf do utilizador root com permissões 600, e tirar -pCONTRASEÑA do comando. E que o script só possa ser lido pelo root.
Apaguei um ficheiro sem querer e a cópia noturna também o apagou
É para isso que serve o controlo de versões: na consola do S3, ative "Mostrar versões" na pasta e recupere a versão anterior. Sem controlo de versões, ter-se-ia perdido: por isso se ativa no passo 1.
No Simplio
No Simplio lança a cópia noturna para o S3 a partir do catálogo de scripts: escolhe a pasta da máquina e o bucket, e o Simplio cria a chave com permissões só para esse bucket, instala o necessário e agenda a tarefa, sem abrir um terminal. O bucket vê-se no Simplio como uma pasta, com as suas versões, para recuperar um ficheiro com dois cliques. E se uma noite a cópia não aparecer, avisa-o por e-mail.
O mesmo, na AWS e no Simplio
| Na consola da AWS | No Simplio | |
|---|---|---|
| Montar a cópia noturna | Bucket, política IAM, chave, instalar a CLI, script, cron: 6 passos e um terminal, 25 minutos | Script "Cópia para S3" do catálogo: escolhe a pasta e o bucket, o Simplio cria a chave limitada e agenda a tarefa |
| Saber se ontem à noite se fez | Ver o log na máquina | Aviso por e-mail se uma cópia agendada não aparecer |
| Recuperar um ficheiro | Consola do S3, procurar, versões | Abrir o bucket no Simplio como uma pasta e descarregar |