Criação de um sistema de DNS dinâmico sem servidor com a AWS

Como estava esse conteúdo?

Esta postagem foi publicada originalmente em dezembro de 2015. Ela foi atualizada em julho de 2023 para tornar a solução mais econômica e eficiente. Esta postagem foi atualizada para substituir o Amazon API Gateway por URLs de função do AWS Lambda e o Amazon Simple Storage Service (Amazon S3) pelo Amazon DynamoDB. O uso de URLs de função do Lambda reduz o custo geral da solução. Esse recurso não tem custo adicional ao usar o serviço Lambda e fornece um endpoint HTTPs RESTful com o qual nosso cliente interage. A substituição do Amazon S3 pelo DynamoDB aumenta a eficiência da solução e reduz a latência geral ao consultar dados.

Startups em estágio inicial, pequenas empresas e redes domésticas geralmente têm endereços IP públicos dinâmicos que podem mudar sem aviso prévio. Por causa dessa mudança de endereço, não é possível acessar de forma confiável os sistemas nessas redes de fora. Para startups nos estágios iniciais de seu ciclo de vida, é importante fornecer um serviço confiável e altamente disponível para ganhar a confiança de seu primeiro conjunto de clientes.

Os sistemas de DNS dinâmicos resolvem esse problema, executando um agente de software em sua rede para manter um registro de DNS atualizado com o endereço IP público mais recente. Desde que o registro de DNS esteja atualizado, você poderá encontrar sua rede e os clientes poderão acessar seu serviço de forma confiável.

Nesta postagem, descrevemos como criar seu próprio sistema de DNS dinâmico usando serviços da AWS sem servidor. Criar um sistema sem servidor usando nada além dos serviços da Amazon Web Services (AWS) e algumas linhas de código é simples, econômico e escalável, e permite que você se concentre na lógica comercial principal da sua startup, em vez de se preocupar em escalar e manter a infraestrutura subjacente.

Serviços da AWS que usamos em nosso sistema de DNS dinâmico

Nas próximas seções, mostraremos como usar os seguintes serviços da AWS para criar uma solução dinâmica de DNS:

  • O serviço AWS Lambda permite executar código sem precisar gerenciar os servidores subjacentes. Seu código está sempre pronto para ser executado, mas as cobranças são aplicáveis somente por invocação da função, em incrementos de 1 milissegundo. O serviço Lambda pode interagir com outros serviços da AWS por meio dos AWS SDKs.
  • Os URLs de função do Lambda fornecem um endpoint HTTPS dedicado para sua função do Lambda. Isso permite invocar diretamente a função da sua aplicação cliente sem a necessidade de usar um SDK da AWS ou invocar a função por meio de um serviço de proxy adicional. Esse atributo não tem custo adicional para o serviço Lambda.
  • O Amazon Route 53 é um serviço de DNS gerenciado que permite registrar e hospedar domínios e zonas DNS a partir de uma rede global de servidores de DNS. Como acontece com todos os serviços da AWS, o Route 53 pode ser gerenciado por meio de APIs.
  • O DynamoDB é um banco de dados de chave-valor NoSQL, sem servidor e totalmente gerenciado, projetado para executar aplicações de alta performance em qualquer escala. O DynamoDB oferece segurança integrada, backups contínuos, replicação automatizada de várias regiões, cache na memória e ferramentas de importação e exportação de dados.

Fluxo lógico do sistema de DNS dinâmico

A Figura 1 mostra como um cliente encontra seu próprio endereço IP fazendo uma solicitação de API para um serviço criado usando uma função do Lambda e sua URL de função anexada.

Conforme mostrado na Figura 2, agora que o cliente conhece seu IP público, ele faz outra solicitação ao nosso serviço para definir um registro de DNS. A função do Lambda primeiro consulta o registro armazenado na nossa tabela do DynamoDB para validar a solicitação. Se a verificação for aprovada, a função do Lambda definirá a entrada DNS no Route 53 por meio de uma chamada de API. Agora, o IP atual da rede está no DNS público e pode ser encontrado por uma consulta ao DNS padrão.

