O blog da AWS

Como arquivar conteúdo de bancos de dados relacionais no Amazon Glacier usando o AWS DMS

Por Gowri Balasubramanian, Arquiteto sênior de soluções na AWS
Ganesh Shankaran, Arquiteto sênior de soluções na AWS e
Marcos Freccia, Sênior Database Architect na AWS

 

Março de 2023: Esta postagem foi revisada e atualizada com diagramas de arquitetura e capturas de tela da AWS Console.Você pode usar o AWS Database Migration Service (AWS DMS) para migrar dados de várias fontes para os bancos de dados comerciais e de código aberto mais usados. O AWS DMS também oferece suporte ao Amazon S3 como fonte e como destino para migrações. Ao usar o Amazon S3 como destino, você pode usar o AWS DMS para extrair informações de qualquer banco de dados compatível com o AWS DMS. Em seguida, você pode gravá-lo no Amazon S3 no formato CSV, que pode ser usado por praticamente qualquer aplicação.Você pode usar esse recurso nos dois cenários a seguir:

  1. Como parte da migração de bancos de dados comerciais como o Oracle para o Amazon RDS para PostgreSQL, você pode migrar dados acessados com pouca frequência, ou dados históricos de auditoria e arquivamento para serviços de armazenamento da AWS, como Amazon S3 ou Amazon Glacier. Isso pode ajudá-lo a atender às necessidades de governança e conformidade para retenção de dados a longo prazo.
  2. À medida que o tamanho dos dados aumenta nos bancos de dados relacionais, os administradores de banco de dados (DBAs) e os desenvolvedores passam mais tempo monitorando, reorganizando índices e partições para manter o desempenho ideal. Essa manutenção adicional leva ao aumento das despesas operacionais de armazenamento de dados devido à redundância e ao backup. É uma prática recomendada arquivar dados acessados com pouca frequência no Amazon S3 ou no Amazon Glacier para melhor economia de custos e capacidade de gerenciamento.

Neste post, falamos sobre o segundo caso de uso, em que dados acessados com pouca frequência — por exemplo, informações de vendas com mais de alguns meses ou anos (geralmente chamados de cold data) — são arquivados em um cofre seguro por um longo período. As equipes financeiras ou de segurança da informação devem poder acessar esses dados quando necessário, embora essas solicitações possam ser esporádicas.

Se você comparar o custo por GB de armazenamento por mês do Amazon RDS PostgreSQL Multi-AZ GP2 com o do Amazon Glacier na região us-east-1, o custo de armazenamento do Amazon Glacier é cerca de 57 vezes menor do que o do Amazon RDS. Por exemplo, o custo de 100 GB de armazenamento por mês no Amazon Glacier é inferior a um dólar (0,10 USD), em comparação com o armazenamento Amazon RDS Multi-AZ, que é de 23,00 USD (no momento em que este artigo foi escrito).

Neste post, mostro como usar o AWS DMS para armazenar os dados do Amazon RDS PostgreSQL no Amazon S3 como um arquivo CSV e depois arquivar o mesmo no Amazon Glacier. O Amazon Glacier oferece várias opções de recuperação que permitem que você recupere os dados em alguns minutos a várias horas. Em seguida, uso o recurso Amazon Glacier Select para consultar um subconjunto dos dados do arquivamento. Com o Amazon Glacier Select, você pode realizar análises em seus dados sem prepará-los em um nível de armazenamento mais avançado, como o Amazon S3. Isso torna mais barato, rápido e fácil coletar informações de seus dados não armazenados no Amazon Glacier.

Etapas de alto nível

