Comment résoudre les problèmes de résolution DNS avec ma stratégie de routage pondéré dans Route 53 ?

Date de la dernière mise à jour : 24/06/2020

J'ai configuré une stratégie de routage pondéré dans Amazon Route 53. Toutefois, lorsque je teste la résolution DNS, j’obtiens des résultats inattendus. Comment puis-je résoudre ce problème ?

Brève description

Supposons que vous avez créé un enregistrement TXT avec le nom « weighted.awsexampledomain.com ». L'enregistrement a une durée de vie (TTL) de 300 secondes et des pondérations configurées comme suit :

Nom Type TTL Valeurs Poids Statut de la vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 0 » Poids = 0 Vérification de l'état associée
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 20 » Poids = 20 Vérification de l'état associée
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 50 » Poids = 50 Vérification de l'état associée
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 70 » Poids = 70 Vérification de l'état associée

Cette configuration est référencée dans les exemples suivants.

Solution

Testez votre stratégie de routage pondéré pour identifier le problème

Envoyez plusieurs (plus de 10 000) requêtes pour tester votre stratégie de routage pondéré. Testez la résolution DNS à partir de plusieurs emplacements ou interrogez directement les serveurs de noms faisant autorité pour comprendre la stratégie. Utilisez les scripts suivants pour envoyer plusieurs requêtes DNS pour votre nom de domaine.

Envoyez des requêtes DNS à l'aide du résolveur récursif :

#!/bin/bash
for i in {1..10000}
do
domain=$(dig <domain-name> <type> @RecursiveResolver_IP +short)
echo -e  "$domain" >> RecursiveResolver_results.txt
done

Envoyez des requêtes DNS directement aux serveurs de noms faisant autorité :

#!/bin/bash
for i in {1..10000}
do
domain=$(dig <domain-name> <type> @AuthoritativeNameserver_IP +short)
echo -e  "$domain" >> AuthoritativeNameServer_results.txt
done

Exemple de sortie à l'aide de l' outil awk:

$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @172.16.173.64 +short); echo -e  "$domain" >> RecursiveResolver_results.txt; done

$ awk ' " " ' RecursiveResolver_results.txt | sort | uniq -c
1344 "Record with Weight 20"
3780 "Record with Weight 50"
4876 "Record with Weight 70"

Utilisez vos résultats de test pour résoudre votre problème spécifique

Problème : Les ressources de point de terminaison des enregistrements pondérés ne reçoivent pas le ratio de trafic attendu.

Route 53 envoie le trafic vers une ressource en fonction de la pondération que vous attribuez à l'enregistrement par rapport à la pondération totale de tous les enregistrements. Les réponses DNS sont mises en cache par des résolveurs DNS intermédiaires pendant la durée de vie de l'enregistrement TTL. Les clients sont dirigés vers uniquement des points de terminaison spécifiques pendant la durée en raison de la réponse mise en cache.

Par exemple, si vous interrogez sur le résolveur DNS de mise en cache 192 168.1.2 :

$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @192.168.1.2 +short); echo -e  "$domain" >> CachingResolver_results.txt; done

$ awk ' " " ' CachingResolver_results.txt | sort | uniq -c
3561 "Record with Weight 20"
1256 "Record with Weight 50"
5183 "Record with Weight 70"

Notez que les résultats ci-dessus ne sont pas comme prévu en raison du cache du résolveur DNS récursif.

Problème : Certains de mes enregistrements pondérés ne sont pas renvoyés.

Par exemple, lorsque certaines vérifications de l'état échouent :

Nom Type TTL Valeurs Poids Statut de la vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 0 » Poids = 0 Réussite de la vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 20 » Poids = 20 Réussite de la vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 50 » Poids = 50 Échec de vérification de l’état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 70 » Poids = 70 Réussite de la vérification de l'état
$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @192.168.1.2 +short); echo -e  "$domain" >> HealthCheck_results.txt; done

$ awk ' " " ' HealthCheck_results.txt | sort | uniq -c
3602 "Record with Weight 20"
6398 "Record with Weight 70"

Notez que l'enregistrement avec un poids 50 n'est pas renvoyé par Route 53, car sa vérification de l'état échoue.

Problème : Tous mes enregistrements pondérés ne sont pas sains.

Même si aucun des enregistrements d'un groupe d'enregistrements n'est sain, Route 53 doit toujours fournir une réponse aux requêtes DNS. Cependant, il n'y a pas de base pour choisir un enregistrement plutôt qu'un autre. Dans ce cas, Route 53 considère que tous les enregistrements du groupe sont sains. Un enregistrement est sélectionné en fonction de la stratégie de routage et des valeurs que vous spécifiez pour chaque enregistrement.

Par exemple :

Nom Type TTL Valeurs Poids Statut de la vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 0 » Poids = 0 Échec de vérification de l’état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 20 » Poids = 20 Échec de vérification de l’état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 50 » Poids = 50 Échec de vérification de l’état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 70 » Poids = 70 Échec de vérification de l’état
$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @205.251.194.16 +short); echo -e  "$domain" >> All_UnHealthy_results.txt; done

$ awk ' " " ' All_UnHealthy_results.txt | sort | uniq -c
1446 "Record with Weight 20"
3554 "Record with Weight 50"
5000 "Record with Weight 70"

Notez que Route 53 a considéré que tous les enregistrements sont sains (Fail Open). Route 53 a répondu aux demandes DNS selon les proportions configurées. « Enregistrement avec poids 0 » n'est pas renvoyé, car son poids est égal à zéro.

Remarque : si vous définissez des pondérations différentes de zéro pour certains enregistrements et des pondérations égales à zéro pour d'autres, les vérifications de l'état fonctionnent de la même manière que lorsque tous les enregistrements ont des pondérations différentes de zéro. Il existe quelques exceptions :

  • Initialement, Route 53 prend uniquement en compte les enregistrements pondérés non zéro sains, le cas échéant.
  • Si tous les enregistrements autres que zéro ne sont pas sains, Route 53 considère les enregistrements pondérés zéro sains.

Si vous définissez « Poids » égal à tous les enregistrements d'un groupe, le trafic est acheminé vers toutes les ressources saines avec une probabilité égale. Si vous définissez « Poids » sur zéro pour tous les enregistrements d'un groupe, le trafic est acheminé vers toutes les ressources saines avec une probabilité égale.