Sviluppo di un sistema DNS dinamico serverless con AWS

Com'era questo contenuto?

Questo post è stato originariamente pubblicato nel dicembre 2015. È stato aggiornato a luglio 2023 per rendere la soluzione più economica ed efficiente. Questo post è stato aggiornato per sostituire Gateway Amazon API con gli URL delle funzioni AWS Lambda e Amazon Simple Storage Service (Amazon S3) con Amazon DynamoDB. L'utilizzo degli URL delle funzioni Lambda riduce il costo complessivo della soluzione. Questa funzionalità non comporta costi aggiuntivi quando si utilizza il servizio Lambda e fornisce un endpoint HTTPs RESTful con cui il nostro cliente interagisce. La sostituzione di Amazon S3 con DynamoDB aumenta l'efficienza della soluzione e riduce la latenza complessiva durante l'interrogazione dei dati.

Le startup in fase iniziale, le piccole imprese e le reti domestiche hanno spesso indirizzi IP pubblici dinamici che possono cambiare senza preavviso. A causa di questo cambiamento di indirizzo, non è possibile accedere in modo affidabile ai sistemi su queste reti dall'esterno. Per le startup nelle prime fasi del loro ciclo di vita, è importante fornire un servizio affidabile e altamente disponibile per conquistare la fiducia del primo gruppo di clienti.

I sistemi DNS dinamici risolvono questo problema eseguendo un agente software all'interno della rete per mantenere aggiornato un record DNS con l'indirizzo IP pubblico più recente. Finché il record DNS è aggiornato, puoi trovare la tua rete e i clienti possono accedere in modo affidabile al tuo servizio.

In questo post, descriviamo come creare il tuo sistema DNS dinamico utilizzando servizi AWS serverless. La creazione di un sistema serverless utilizzando nient'altro che i servizi Amazon Web Services (AWS) e poche righe di codice è semplice, conveniente e scalabile e ti consente di concentrarti sulla logica di business principale della tua startup, anziché preoccuparti della scalabilità e della manutenzione dell'infrastruttura sottostante.

Servizi AWS che utilizziamo nel nostro sistema DNS dinamico

Nelle prossime sezioni, ti mostriamo come utilizzare i seguenti servizi AWS per creare una soluzione DNS dinamica:

  • Il servizio AWS Lambda consente di eseguire codice senza dover gestire i server sottostanti. Il codice è sempre pronto per l'esecuzione, ma ti viene addebitato solo per ogni chiamata della funzione, con incrementi di 1 millisecondo. Il servizio Lambda può interagire con altri servizi AWS tramite SDK AWS.
  • Gli URL delle funzioni Lambda forniscono un endpoint HTTPS dedicato per la funzione Lambda. Ciò consente di richiamare direttamente la funzione dall'applicazione client senza la necessità di utilizzare un SDK AWS o richiamare la funzione tramite un servizio proxy aggiuntivo. Questa funzionalità non comporta costi aggiuntivi per il servizio Lambda.
  • Amazon Route 53 è un servizio DNS gestito che consente di registrare e ospitare domini e zone DNS da una rete globale di server DNS. Come tutti i servizi AWS, Route 53 può essere gestito tramite API.
  • DynamoDB è un database NoSQL chiave-valore completamente gestito, serverless, progettato per eseguire applicazioni ad alte prestazioni su qualsiasi scala. DynamoDB offre sicurezza integrata, backup continui, replica automatizzata in più regioni, cache in memoria e strumenti di importazione ed esportazione dei dati.

Flusso logico del sistema DNS dinamico

La Figura 1 mostra come un client trova il proprio indirizzo IP effettuando una richiesta API a un servizio creato utilizzando una funzione Lambda e l'URL della funzione associata.

