

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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch"></a>

*Kirankumar Chandrashekar, Amazon Web Services*

## Resumo
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-summary"></a>

Fazer backup de seus bancos de dados PostgreSQL é uma tarefa importante e normalmente pode ser concluído com o [utilitário pg\$1dump](https://www.postgresql.org/docs/current/app-pgdump.html), 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](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html) 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\$1dump.

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](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) PostgreSQL no Amazon RDS. Se as instâncias de banco de dados PostgreSQL tiverem **a tag DBDump BKP:automated =** Active e outras tags de backup necessárias, a função 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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-prereqs"></a>

**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](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) na documentação do AWS Batch. 
+ [Interface de linha de comandos (CLI) versão 2 imagem do Docker](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html), instalada e configurada.
+ Instâncias de banco de dados do Amazon RDS para PostgreSQL existentes  
+ Um bucket do S3 existente 
+ [jDocker](https://www.docker.com/), instalado e configurado em macOS, Linux ou Windows
+ Familiaridade com a codificação em Lambda. 

## Arquitetura
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-architecture"></a>

![\[Arquitetura para fazer backup de instâncias do Amazon RDS para PostgreSQL usando o utilitário pg_dump.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/3283f739-980b-43d4-aca0-9d77a2ce3b85/images/352e2eab-1b7d-44ec-840a-a772a175e873.png)


 

**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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-tools"></a>
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) — CloudWatch Events fornece um fluxo quase em tempo real de eventos do sistema que descrevem mudanças nos recursos da AWS.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html): 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](https://docs.aws.amazon.com/ecr/index.html): 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](https://docs.aws.amazon.com/rds/index.html): 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](https://docs.aws.amazon.com/sns/latest/dg/welcome.html): o Amazon Simple Notiﬁcation Service (Amazon SNS) é um serviço gerenciado que fornece entrega de mensagens de editores para assinantes.
+ [Amazon S3](https://docs.aws.amazon.com/s3/index.html): o Amazon Simple Storage Service (Amazon S3) serve como armazenamento para a internet.
+ [AWS Batch](https://docs.aws.amazon.com/batch/index.html): o AWS Batch ajuda você a executar workloads de computação em lotes na Nuvem AWS.
+ [AWS KMS](https://docs.aws.amazon.com/kms/index.html): 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](https://docs.aws.amazon.com/lambda/index.html): 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](https://docs.aws.amazon.com/secretsmanager/index.html): 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](https://www.docker.com/): 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](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html). 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 | Description | 
| --- |--- |
| BKP: Automatizado = Ativo DBDump  | Identifica uma instância de banco de dados Amazon RDS como candidata para backups. | 
| bpm: = AutomatedBackupSecret <secret\$1name > | Identifica o segredo do Secrets Manager que contém as credenciais de login do Amazon RDS. | 
| BKP: S3 Bucket automatizado = DBDump <s3\$1bucket\$1name> | Identifica o bucket do S3 para enviar backups. | 
| BKP: Frequência automatizada DBDumpBKP: Tempo automatizado DBDump | Identifique a frequência e os horários em que o backup dos bancos de dados deve ser feito.  | 
| bkp:pgdumpcommand = <pgdump\$1command> | Identifica os bancos de dados para os quais os backups precisam ser feitos. | 

## Épicos
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-epics"></a>

### Crie uma tabela de inventário no DynamoDB
<a name="create-an-inventory-table-in-dynamodb"></a>


| Tarefa | Description | 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 `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 | 

### Crie um tópico do SNS para eventos de trabalho com falha no AWS Batch
<a name="create-an-sns-topic-for-failed-job-events-in-aws-batch"></a>


| Tarefa | Description | 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 `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**. Na etapa **Criar um padrão que selecione eventos para processamento pelos seus destinos**, substitua o texto existente pelo código “Evento de trabalho com falha” apresentado 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 | 

### Desenvolva uma imagem do Docker e enviá-la a um repositório do Amazon ECR
<a name="build-a-docker-image-and-push-it-to-an-amazon-ecr-repository"></a>


| Tarefa | Description | 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 “arquivo entrypoint.sh de amostra” apresentados na 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 | 

### Crie os componentes do AWS Batch
<a name="create-the-aws-batch-components"></a>


| Tarefa | Description | 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 `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 | 

### Crie e publique uma função do Lambda
<a name="create-and-schedule-a-lambda-function"></a>


| Tarefa | Description | 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 `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 | 

### Teste a automação de backup
<a name="test-the-backup-automation"></a>


| Tarefa | Description | 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 gerar backups de vários bancos de dados do PostgreSQL na mesma instância do Amazon RDS, use `-d test:-d test1` como valor da etiqueta `bkp:pgdumpcommand`. `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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-resources"></a>

**Crie uma tabela de inventário no DynamoDB**
+ [Crie uma tabela do Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)

 

**Crie um tópico do SNS para eventos de trabalho com falha no AWS Batch**
+ [Crie um tópico do Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)
+ [Envie alertas do SNS sobre eventos de trabalho com falha no AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/batch_sns_tutorial.html)

 

**Desenvolva uma imagem do Docker e enviá-la a um repositório do Amazon ECR**
+ [Crie um repositório do Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)    
+ [Escreva um Dockerfile, crie uma imagem do Docker e envie-a para o Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

 

**Crie os componentes do AWS Batch**
+ [Crie uma definição de trabalho do AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-1)    
+ [Configure seu ambiente computacional e a fila de trabalhos do AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-2)   
+ [Crie uma fila de trabalhos no AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/create-job-queue.html)

 

**Criar uma função do Lambda**
+ [Crie uma função do Lambda e escreva código](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)
+ [Use o Lambda com o DynamoDB](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html)

 

**Crie um evento de CloudWatch eventos**
+ [Crie um evento de CloudWatch eventos baseado em tempo](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)   
+ [Use expressões cron em eventos do Cloudwatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)

 

**Teste a automação de backup**
+ [Crie uma chave do Amazon KMS](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)    
+ [Crie um segredo do Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)
+ [Adicione tags a uma instância do Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)

## Mais informações
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-additional"></a>

**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 "$@"
```