Para ajudar você a gerenciar toda a infraestrutura desta publicação, criamos um modelo do AWS CloudFormation que provisiona todos os recursos necessários juntamente com o código do AWS Lambda usado na publicação. Você pode encontrar o código neste repositório do GitHub. A solução demonstrada nesta postagem inclui os seguintes passos:

  1. Baixe o conjunto de dados públicos contendo informações de registro de propriedades no Reino Unido em https://data.gov.uk.
  2. Crie um vault do Amazon Glacier para armazenar o arquivo.
  3. Execute o template do AWS CloudFormation que crie os recursos necessários. Isso inclui a Virtual Private Cloud (VPC), a instância PostgreSQL do Amazon RDS, a instância de replicação do AWS DMS, o bucket do S3, as políticas do IAM e outros recursos necessários para este exemplo.
  4. Crie as pastas no Amazon S3.
  5. Conecte-se à instância do RDS e faça a carga do conjunto de dados usando o cliente PostgreSQL.
  6. Crie uma função no AWS Lambda e configure uma notificação de evento do S3 para acionar a função Lambda. Essa função baixa o arquivo do S3 e o carrega no Amazon Glacier assim que o arquivo CSV é criado pelo AWS DMS.
  7. Configure os endpoints de origem e de destino para o AWS DMS.
  8. Configure uma tarefa do AWS DMS para extrair os dados da instância do RDS para o Amazon S3.
  9. Crie uma função Lambda para recuperar o subconjunto de dados do arquivamento usando o Amazon Glacier Select.
  10.  Veja os resultados do arquivamento no bucket S3.
  11.  Limpe os recursos da AWS.

Nota: Para ilustrar essa arquitetura, o exemplo usa computação serverless. Usamos uma função do AWS Lambda para baixar arquivos CSV criados pelo AWS DMS e enviá-los para o Amazon Glacier. O AWS Lambda tem capacidade de disco local de até 10240 MB e, portanto, essa solução pressupõe que os arquivos estejam abaixo desse limite. Para arquivos maiores que 10240 MB, considere anexar um Amazon Elastic File System (EFS) à sua função do Lambda.

Pré-requisitos e suposições

Para concluir essa solução, você deve ter o seguinte:

  1. Uma conta da AWS que fornece acesso aos serviços mostrados no diagrama anterior. As etapas são executadas na região us-east-1 (Norte da Virgínia). Antes de começar, certifique-se de que os serviços usados nesta postagem estejam disponíveis em sua região da AWS.
  2. Uma ferramenta que se conecta a um banco de dados PostgreSQL, como psql ou pgAdmin.
  3. Conhecimento prático do Amazon RDS, AWS DMS, Amazon VPC, Amazon S3 e AWS Lambda.

Etapas detalhadas

As seções a seguir orientam você nas etapas necessárias para criar e configurar a solução.

1. Baixe o conjunto de dados de amostra

Baixe este arquivo de registro predial do Reino Unido, que contém uma década de informações de registro de propriedades.

Nota: Este arquivo contém dados do HM Land Registry data Crown copyright e direitos autorais do banco de dados de 2018. Esses dados são licenciados sob a Open Government License v3.0. Os dados fornecidos nesta postagem incluem dados de endereço com restrições de uso, incluindo uso pessoal e não comercial. Para obter mais informações sobre o uso permitido desse conjunto de dados, consulte Price Paid Data no site Gov.uk.

Você pode salvar o arquivo em qualquer instância do Amazon EC2 (preferencial) ou em seu computador local que tenha o cliente PostgreSQL instalado.

No momento em que este artigo foi escrito, esse conjunto de dados contém informações de registro de propriedades no Reino Unido de 1995 a 2017, com aproximadamente 22 milhões de registros. Presumimos que você precisa extrair dados antigos anualmente (ou seja, partições por ano) e arquivá-los no Amazon Glacier. Depois de armazená-lo com sucesso no Amazon Glacier, você pode excluir esses registros do Amazon RDS.

2. Crie o vault do Amazon Glacier

  1. Faça login no AWS Management Console e pesquise por S3 Glacier ou clique no console do Amazon Glacier. Crie um vault com o nome rdsarchive na região us-east-1. Na área Notificações de eventos, escolha a opção Turn off notifications e clique em Create vault.
  2. Anote o nome e o Amazon Resource Name (ARN) do vault.