Come mostrato nella Figura 2, ora che il client conosce il suo IP pubblico, invia un'altra richiesta al nostro servizio per impostare un record DNS. La funzione Lambda consulta innanzitutto il record memorizzato nella nostra tabella DynamoDB per convalidare la richiesta. Se il controllo ha esito positivo, la funzione Lambda imposta quindi la voce DNS in Route 53 tramite una chiamata API. Ora l'IP corrente della rete è nel DNS pubblico e può essere trovato tramite una query DNS standard.

Vantaggi del DNS dinamico con Lambda e Route 53

Ecco alcuni vantaggi che otterrai eseguendo un sistema DNS dinamico serverless:

  • Più facile da configurare. C'è un client di esempio con tutto il codice, la configurazione e le istruzioni per configurarlo nel tuo account AWS.
  • Sottile fino a nessun cliente. Sono necessari tre comandi per aggiornare l'API. Puoi scrivere il tuo client nella maggior parte delle lingue ed eseguirlo su piattaforme, tra cui Windows, Linux, macOS, Raspberry Pi, Chrome OS e il firmware del router USB DD-WRT/Tomato.
  • Supporto per un numero arbitrario di client, nomi host e domini.I limiti e le quote del servizio Route 53 sono disponibili nella sezione "Quote" della Guida per gli sviluppatori di Route 53.
  • Conveniente: da 1 a 2 USD al mese. Le zone Route 53 costano ciascuna 0,50 USD al mese, 1.000.000 di query DNS costano 0,40 USD e 10.000 richieste di funzioni Lambda per aggiornare il DNS costano meno di 0,01 USD.
  • Architettura serverless. Le tecnologie serverless sono caratterizzate da dimensionamento automatico, alta disponibilità integrata e un modello di fatturazione con pagamento in base al consumo per aumentare l'agilità e ottimizzare i costi.
  • Le autorizzazioni granulari consentono solo ai client autorizzati di aggiornare il proprio nome host. I client possono aggiornare il sistema solo dall'indirizzo che viene aggiunto al DNS.
  • Sono necessarie modifiche minori per l'attuale configurazione DNS. Puoi lasciare la tua zona .com primaria con il tuo provider DNS corrente e utilizzare una zona dynamic.example.com secondaria in AWS. Consulta "Creazione di una zona ospitata pubblica" nella Guida per gli sviluppatori di Route 53 per ulteriori informazioni sulla creazione di zone ospitate in Route 53.

Prerequisiti

Avrai bisogno di due elementi per creare questa soluzione:

  1. Un account AWS. I nuovi account sono idonei per il piano gratuito AWS.
  2. Un dominio di tua proprietà, ospitato su Route 53 o su un altro provider. Puoi registrare domini tramite Route 53, se necessario, a partire da un minimo di 3 USD. Consulta i prezzi di Amazon Route 53 per la registrazione del dominio per una gamma completa di prezzi.

Come creare un sistema DNS dinamico nel tuo account

A questo punto, hai abbastanza informazioni per iniziare a creare la tua copia del sistema. Se vuoi saperne di più su come funziona, continua a leggere.

Se vuoi iniziare a creare, il DNS dinamico di Route 53 con Lambda è disponibile su GitHub. Fornisce istruzioni illustrate e tutto il codice e la configurazione necessari.

Come funziona il nuovo sistema

Innanzitutto, il client deve trovare l'IP pubblico assegnato alla sua rete. Se invii una richiesta dalla tua rete a un servizio su Internet, quel servizio vedrà la richiesta provenire dal tuo indirizzo IP esterno.

Quindi, il client invia una richiesta HTTP POST all'URL della funzione Lambda con un corpo della richiesta di {"execution_mode":"get"} e ottiene una risposta contenente l'indirizzo IP pubblico corrente:

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

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

Durante questo processo, l'URL della funzione Lambda converte la richiesta HTTP in JSON, inclusi tutti i parametri della richiesta, e passa l'indirizzo IP di origine del richiedente a una funzione Lambda Python. La funzione Lambda invia quindi una risposta JSON con l'IP al client.

La Figura 3 mostra una richiesta per ottenere un IP pubblico.

