Automatize backups para instâncias de banco de dados do Amazon RDS para PostgreSQL usando o AWS Batch - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Automatize backups para instâncias de banco de dados do Amazon RDS para PostgreSQL usando o AWS Batch

Criado por Kirankumar Chandrashekar (AWS)

Ambiente: PoC ou piloto

Tecnologias: contêineres e microsserviços; bancos de dados; DevOps

Workload: todas as outras workloads

Serviços da AWS: Amazon RDS; AWS Batch; Amazon CloudWatch; AWS Lambda; Amazon S3

Resumo

Fazer backup de seus bancos de dados PostgreSQL é uma tarefa importante e normalmente pode ser concluído com o utilitário pg_dump, que usa o comando COPIAR por padrão para criar um esquema e uma despejo de dados de um banco de dados PostgreSQL. No entanto, esse processo pode se tornar repetitivo se você precisar de backups regulares para vários bancos de dados PostgreSQL. Se seus bancos de dados PostgreSQL estiverem hospedados na nuvem, você também poderá aproveitar o atributo de backup automatizado fornecido pelo Amazon Relational Database Service (Amazon RDS) para PostgreSQL. Esse padrão descreve como automatizar backups regulares para instâncias de banco de dados Amazon RDS para PostgreSQL usando o utilitário pg_dump.

Observação: as instruções pressupõem que você esteja usando o Amazon RDS. No entanto, você também pode usar essa abordagem para bancos de dados PostgreSQL hospedados fora do Amazon RDS. Para fazer backups, a função do AWS Lambda deve conseguir acessar seus bancos de dados.

Um evento Amazon CloudWatch Events baseado em tempo inicia uma função Lambda que pesquisa tags de backup específicas aplicadas aos metadados das instâncias de banco de dados PostgreSQL no Amazon RDS. Se as instâncias de banco de dados PostgreSQL tiverem a tag BKP:AutomatedDBDump = Active e outras tags de backup necessárias, a função do Lambda enviará trabalhos individuais para cada backup de banco de dados para o AWS Batch. 

O AWS Batch processa essas tarefas e carrega os dados de backup em um bucket do Amazon Simple Storage Service (Amazon S3). Esse padrão usa um Dockerfile e um arquivo entrypoint.sh para criar uma imagem de contêiner do Docker que é usada para fazer backups no trabalho do AWS Batch. Após a conclusão do processo de backup, o AWS Batch registra os detalhes do backup em uma tabela de inventário no Amazon DynamoDB. Como proteção adicional, um evento CloudWatch Events inicia uma notificação do Amazon Simple Notification Service (Amazon SNS) se um trabalho falhar no AWS Batch. 

Pré-requisitos e limitações

Pré-requisitos

Arquitetura

Arquitetura para fazer backup de instâncias de banco de dados Amazon RDS for PostgreSQL usando o utilitário pg_dump.

Pilha de tecnologia

  • CloudWatch Eventos da Amazon

  • Amazon DynamoDB

  • Amazon Elastic Container Registry (Amazon ECR)

  • Amazon RDS

  • Amazon SNS

  • Amazon S3

  • AWS Batch

  • AWS Key Management Service (AWS KMS)

  • AWS Lambda

  • AWS Secrets Manager

  • Docker

Ferramentas

  • Amazon CloudWatch Events — CloudWatch Events fornece um fluxo quase em tempo real de eventos do sistema que descrevem mudanças nos recursos da AWS.

  • Amazon DynamoDB: o DynamoDB é um serviço de banco de dados NoSQL totalmente gerenciado que fornece uma performance rápida e previsível com escalabilidade integrada.

  • Amazon ECR: o Amazon Elastic Container Registry (Amazon ECR) é um serviço de registro de imagem de contêiner, seguro, escalável e confiável.

  • Amazon RDS: o Amazon Relational Database Service (Amazon RDS) é um serviço Web que facilita a configuração, a operação e escalabilidade de um banco de dados relacional na Nuvem AWS.

  • Amazon SNS: o Amazon Simple Notification Service (Amazon SNS) é um serviço gerenciado que fornece entrega de mensagens de editores para assinantes.

  • Amazon S3: o Amazon Simple Storage Service (Amazon S3) serve como armazenamento para a internet.

  • AWS Batch: o AWS Batch ajuda você a executar workloads de computação em lotes na Nuvem AWS.

  • AWS KMS: o AWS Key Management Service (AWS KMS) é um serviço gerenciado que facilita a criação e o controle de chaves do AWS KMS, que criptografam seus dados.

  • AWS Lambda: o AWS Lambda é um serviço de computação com tecnologia que ajuda a executar código sem provisionamento ou gerenciamento de servidores.

  • AWS Secrets Manager: o Secrets Manager ajuda você a substituir credenciais codificadas em seu código, incluindo senhas, por uma chamada de API ao Secrets Manager para recuperar o segredo programaticamente.

  • Docker: o Docker ajuda os desenvolvedores a empacotar, enviar e executar facilmente qualquer aplicativo como um contêiner leve, portátil e autossuficiente.

