Création d’un système DNS dynamique sans serveur avec AWS

Comment a été ce contenu ?

Cet article a été initialement publié en décembre 2015, et il a été mis à jour en juillet 2023 afin de rendre la solution plus rentable et plus efficace en remplaçant Amazon API Gateway par les URL de la fonction AWS Lambda et Amazon Simple Storage Service (Amazon S3) par Amazon DynamoDB. L’utilisation des URL de la fonction Lambda réduit le coût global de la solution. Cette fonctionnalité est gratuite avec l’utilisation du service Lambda et fournit un point de terminaison HTTPS RESTful avec lequel notre client interagit. Le remplacement d’Amazon S3 par DynamoDB augmente l’efficacité de la solution et réduit la latence globale lors de l’interrogation des données.

Les start-ups en phase de démarrage, les petites entreprises et les réseaux domestiques disposent souvent d’adresses IP publiques dynamiques qui peuvent changer sans préavis. Ce changement d’adresse empêche l’accès fiable aux systèmes de ces réseaux depuis l’extérieur. Pour les start-ups qui en sont aux premiers stades de leur cycle de vie, il est important de fournir un service fiable et hautement disponible afin de gagner la confiance des premiers clients.

Les systèmes DNS dynamiques résolvent ce problème en exécutant un agent logiciel au sein du réseau afin de maintenir un enregistrement DNS à jour avec la dernière adresse IP publique. Tant que l’enregistrement DNS est à jour, vous pouvez trouver votre réseau et les clients peuvent accéder à votre service de manière fiable.

Dans cet article, nous expliquons comment créer votre propre système DNS dynamique à l’aide des services AWS sans serveur. Créer un système sans serveur en utilisant uniquement les services Amazon Web Services (AWS) et quelques lignes de code est simple, rentable et évolutif, et vous permet de vous concentrer sur la logique principale de votre start-up, plutôt que de vous soucier de la mise à l’échelle et de la maintenance de l’infrastructure sous-jacente.

Les services AWS que nous utilisons dans notre système DNS dynamique

Dans les sections suivantes, nous vous montrons comment utiliser les services AWS suivants pour créer une solution DNS dynamique :

  • Le service AWS Lambda vous permet d’exécuter du code sans avoir à gérer les serveurs sous-jacents. Votre code est toujours prêt à être exécuté, mais vous n’êtes facturé que par invocation de la fonction, par incréments de 1 milliseconde. Le service Lambda peut interagir avec d’autres services AWS via les kits SDK AWS.
  • Les URL de la fonction Lambda fournissent un point de terminaison HTTPS dédié pour votre fonction Lambda. Cela vous permet d’invoquer directement la fonction depuis votre application cliente sans avoir besoin d’utiliser un kit SDK AWS ou d’invoquer la fonction via un service proxy supplémentaire. Cette fonctionnalité n’entraîne aucun coût supplémentaire pour le service Lambda.
  • Amazon Route 53 est un service DNS géré qui vous permet d’enregistrer et d’héberger des domaines et des zones DNS à partir d’un réseau mondial de serveurs DNS. Comme tous les services AWS, Route 53 peut être géré via des API.
  • DynamoDB est une base de données clé-valeur NoSQL entièrement gérée et sans serveur, conçue pour exécuter des applications hautes performances à n’importe quelle échelle. DynamoDB offre une sécurité intégrée, des sauvegardes continues, une réplication multi-régions automatisée, une mise en cache en mémoire et des outils d’importation et d’exportation de données.

Flux logique du système DNS dynamique

La figure 1 montre comment un client trouve sa propre adresse IP en envoyant une requête API à un service créé à l’aide d’une fonction Lambda et de l’URL de la fonction associée.

Comme le montre la figure 2, une fois que le client connaît son adresse IP publique, il adresse une autre requête à notre service pour établir un enregistrement DNS. La fonction Lambda consulte d’abord l’enregistrement stocké dans notre table DynamoDB pour valider la requête. Si la vérification réussit, la fonction Lambda définit l’entrée DNS dans Route 53 via un appel d’API. L’adresse IP actuelle du réseau est désormais dans le DNS public et peut être trouvée par une requête DNS standard.