3. Execute o template do AWS CloudFormation

  1. Copie ou baixe o arquivo JSON do AWS CloudFormation desse repositório do GitHub.
  2. Acesse o console do AWS CloudFormation e escolha Criar Stack.
  3. Execute o template fazendo o upload do arquivo JSON da Etapa 1.
  4. Especifique os valores dos parâmetros obrigatórios:
    1. Digite um nome para o stack, por exemplo, dms-archive.
    2. Forneça um nome de bucket exclusivo do S3. No meu caso, usei o nome rdspgtoglacier.
    3. Para o parâmetro VaultName, ele deve ser o mesmo da Etapa 2.
    4. Para ExistsDMSRole, especifique Y se o dms-vpc-role já estiver criado em sua conta da AWS. Caso contrário, especifique N para que ele possa ser criado com essa stack do CloudFormation. Para obter mais informações sobre como configurar essa Role, consulte Criação de IAM Roles para uso com a CLI da AWS e a API do AWS DMS.
  5. Os demais valores dos parâmetros são opcionais e podem ser deixados como configurações padrão.
  6. Escolha Avançar e navegue até a última página.
  7. Na última página, em Capacidades, selecione a opção: Eu reconheço que o AWS CloudFormation pode criar recursos do IAM com nomes customizados.
  8. Escolha Enviar.

Alguns recursos, como o nome do bucket S3, devem ser exclusivos em todos os nomes de bucket existentes no Amazon S3. (Neste post, eu uso o nome do bucket rdspgtoglacier.) Recomendamos que você restrinja o acesso à instância do Amazon RDS para seu intervalo de IP específico (por padrão, ele permite o acesso a 0.0.0.0/0). A criação da stack do AWS CloudFormation leva cerca de 10 a 15 minutos e cria os seguintes recursos.

  1. Um bucket Amazon S3 com o nome fornecido.
  2. Uma instância de replicação do AWS DMS chamada rds-to-s3.
  3. Uma IAM Role para execução do Lambda chamada rdsarchive-lambda-execution. Adicione a política gerenciada AWSLambdaBasicExecutionRole para a Role, afim de que a Lambda Function possa criar e acessar o Amazon CloudWatch Logs.
  4. Uma política (IAM) chamada lambda-to-archive-policy para fornecer acesso ao bucket S3 e ao vault do Amazon Glacier que é criado na Etapa 2, e adicioná-lo ao rdsarchive-lambda-execution
  5. Uma IAM Role chamada dms-vpc-função para gerenciar configurações de VPC para configurações de clientes gerenciadas pela AWS. Adicione a política gerenciada AmazonDMSVPCManagementRole à Role, caso ela ainda não tenha sido criada.
  6. Uma política do IAM dmsvpcs3policy (para PUT e DELETE dos objetos do bucket criado na Etapa 1). Adicione-o ao dms-vpc-role
  7. Uma instância do Amazon RDS com identificador archivedb, nome do banco de dados ukdb, nome de usuário dbadmin e senha padrão postgres123.
  8. Uma VPC para as instâncias PostgreSQL e AWS DMS do Amazon RDS e um security group afim de permitir o acesso à instância PostgreSQL do RDS a partir do seu intervalo de IP.

Os recursos da AWS provisionados são atribuídos com nomes padrão no template. Se você fornecer nomes diferentes ao criar o stack, use esses nomes no restante das etapas. Você pode anotar os nomes dos recursos, os nomes dos endpoints do RDS, o nome do bucket do S3 e assim por diante na seção Outputs da execução do Stack.

4. Crie as pastas do Amazon S3

Depois de criar a pilha, acesse o console do Amazon S3 e localize o bucket rdspgtoglacier. Crie as duas pastas a seguir no bucket:

  1. A pasta ukregistry, que atua como um destino para o AWS DMS.
  2. A pasta output, que atua como um destino para o Amazon Glacier Select recuperar os dados do arquivamento.

5. Faça a carga dos dados na instância de banco de dados Amazon RDS

  1. Usando psql ou pgAdmin, conecte-se à instância de banco de dados RDS da seguinte forma (supondo que você esteja usando o nome de banco de dados padrão ukdb e o nome de usuário dbadmin):
  1. psql -h <RDS DNS Endpoint>  -d ukdb -U dbadmin  -p 5432
  2. Crie a tabela do banco de dados e faça a carga do conjunto de dados do Reino Unido, conforme mostrado a seguir:
    Nota:
    Outra opção é baixar o conjunto de dados para uma instância do EC2 e carregá-lo de lá por meio do psql instalado nessa instância do EC2.

    CREATE TABLE uk_property_registry(
      transaction uuid,
      price numeric,
      transfer_date date,
      postcode text,
      property_type char(1),
      newly_built boolean,
      duration char(1),
      paon text,
      saon text,
      street text,
      locality text,
      city text,
      district text,
      county text,
      ppd_category_type char(1),
      record_status char(1));
      
    # Load the data from the downloaded CSV file to the table. Provide the complete path of the CSV file.
    
    \copy uk_property_registry FROM '<dataset_file_complete_path>' with (format csv, header false, null '', quote '"', force_null (postcode, saon, paon, street, locality, city, district));