Benefícios do DNS dinâmico com o Lambda e o Route 53

Aqui estão algumas vantagens que você obterá ao executar um sistema de DNS dinâmico sem servidor:

  • Mais fácil de configurar. Há um cliente de amostra junto com todo o código, configuração e instruções para configurar isso em na própria conta da AWS.
  • Thin client ou nenhum cliente. São necessários três comandos para atualizar a API. Você pode escrever seu próprio cliente na maioria das linguagens e executá-lo em plataformas, incluindo Windows, Linux, macOS, Raspberry Pi, Chrome OS e firmware do roteador DD-WRT/Tomato USB.
  • Suporte para um número arbitrário de clientes, nomes de host e domínios. Os limites e cotas do serviço do Route 53 podem ser encontrados na seção “Cotas” do Guia do Desenvolvedor do Route 53.
  • Econômico: USD 1 a USD 2 por mês. Cada zona do Route 53 custa USD 0,50 por mês, 1.000.000 de consultas de DNS custam USD 0,40 e 10.000 solicitações de função do Lambda para atualizar o DNS custam menos de USD 0,01.
  • Arquitetura sem servidor. As tecnologias sem servidor da AWS contam com escalabilidade automática, alta disponibilidade integrada e um modelo de faturamento pago por utilização para aumentar a agilidade e otimizar os custos.
  • Permissões granulares permitem que somente clientes autorizados atualizem seu próprio nome de host. Os clientes podem atualizar o sistema somente a partir do endereço que está sendo adicionado ao DNS.
  • Pequenas alterações são necessárias para sua configuração atual de DNS. Você pode deixar sua zona .com primária com seu provedor de DNS atual e usar uma zona dynamic.example.com secundária na AWS. Consulte “Criar uma zona hospedada pública no Guia do desenvolvedor do Route 53 para obter mais informações sobre a criação de zonas hospedadas no Route 53.

Pré-requisitos

Você precisará de duas coisas para criar essa solução:

  1. Uma conta da AWS.Novas contas estão qualificadas para o  nível gratuito da AWS.
  2. Um domínio que você possui, hospedado no Route 53 ou em outro provedor. Você pode registrar domínios por meio do Route 53, se necessário, a partir de apenas USD 3,00. Consulte os  preços do Amazon Route 53 para registro de domínio para obter uma gama completa de preços.

Como criar um sistema de DNS dinâmico na sua conta

Neste ponto, você tem informações suficientes para começar a criar sua própria cópia do sistema. Se quiser saber mais sobre como isso funciona, continue lendo.

Se você quiser começar a criar, o  DNS dinâmico do Route 53 com o Lambda está disponível no GitHub. Ele fornece instruções ilustradas e todo o código e a configuração necessários.

Como o novo sistema funciona

Primeiro, o cliente precisa encontrar o IP público atribuído à sua rede. Se você fizer uma solicitação da sua rede para um serviço na Internet, esse serviço verá a solicitação proveniente do seu endereço IP externo.

Em seguida, o cliente faz uma solicitaçãoHTTP POSTpara a URL da função do Lambda com um corpo de solicitação {"execution_mode":"get"} e recebe uma resposta contendo o endereço IP público atual:

HTTP POST
> https://.....lambda-url.eu-west-1.on.aws

{“return_message”:
“176.32.100.36”, “return_status”: “success”}

Durante esse processo, o URL da função do Lambda converte a solicitaçãoHTTPem JSON, incluindo todos os parâmetros da solicitação, e passa o endereço IP de origem do solicitante para uma função do Python Lambda. Em seguida, a função do Lambda envia uma resposta JSON com o IP de volta ao cliente.

A Figura 3 mostra uma solicitação para obter um IP público.

O cliente agora cria um token de solicitação vinculando o endereço IP público retornado da solicitação HTTP POST, o nome do host DNS e um segredo compartilhado. Por exemplo, se seu endereço IP for  176.32.100.36, seu nome de host for host1.dyn.example.com e seu segredo compartilhado for  shared_secret_1, a string vinculada será a seguinte:

176.32.100.36host1.dyn.example.comshared_secret_1

Em seguida, o cliente gera uma  função de SHA-256 a partir da string:

echo -n 176.32.100.36host1.dyn.example.comshared_secret_1 | shasum -a 256

Hash: 96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535

Em seguida, o cliente solicita a atualização do DNS fazendo uma segunda solicitação  HTTP POST. Ele passa o nome do host de texto simples como uma chave e a função hash como o token de autenticação dentro do corpo da solicitação:

HTTP POST > https://....lambda-url.eu-west-1.on.aws

{“execution_mode”:”set”, “ddns_hostname”:”host1.dyn.example.com”, “validation_hash”:”96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535”}

Em seguida, o URL da função do Lambda passa os parâmetros da solicitação de volta para a função do Lambda.

Depois disso, a função do Lambda consulta seu registro de configuração JSON do DynamoDB usando o AWS SDK for Python (Boto3). Nesse sistema, as interações entre o serviço do Lambda, o DynamoDB e o Route 53 usam o Boto3, que é pré-incorporado ao ambiente de tempo de execução do serviço do Lambda.

Depois que nossa função do Lambda consulta o registro de configuração do DynamoDB, ela usa o nome do host como chave para encontrar o segredo compartilhado e outras configurações associadas a esse registro, semelhante ao seguinte exemplo de registro:

{
"host1.dyn.example.com.": {
"aws_region": "us-west-2",
"route_53_zone_id": "MY_ZONE_ID",
"route_53_record_ttl": 60,
"route_53_record_type": "A",
"shared_secret": "SHARED_SECRET_1"
},
"host2.dyn.example.com.": {.....

O cliente passou host1.dyn.example.com como chave, então a função do Lambda lê SHARED_SECRET_1 na configuração e reconstrói o token da função hash usando o nome do host, o endereço IP do solicitante e o segredo compartilhado. Se a função hash calculada pela função Lambda e a função hash recebida do cliente corresponderem, a solicitação será considerada válida.

Depois que a solicitação é validada, a função do Lambda usa as informações da configuração para fazer uma chamada de API para o Route 53 para ver se o nome do host DNS já está definido com o IP do cliente. Se nenhuma alteração for necessária, a função do Lambda responde ao cliente e é encerrada:

{“return_message”: “Seu endereço IP corresponde ao registro de DNS atual do Route53.”,
 “return_status”: “success”}

Se não houver registro ou se o registro atual e o IP do cliente não corresponderem, a função do Lambda fará uma chamada de API para o Route 53 para definir o registro, responde ao cliente e é encerrada:

{“return_message”: “Seu registro de nome de host host1.dyn.example.com. foi definido como 176.32.100.36”,
 “return_status”: “success”}

A Figura 4 mostra a solicitação para definir o nome do host.

Como esse sistema é protegido?

  • Todas as comunicações usando URLs da função Lambda são criptografadas.
  • O segredo compartilhado nunca é transmitido pela Internet.
  • A taxa de solicitação do cliente pode ser reduzida usando o atributo de  simultaneidade reservada do serviço Lambda.
  • O mecanismo de autenticação é multifatorial porque o cliente apresenta o segredo compartilhado (“algo que ele tem”) e seu próprio endereço IP público (“algo que é”).
  • O arquivo de configuração pode ser criptografado em repouso por meio da criptografia no lado do servidor do DynamoDB.
  • Suas credenciais da AWS não são usadas e, portanto, não podem ser vazadas.

Conclusão

O sistema de DNS dinâmico que descrevemos neste postagem mostra como criar sua própria solução sem servidor na AWS para resolver um problema real: o DNS é suscetível a mudanças e talvez você não saiba!

Use essa solução para executar seu próprio DNS dinâmico na AWS. Ou use-o como exemplo para saber como você pode usar os serviços da AWS para criar suas próprias soluções sem servidor em qualquer escala.

Acesse o repositório  DNS dinâmico do Route 53 com Lambda no GitHub para obter um conjunto completo de códigos, configurações e instruções sobre como implantar.

Como estava esse conteúdo?