Avantages du DNS dynamique avec Lambda et Route 53

Voici quelques avantages que vous pouvez tirer de l’utilisation d’un système DNS dynamique sans serveur :

  • Plus facile à configurer. Il existe un exemple de code client avec toute la configuration et les instructions nécessaires, que vous pouvez utiliser dans votre propre compte AWS.
  • Peu ou pas de client. Trois commandes sont nécessaires pour mettre à jour l’API. Vous pouvez écrire votre propre code client dans la plupart des langages et l’exécuter sur des plateformes telles que Windows, Linux, macOS, Raspberry Pi, Chrome OS et le micrologiciel du routeur USB DD-WRT/Tomato.
  • Prise en charge d’un nombre arbitraire de clients, de noms d’hôtes et de domaines. Les limites de service et les quotas de Route 53 sont disponibles dans la section « Quotas » du Guide du développeur Route 53.
  • Rentable : entre 1 et 2 USD par mois. Les zones Route 53 coûtent chacune 0,50 USD par mois, 1 000 000 de requêtes DNS coûtent 0,40 USD et 10 000 requêtes de fonction Lambda pour mettre à jour le DNS coûtent moins de 0,01 USD.
  • Architecture sans serveur. Les technologies sans serveur offrent une mise à l’échelle automatique, une haute disponibilité intégrée et un modèle de facturation à l’utilisation qui permettent d’augmenter l’agilité et d’optimiser les coûts.
  • Les autorisations granulaires permettent uniquement aux clients autorisés de mettre à jour leur propre nom d’hôte. Les clients peuvent mettre à jour le système uniquement à partir de l’adresse ajoutée au DNS.
  • Les modifications nécessaires pour votre configuration DNS actuelle sont mineures. Vous pouvez quitter votre zone .com primaire avec votre fournisseur DNS actuel et utiliser une zone dynamic.example.com  secondaire dans AWS. Consultez la rubrique «  Création d’une zone hébergée publique » du Guide du développeur Route 53 pour plus d’informations sur la création de zones hébergées dans Route 53.

Conditions préalables

Vous aurez besoin de deux éléments pour créer cette solution :

  1. Un compte AWS. Les nouveaux comptes sont éligibles à l’Offre gratuite d’AWS.
  2. Un domaine que vous possédez, hébergé sur Route 53 ou chez un autre fournisseur. Vous pouvez enregistrer des domaines via Route 53 si nécessaire pour seulement 3,00 USD. Reportez-vous à la page de tarification Amazon Route 53 pour l’enregistrement de domaines afin de connaître la gamme complète des prix.

Comment créer un système DNS dynamique dans votre compte

À ce stade, vous disposez de suffisamment d’informations pour commencer à créer votre propre copie du système. Poursuivez la lecture pour en savoir plus sur son fonctionnement.

Si vous souhaitez commencer à créer, le DNS dynamique Route 53 avec Lambda est disponible sur GitHub. Il fournit des instructions illustrées ainsi que tout le code et la configuration nécessaires.

Comment fonctionne le nouveau système

Tout d’abord, le client doit trouver l’adresse IP publique attribuée à son réseau. Si vous envoyez une requête depuis votre réseau à un service sur Internet, ce service voit la requête provenant de votre adresse IP externe.

Ensuite, le client envoie une requête HTTP POST à l’URL de la fonction Lambda avec un corps de requête {"execution_mode":"get"}, et obtient une réponse contenant l’adresse IP publique actuelle :

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

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

Au cours de ce processus, l’URL de la fonction Lambda convertit la requête HTTP en JSON, y compris tous les paramètres de la requête, et transmet l’adresse IP source du demandeur à une fonction Lambda Python. La fonction Lambda renvoie ensuite une réponse JSON avec l’adresse IP au client.

La figure 3 montre une requête pour obtenir une adresse IP publique.

