Comment résoudre les problèmes liés à une stratégie de routage pondéré dans Route 53 ?

Date de la dernière mise à jour : 22/05/2021

J'ai configuré une stratégie de routage pondéré dans Amazon Route 53. Mais lorsque je teste la résolution DNS, j'obtiens des résultats inattendus. Comment y remédier ?

Brève description

Supposons que vous ayez créé un enregistrement de type texte (TXT) nommé « weighted.awsexampledomain.com ». La durée de vie (TTL) de l'enregistrement est de 300 secondes et il présente des pondérations configurées comme suit :

Nom Type Durée de vie (TTL) Valeurs Pondération Statut de vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 0 » Pondération = 0 Vérification de l'état associée
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 20 » Pondération = 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

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis l'interface de ligne de commande AWS (AWS CLI), vérifiez que vous utilisez la version la plus récente d'AWS CLI.

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

Envoyez de multiples requêtes (plus de 10 000) 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 obtenue à l'aide de l'outil awk de l'interface AWS CLI :

$ 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 les résultats du 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 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 ces résultats ne sont pas ceux attendus en raison du cache du résolveur DNS récursif.

Problème : certains enregistrements pondérés ne sont pas renvoyés.

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

Nom Type Durée de vie (TTL) Valeurs Pondération Statut de vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 0 » Pondération = 0 Réussite de la vérification d'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 20 » Pondération = 20 Réussite de la vérification d'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 50 » Poids = 50 Échec de la vérification d'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 70 » Poids = 70 Réussite de la vérification d'é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 pondération 50 » n'est pas renvoyé par Route 53, car sa vérification d'état échoue.

Problème : aucun de mes enregistrements pondérés n'est sain.

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. Mais rien ne permet de choisir un enregistrement plutôt qu'un autre. Route 53 considère donc 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 Durée de vie (TTL) Valeurs Pondération Statut de vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 0 » Pondération = 0 Échec de la vérification d'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 20 » Pondération = 20 Échec de la vérification d'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 50 » Poids = 50 Échec de la vérification d'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 70 » Poids = 70 Échec de la vérification d'é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 en fonction des proportions configurées. « Enregistrement avec pondération 0 » n'est pas renvoyé, car sa pondération est égale à 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 d'état fonctionnent de la même manière que lorsque tous les enregistrements présentent des pondérations différentes de zéro. Il existe néanmoins quelques exceptions :

  • Initialement, Route 53 prend uniquement en compte les enregistrements sains présentant une pondération différente de zéro, le cas échéant.
  • Si aucun des enregistrements présentant une pondération différente de zéro n'est sain, Route 53 se penche sur les enregistrements sains dont la pondération est égale à zéro.

Par exemple :

Nom Type Durée de vie (TTL) Valeurs Pondération Statut de vérification de l'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 0 » Pondération = 0 Vérification d'état réussie
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 20 » Pondération = 20 Vérification d'état réussie
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec poids 50 » Poids = 50 Échec de la vérification d'état
weighted.awsexampledomain.com. TXT 300 « Enregistrement avec pondération 70 » Poids = 70 Échec de la vérification d'é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
10000 "Record with Weight 20"

Notez que Route 53 ne prend pas en compte l'enregistrement dont la pondération est égale à 0. À moins qu'aucun enregistrement pondéré ne soit sain, Route 53 ne renvoie pas les enregistrements dont la pondération est égale à 0.

Si vous définissez une pondération égale pour tous les enregistrements d'un groupe, le trafic est acheminé vers toutes les ressources saines avec la même probabilité. Si vous définissez « Pondération » sur zéro pour tous les enregistrements d'un groupe, le trafic est acheminé vers toutes les ressources saines avec la même probabilité.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?