Suas instâncias de banco de dados PostgreSQL no Amazon RDS devem ter tags aplicadas aos seus metadados. A função do Lambda pesquisa tags para identificar instâncias de banco de dados que devem ser copiadas, e as tags a seguir são normalmente usadas.

Tag

Descrição

BKP:AutomatedDBDump = Ativo

Identifica uma instância de banco de dados Amazon RDS como candidata para backups.

bpm: = AutomatedBackupSecret <secret_name >

Identifica o segredo do Secrets Manager que contém as credenciais de login do Amazon RDS.

BKP: AutomatedDBDumps3Bucket = <s3_bucket_name>

Identifica o bucket do S3 para enviar backups.

BKP: banco de dados automatizado DumpFrequency

BKP: banco de dados automatizado DumpTime

Identifique a frequência e os horários em que o backup dos bancos de dados deve ser feito. 

bkp:pgdumpcommand = <pgdump_command>

Identifica os bancos de dados para os quais os backups precisam ser feitos.

Épicos

TarefaDescriçãoHabilidades necessárias

Crie uma tabela no DynamoDB.

Faça login no Console de Gerenciamento da AWS e abra o console do Amazon DynamoDB, e crie uma tabela. Para obter ajuda com esse e outros artigos, consulte a seção Recursos relacionados.

Administrador de nuvem, administrador de banco de dados

Confirme se a tabela foi criada.

Execute o comando aws dynamodb describe-table --table-name <table-name> | grep TableStatus. Se a tabela existir, o comando retornará o resultado "TableStatus": "ACTIVE",.

Administrador de nuvem, administrador de banco de dados
TarefaDescriçãoHabilidades necessárias

Criar um tópico do SNS.

Abra o console do Amazon SNS, escolha Tópicos e crie um tópico do SNS com o nome JobFailedAlert. Inscreva um endereço de e-mail ativo no tópico e verifique sua caixa de entrada de e-mail para confirmar o e-mail de assinatura do SNS a partir do AWS Notifications.

Administrador de nuvem

Crie uma regra de evento de trabalho com falha para o AWS Batch.

Abra o CloudWatch console da Amazon, escolha Eventos e, em seguida, escolha Criar regra. Escolha Mostrar opções avançadas, e escolha editar. Em Criar um padrão que selecione eventos para processamento pelos seus destinos, substitua o texto existente pelo código “Evento de trabalho com falha” na seção Informações adicionais. Esse código define uma regra de CloudWatch eventos que começa quando o AWS Batch tem um Failed evento.

Administrador de nuvem

Adicione o destino da regra do evento.

Em Destinos, selecione Adicionar destino e, em seguida, selecione o Tópico do SNS JobFailedAlert. Configurar os detalhes restantes e criar a regra do CloudWatch Events.

Administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Crie um repositório do Amazon ECR.

Abra o console do Amazon ECR e escolha a região da AWS na qual você deseja criar seu repositório. Escolha Repositórios e depois Adicionar repositório. Configure o repositório de acordo com seus requisitos.

Administrador de nuvem

Escreva um Dockerfile.

Faça login no Docker e use o “Dockerfile de amostra” e o “Exemplo de arquivo entrypoint.sh” da seção Informações adicionais para criar um Dockerfile.

DevOps engenheiro

Criar uma imagem do Docker e enviá-la ao repositório do Amazon ECR.

Crie o Dockerfile em uma imagem do Docker e envie-a para o repositório do Amazon ECR. Para obter ajuda com esta etapa, consulte a seção Recursos relacionados.

DevOps engenheiro
TarefaDescriçãoHabilidades necessárias

Criar uma definição de trabalho do AWS Batch.

Abra o console do AWS Batch e crie uma definição de trabalho que inclua o Uniform Resource Identifier (URI) do repositório Amazon ECR como propriedade Image.

Administrador de nuvem

Configure a fila de trabalhos do AWS Batch.

No console do AWS Batch, escolha Filas de trabalhos e, em seguida, escolha Criar fila. Crie uma fila de trabalhos que armazenará trabalhos até que o AWS Batch os execute nos recursos do seu ambiente computacional. Importante: certifique-se de escrever uma lógica para que o AWS Batch registre os detalhes do backup na tabela de inventário do DynamoDB.

Administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Crie uma função do Lambda para pesquisar tags.

Crie uma função do Lambda que pesquise tags em suas instâncias de banco de dados PostgreSQL e identifique candidatos a backup. Certifique-se de que sua função do Lambda possa identificar a tag bkp:AutomatedDBDump = Active e todas as outras tags necessárias. Importante: a função do Lambda também deve conseguir adicionar trabalhos à fila de trabalhos do AWS Batch.

DevOps engenheiro

Crie um evento de CloudWatch eventos com base no tempo.

Abra o CloudWatch console da Amazon e crie um evento CloudWatch Events que usa uma expressão cron para executar sua função Lambda em uma programação regular. Importante: Todos os eventos programados usam o fuso horário UTC.

Administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Criar uma chave do Amazon KMS.