Le client crée maintenant un jeton de requête en liant l’adresse IP publique renvoyée par la requête HTTP POST, le nom d’hôte DNS et un secret partagé. Par exemple, si votre adresse IP est 176.32.100.36, votre nom d’hôte est host1.dyn.example.com et votre secret partagé est shared_secret_1, la chaîne liée sera la suivante :

176.32.100.36host1.dyn.example.comshared_secret_1

Ensuite, le client génère une fonction de hachage SHA-256 à partir de la chaîne :

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

Hash: 96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535

Le client demande ensuite la mise à jour du DNS en effectuant une seconde requête HTTP POST. Il transmet le nom d’hôte en texte brut comme clé et la fonction de hachage comme jeton d’authentification dans le corps de la requête :

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

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

L’URL de la fonction Lambda transmet les paramètres de la requête à la fonction Lambda.

Ensuite, la fonction Lambda interroge son enregistrement de configuration JSON auprès de DynamoDB à l’aide du kit AWS SDK pour Python (Boto3). Dans ce système, les interactions entre le service Lambda, DynamoDB et Route 53 utilisent Boto3, qui est préintégré à l’environnement d’exécution du service Lambda.

Une fois que notre fonction Lambda interroge l’enregistrement de configuration auprès de DynamoDB, elle utilise le nom d’hôte comme clé pour trouver le secret partagé, ainsi que toute autre configuration associée à cet enregistrement, similaire à l’exemple d’enregistrement suivant :

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

Le client a transmis host1.dyn.example.com comme clé. La fonction Lambda lit SHARED_SECRET_1 depuis la configuration et recrée le jeton de la fonction de hachage à l’aide du nom d’hôte, de l’adresse IP du demandeur et du secret partagé. Si la fonction de hachage calculée par la fonction Lambda et la fonction de hachage reçue par le client correspondent, la requête est considérée comme valide.

Une fois la requête validée, la fonction Lambda utilise les informations de la configuration pour effectuer un appel d’API à Route 53 afin de vérifier si le nom d’hôte DNS est déjà défini avec l’adresse IP du client. Si aucune modification n’est nécessaire, la fonction Lambda répond au client et renvoie :

{“return_message”: “Your IP address matches the current Route53 DNS record.”,
 “return_status”: “success”}

S’il n’y a aucun enregistrement, ou si l’enregistrement actuel et l’adresse IP du client ne correspondent pas, la fonction Lambda envoie un appel d’API à Route 53 pour définir l’enregistrement, répond au client et renvoie :

{“return_message”: “Your hostname record host1.dyn.example.com. has been set to 176.32.100.36”,
 “return_status”: “success”}

La figure 4 montre la requête pour définir le nom d’hôte.

Comment ce système est-il sécurisé ?

  • Toutes les communications utilisant les URL de la fonction Lambda sont chiffrées.
  • Le secret partagé n’est jamais transmis sur Internet.
  • Le taux de requêtes des clients peut être limité à l’aide de la fonctionnalité de simultanéité réservée du service Lambda.
  • Le mécanisme d’authentification est multifactoriel, car le client présente le secret partagé (« quelque chose qu’il possède ») et sa propre adresse IP publique (« quelque chose qu’il est »).
  • Le fichier de configuration peut être chiffré au repos via le chiffrement côté serveur DynamoDB.
  • Vos informations d’identification AWS ne sont pas utilisées, elles ne peuvent donc pas être divulguées.

Conclusion

Le système DNS dynamique que nous décrivons dans cet article montre comment créer votre propre solution sans serveur sur AWS pour résoudre un problème réel : le DNS est susceptible de changer et vous ne le savez peut-être pas !

Utilisez cette solution pour exécuter votre propre DNS dynamique sur AWS, ou prenez-la comme exemple pour découvrir comment utiliser les services AWS pour créer vos propres solutions sans serveur à n’importe quelle échelle.

Consultez le DNS dynamique Route 53 avec Lambda sur GitHub pour obtenir un ensemble complet de code, de configuration et d’instructions pour déployer une solution.

Comment a été ce contenu ?