Depois de uma carga de dados bem-sucedida, você verá uma saída como COPY 27910954 ou poderá executar a consulta select count (*) em uk_property_registry; para verificar se a carga dos dados foi finalizada com sucesso.

6. Crie uma função Lambda para baixar o arquivo do S3 e enviá-lo para o vault do Amazon Glacier

  1. No console do AWS Lambda, crie a Lambda function archivetoglacier da seguinte forma:
    1. Clique em Use um blueprint e selecione a opção Obter objeto S3 com o runtimedo Python 3.7.
    2. Para o nome da Lambda function, digite archivetoglacier.
    3. Clique em Usar uma Role existente e selecione a IAM Role rdsarchive-lambda-execution para essa Lambda function.
    4. Sob o S3 Trigger, escolha o bucket rdspgtoglacier.
    5. Para o tipo de evento, escolha Todos os eventos de criação de objetos.
    6. Especifique ukregistry/ como prefixo.
    7. Clique na mensagem de confirmação que aparece na parte inferior da tela.
    8. Crie a Lambda Function.
    9. Depois de criada, edite a mesma.
    10. Substitua todo o código na janela pelo código Python do repositório do GitHub.
    11. Clique em Deploy
  2. Clique na guia Configuração que aparece acima do código da Lambda Function.
  3. Na seção Configuração geral, clique em Editar e aumente o tempo limite do Lambda para 5 minutos e clique em salvar.
  4. Na seção Variáveis de ambiente, especifique uma nova variável.
    1. Chave: vaultname
    2. Valor: rdsarchive
  5. Clique para Salvar.

Salve as alterações.

O código exibido anteriormente busca o objeto S3, faz o download para uma instância do Lambda e o carrega no vault do Amazon Glacier. Essa Lambda function usa o nome do vault do Amazon Glacier por meio das variáveis de ambiente.

7. Configure os endpoints de origem e de destino para o AWS DMS

  1. Abra o console do AWS DMS e escolha Endpoints no painel de navegação. Crie um endpoint de origem para o banco de dados PostgreSQL usando a instância do RDS que você criou na Etapa 3, conforme mostrado a seguir:

Verifique se o nome do banco de dados, a porta e as informações do usuário estão corretos.

2. Escolha Executar teste e teste o endpoint. Se o teste for bem-sucedido, não se esqueça de salvar o endpoint. Se o teste falhar, verifique as configurações do endpoint e do Security Group.

3. Escolha Refresh Schemas após o teste bem-sucedido.

4. Crie um endpoint de destino para a conexão S3, conforme mostrado a seguir:

a. Especifique a IAM Role do ARN dms-vpc-role como arn:aws:iam:<AWS Account>::role/dms-vpc-role.

b. Especifique o nome do bucket e a pasta do Bucket na Etapa 4.

c. Escolha Executar teste e teste o endpoint. Se o teste for bem-sucedido, não se esqueça de salvar o endpoint. Se o teste falhar, verifique a configuração da IAM Role e o nome do bucket do S3.

8. Configure uma tarefa de DMS para extrair os dados da instância do RDS para o S3

  1. Abra o console do AWS DMS. Escolha Tarefas de migração de banco de dados no painel de navegação e escolha Criar tarefa.
  2. Para o identificador da tarefa, use archivetos3.
  3. Use a instância de replicação que foi criada por meio do AWS CloudFormation e os endpoints que você criou na Etapa 7.
  4. Em Tipo de migração, escolha Migrar dados existentes.

7. Aceite os valores padrão nas Configurações da tarefa.

8. Na seção Mapeamentos de tabela, clique em Adicionar nova regra de seleção.

1. No esquema, escolha Inserir um esquema

a. Nome do schema: public.

b. Nome da tabela de origem: uk_property_registry.