Abra o console do Amazon KMS e crie uma chave KMS que possa ser usada para criptografar as credenciais do Amazon RDS armazenadas no AWS Secrets Manager.

Administrador de nuvem

Criar um segredo do AWS Secrets Manager.

Abra o console do AWS Secrets Manager e armazene suas credenciais do banco de dados do Amazon RDS para PostgreSQL como um segredo.

Administrador de nuvem

Adicione as tags necessárias às instâncias de banco de dados PostgreSQL.

Abra o console do Amazon RDS e adicione tags às instâncias de banco de dados PostgreSQL das quais você deseja fazer backup automático. Você pode usar as tags da tabela na seção Ferramentas. Se você precisar de backups de vários bancos de dados PostgreSQL na mesma instância do Amazon RDS, use -d test:-d test1 como valor para a tag bkp:pgdumpcommand. Importante: test e test1 são nomes de bancos de dados. Certifique-se de que não há espaço após os dois pontos (:).

Administrador de nuvem

Verifique a automação do backup.

Para verificar a automação do backup, você pode invocar a função do Lambda ou aguardar o início da programação de backup. Depois que o processo de backup estiver concluído, verifique se a tabela de inventário do DynamoDB tem uma entrada de backup válida para suas instâncias de banco de dados PostgreSQL. Se corresponderem, o processo de automação de backup será bem-sucedido.

Administrador de nuvem

Recursos relacionados

Crie uma tabela de inventário no DynamoDB

 

Crie um tópico do SNS para eventos de trabalho com falha no AWS Batch

 

Desenvolva uma imagem do Docker e enviá-la a um repositório do Amazon ECR

 

Crie os componentes do AWS Batch

 

Criar uma função do Lambda

 

Crie um evento de CloudWatch eventos

 

Teste a automação de backup

Mais informações

Evento de trabalho falhado:

{ "detail-type": [ "Batch Job State Change" ], "source": [ "aws.batch" ], "detail": { "status": [ "FAILED" ] } }

Exemplo de Dockerfile:

FROM alpine:latest RUN apk --update add py-pip postgresql-client jq bash && \ pip install awscli && \ rm -rf /var/cache/apk/* ADD entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"]

Exemplo de arquivo entrypoint.sh:

#!/bin/bash set -e DATETIME=`date +"%Y-%m-%d_%H_%M"` FILENAME=RDS_PostGres_dump_${RDS_INSTANCE_NAME} FILE=${FILENAME}_${DATETIME} aws configure --profile new-profile set role_arn arn:aws:iam::${TargetAccountId}:role/${TargetAccountRoleName} aws configure --profile new-profile set credential_source EcsContainer echo "Central Account access provider IAM role is: " aws sts get-caller-identity echo "Target Customer Account access provider IAM role is: " aws sts get-caller-identity --profile new-profile securestring=$(aws secretsmanager get-secret-value --secret-id $SECRETID --output json --query 'SecretString' --region=$REGION --profile new-profile) if [[ ${securestring} ]]; then echo "successfully accessed secrets manager and got the credentials" export PGPASSWORD=$(echo $securestring | jq --raw-output | jq -r '.DB_PASSWORD') PGSQL_USER=$(echo $securestring | jq --raw-output | jq -r '.DB_USERNAME') echo "Executing pg_dump for the PostGres endpoint ${PGSQL_HOST}" # pg_dump -h $PGSQL_HOST -U $PGSQL_USER -n dms_sample | gzip -9 -c | aws s3 cp - --region=$REGION --profile new-profile s3://$BUCKET/$FILE # in="-n public:-n private" IFS=':' list=($EXECUTE_COMMAND); for command in "${list[@]}"; do echo $command; pg_dump -h $PGSQL_HOST -U $PGSQL_USER ${command} | gzip -9 -c | aws s3 cp - --region=$REGION --profile new-profile s3://${BUCKET}/${FILE}-${command}".sql.gz" echo $?; if [[ $? -ne 0 ]]; then echo "Error occurred in database backup process. Exiting now....." exit 1 else echo "Postgresql dump was successfully taken for the RDS endpoint ${PGSQL_HOST} and is uploaded to the following S3 location s3://${BUCKET}/${FILE}-${command}.sql.gz" #write the details into the inventory table in central account echo "Writing to DynamoDB inventory table" aws dynamodb put-item --table-name ${RDS_POSTGRES_DUMP_INVENTORY_TABLE} --region=$REGION --item '{ "accountId": { "S": "'"${TargetAccountId}"'" }, "dumpFileUrl": {"S": "'"s3://${BUCKET}/${FILE}-${command}.sql.gz"'" }, "DumpAvailableTime": {"S": "'"`date +"%Y-%m-%d::%H::%M::%S"` UTC"'"}}' echo $? if [[ $? -ne 0 ]]; then echo "Error occurred while putting item to DynamoDb Inventory Table. Exiting now....." exit 1 else echo "Successfully written to DynamoDb Inventory Table ${RDS_POSTGRES_DUMP_INVENTORY_TABLE}" fi fi done; else echo "Something went wrong {$?}" exit 1 fi exec "$@"