Il client ora crea un token di richiesta collegando l'indirizzo IP pubblico restituito dalla richiesta HTTP POST, il nome host DNS e un segreto condiviso. Ad esempio, se il tuo indirizzo IP è 176.32.100.36, il nome host è host1.dyn.example.com e il tuo segreto condiviso è shared_secret_1, la stringa collegata sarà la seguente:

176.32.100.36host1.dyn.example.comshared_secret_1

Successivamente, il client genera una funzione hast SHA-256  dalla stringa:

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

Hash: 96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535

Il client richiede quindi l'aggiornamento DNS effettuando una seconda richiesta HTTP POST. Passa il nome host in testo semplice come chiave e la funzione hash come token di autenticazione all'interno del corpo della richiesta:

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

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

L'URL della funzione Lambda passa quindi i parametri della richiesta alla funzione Lambda.

Successivamente, la funzione Lambda interroga il record di configurazione JSON da DynamoDB utilizzando AWS SDK per Python (Boto3). In questo sistema, le interazioni tra il servizio Lambda, DynamoDB e Route 53 utilizzano Boto3, che è preintegrato nell'ambiente di runtime del servizio Lambda.

Una volta che la nostra funzione Lambda interroga il record di configurazione da DynamoDB, utilizza il nome host come chiave per trovare il segreto condiviso e altre configurazioni associate a quel record, simile al seguente record di esempio:

{
"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.": {.....

Il client ha passato host1.dyn.example.com come chiave, quindi la funzione Lambda legge SHARED_SECRET_1 dalla configurazione e rigenera il token della funzione hash tramite il nome host, l’indirizzo IP del richiedente e il segreto condiviso. Se la funzione hash calcolata dalla funzione Lambda e la funzione hash ricevuta dal client corrispondono, allora la richiesta è considerata valida.

Una volta convalidata la richiesta, la funzione Lambda utilizza le informazioni della configurazione per effettuare una chiamata API a Route 53 per verificare se il nome host DNS è già impostato con l'IP del client. Se non è necessaria alcuna modifica, la funzione Lambda risponde al client ed esce:

{“return_message”: “Il tuo indirizzo IP corrisponde al record DNS di Route53 corrente.”,
 “return_status”: “success”}

Se non è presente alcun record o se il record corrente e l'IP del client non corrispondono, la funzione Lambda effettua una chiamata API a Route 53 per impostare il record, risponde al client e restituisce:

{“return_message”: “Il tuo record di nome host host1.dyn.example.com. è stato impostato su 176.32.100.36”,
 “return_status”: “success”}

La Figura 4 mostra la richiesta di impostare il nome host.

Come viene protetto questo sistema?

  • Tutte le comunicazioni che utilizzano gli URL delle funzioni Lambda sono crittografate.
  • Il segreto condiviso non viene mai trasmesso su Internet.
  • La velocità delle richieste del cliente può essere limitata utilizzando la funzionalità di concorrenza riservata del servizio Lambda.
  • Il meccanismo di autenticazione è a più fattori perché il client presenta il segreto condiviso ("qualcosa che ha") e il proprio indirizzo IP pubblico ("qualcosa che è").
  • Il file di configurazione può essere crittografato a riposo tramite crittografia lato server DynamoDB.
  • Le tue credenziali AWS non vengono utilizzate, quindi non possono essere divulgate.

Conclusioni

Il sistema DNS dinamico che descriviamo in questo post mostra come creare la tua soluzione serverless su AWS per risolvere un problema reale: il DNS è suscettibile di modifiche e potresti non esserne consapevole!

Usa questa soluzione per eseguire il tuo DNS dinamico su AWS. Oppure usala come esempio per scoprire come utilizzare i servizi AWS per creare soluzioni serverless personalizzate su qualsiasi scala.

Visita il repository DNS dinamico Route 53 con Lambda su GitHub per un set di codice completo, la configurazione e le istruzioni su come eseguire l’implementazione.

Com'era questo contenuto?