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
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
Uma conta AWS ativa
Um ambiente computacional gerenciado ou não gerenciado existente. Para obter mais informações, consulte Ambientes de computação gerenciados e não gerenciados na documentação do AWS Batch.
Interface de linha de comandos (CLI) versão 2 imagem do Docker, instalada e configurada.
Instâncias de banco de dados do Amazon RDS para PostgreSQL existentes
Um bucket do S3 existente
jDocker
, instalado e configurado em macOS, Linux ou Windows Familiaridade com a codificação em Lambda.
Arquitetura
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
Tarefa | Descrição | Habilidades 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 | Administrador de nuvem, administrador de banco de dados |
Tarefa | Descrição | Habilidades 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 | 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 | Administrador de nuvem |
Adicione o destino da regra do evento. | Em Destinos, selecione Adicionar destino e, em seguida, selecione o Tópico do SNS | Administrador de nuvem |
Tarefa | Descrição | Habilidades 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 |
Tarefa | Descrição | Habilidades 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 | 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 |
Tarefa | Descrição | Habilidades 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 | 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 |
Tarefa | Descrição | Habilidades 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 | 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 "$@"