9 O AWS DMS oferece a opção de adicionar filtros de coluna, que permitem que você extraia os dados que atendem aos seus critérios de arquivamento. Neste exemplo, você pode especificar a coluna transfer_date para extrair os dados de um determinado ano — por exemplo, transfer_date entre 1995-01-01 e 1996-01-01, conforme mostrado a seguir. Escolha Adicionar regra de seleção.

 

8. Escolha Criar tarefa. Em seguida, a tarefa de migração é executada porque a opção Iniciar tarefa ao criar está selecionada. O status da tarefa muda de Criando para Iniciando, depois para Executando e, finalmente, para Carregamento Concluído.

9. Você pode verificar se o AWS DMS extrai o subconjunto de informações da tabela como um arquivo CSV e o armazena no caminho S3 que você especificou.

10. Examine o conteúdo do bucket S3:

a. Check whether the Lambda function was invoked for the upload process.

b. Go to the AWS Lambda console and choose the archivetoglacier

c. Choose the Monitor tab, and check to see whether the function was invoked as the S3 trigger is configured on the bucket.

11. Verifique se a Lambda function foi invocada para o processo de upload.

a. Acesse o console do AWS Lambda e escolha archivetoglacier.

b. Escolha a guia Monitoramento e verifique se a função foi invocada com o S3 Trigger que está configurado no bucket.

c. Clique nos três pontos e vá para Exibir logs.

d. Clique no Log Group exibido abaixo.

e. Observe o archiveid (valor de u’archiveId‘) da operação de upload do Amazon Glacier a partir do log. Você precisa disso para a próxima etapa.

9. Crie uma Lambda Function para recuperar o subconjunto dos dados

Agora, vamos supor que você precise identificar os registros feitos com preço > 500.000 no ano de 1995 a partir do arquivo. Com o Amazon Glacier Select, você pode extrair o subconjunto de dados do arquivamento usando uma consulta SQL. Isso não apenas reduz o tempo total envolvido na consulta, mas também simplifica a maneira como você pode acessar os dados arquivados. É importante entender a estrutura do arquivo CSV arquivado e as operações e os tipos de dados do SQL que são compatíveis com o recurso Amazon Glacier Select.

Neste exemplo, você usará a seguinte expressão SQL para recuperar os dados. A segunda coluna (s._2 ) é o atributo de preço na tabela e o arquivo CSV que foi carregado como arquivo. Você usa a função CAST para converter isso em decimal porque o Amazon Glacier, por padrão, assume esses atributos como uma string. Embora o Amazon Glacier ofereça suporte a várias opções de recuperação, usamos a opção Padrão para esta publicação. O Amazon Glacier Select armazena a saída em um bucket S3 especificado na tarefa de recuperação.

select s._1,s._2,s._3,s._4,s._5,s._12,s._13 from archive s  where CAST(s._2 AS DECIMAL) >= 500000

Você pode usar uma Lambda function para alcançar este resultado.

  1. Crie uma função Lambda da seguinte forma:
    1. No console do AWS Lambda, escolha Criar função.
    2. Escolha a opção Author from scratch
    3. Digite glacierselect para o nome da função.
    4. Escolha o Python 3.9 para runtime.
    5. Em Permissões, clique em Alterar role de execução padrão
      1. Escolha usar uma Role existente rdsarchive-lambda-execution para essa Lambda function.
    6. Crie a Lambda function.
    7. Depois de criada, edite a Lambda function.
    8. Substitua todo o código no editor pelo código Python do repositório GitHub e clique em Deploy.
    9. Clique na guia Configuração que aparece acima do código da Lambda function.
      1. Na seção Configuração geral, clique em Editar e aumente o timeout da Lambda para 5 minutos e clique em salvar.
    10. Na seção Variáveis de ambiente, adicione as seguintes variáveis. É importante que você forneça os valores corretos, como bucketname, o prefixo da Etapa 4 e o archiveid da Etapa 8.

  1. Invoque a função glacierselect da Lambda manualmente usando uma linha de comando ou teste-a usando um evento de teste fictício “Hello World”, conforme mostrado a seguir.
  2. Teste a função glacierselect da Lambda usando o evento de teste que você criou na Etapa 2. Você pode ver a saída no console da Lambda, conforme mostrado a seguir. Como alternativa, você também pode visualizar as informações nos registros da Lambda.

10.Veja os resultados do arquivamento no bucket S3

Após uma invocação bem sucedida, pode levar algumas horas para obter a saída na pasta S3 (output/skaxxxx/results) porque você usou a opção de recuperação padrão para o Amazon Glacier. Se você precisar visualizar os resultados mais rapidamente, considere a opção Expedited. No meu caso, demorou 4 horas para que os resultados estivessem disponíveis.

Além disso, você pode considerar a opção Bulk retrieval para baixar o grande volume de dados de maneira econômica. Você pode baixar o arquivo de resultado e analisá-lo usando o editor de texto. Como alternativa, você pode fazer o re-upload dos dados em uma tabela do Amazon RDS, usando o AWS DMS com S3 como fonte.

A seguir estão exemplos de dados com um valor de registro de propriedade > 500.000 recuperados do Amazon Glacier usando o Amazon Glacier Select:

11. Remova todos os recursos

  1. Remova o conjunto de dados públicos do Reino Unido do seu EC2/desktop local porque ele contém dados com restrições de uso.
  2. Exclua as pastas criadas no bucket do S3
  3. Exclua as AWS Lambda Functions criadas
  4. Exclua a stack do AWS CloudFormation que você criou na Etapa 3. A execução dessa etapa remove todos os recursos usados nesta postagem.
  5. Exclua o vault do Amazon Glacier.

Outras sugestões:

  1. Você pode estender essa arquitetura para incluir o Amazon DynamoDB e criar uma solução completa de arquivamento. Você pode armazenar o archiveid do Amazon Glacier no DynamoDB com uma descrição significativa (por exemplo: Table: rdsarchive partition_key= archive_criteria_id(uk_registry_1996), Attribute1 (archiveid=xxxx), Attribute2 (date_created=xxxx) etc.) para indexação. Em seguida, você pode recuperá-lo programaticamente conforme necessário.
  2. Se precisar consultar os dados arquivados com mais frequência, você pode usar o AWS DMS para arquivá-los no S3 e fazer consultas via Amazon S3 Select ou Amazon Athena.
  3. Você pode automatizar o processo de arquivamento agendando tarefas do AWS DMS para serem executadas periodicamente.

Conclusão

Gerenciar dados em constante crescimento é um grande desafio para muitas empresas. Esta postagem explicou como você pode usar o AWS DMS, o Amazon Glacier, o AWS Lambda e o Amazon S3 para lidar com dados acessados com pouca frequência e armazenados em bancos de dados relacionais. O recurso Amazon Glacier Select ajuda você a reduzir custos e melhorar o desempenho ao reduzir o conjunto de dados direcionado que você usa ao consultar os arquivos de dados. Essa combinação de serviços ajuda você a gerenciar o crescimento de seus dados, enquanto equilibra custo e desempenho.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre os autores

Gowri Balasubramanian é arquiteto sênior de soluções na Amazon Web Services. Ele trabalha com clientes da AWS para fornecer orientação e assistência técnica sobre serviços de banco de dados relacionais e NoSQL, ajudando-os a melhorar o valor de suas soluções ao usar a AWS.

 

 

 

 

Ganesh Shankaran é arquiteto sênior de soluções na Amazon Web Services. Ele trabalha com clientes da AWS para fornecer orientação e assistência técnica para ajudá-los a melhorar o valor de suas soluções ao usar a AWS.

 

 

 

 

Marcos Freccia é Sênior Database Architect em migrações de banco de dados da equipe de ProServe da AWS. Ele tem apoiado e capacitado os clientes em sua jornada para migrar e modernizar suas soluções de banco de dados de data centers on-premises para a AWS.

 

 

 

 

Revisor

Bruno Lopes é Senior Solutions Architect no time da AWS LATAM. Trabalha com soluções de TI há mais de 14 anos, tendo em seu portfólio inúmeras experiências em workloads Microsoft, ambientes híbridos e capacitação técnica de clientes como Technical Trainer e Evangelista. Agora atua como um Arquiteto de Soluções, unindo todas as capacidades para desburocratizar a adoção das melhores tecnologias afim de ajudar os clientes em seus desafios diários.