Architectures à haute disponibilité
Présentation
Les services de périphérie AWS sont des composants importants pour créer des applications Web à haute disponibilité. Outre leur haute disponibilité native due à leur nature distribuée, les services de périphérie AWS font office de point d'entrée vers les applications Web et peuvent acheminer les demandes vers les partitions disponibles dans votre infrastructure d'origine (par exemple, zone de disponibilité ou région).
Décisions architecturales
Une application Web à haute disponibilité peut être conçue de différentes manières, en fonction de vos besoins en termes de disponibilité SLO, de coût et de complexité. Au minimum, vous devez prendre les décisions techniques suivantes en fonction des besoins de votre entreprise :
- Disposez-vous d'une architecture active/active ou active/passive ?
- Avez-vous des origines différentes ? des AZ différents ? des régions différentes ?
- Quelle est la logique de routage entre les origines pour une architecture active/active ? Quels sont les critères de basculement pour une architecture active/passive ?
Gestion des erreurs d'origine transitoires
CloudFront peut vous aider à atténuer l'impact des erreurs 5xx transitoires qui peuvent parfois affecter un petit nombre de demandes des utilisateurs. Cela est souvent dû à une origine submergée par des pics de trafic soudains ou des problèmes de réseau transitoires. Vous pouvez atténuer les erreurs 5xx transitoires avec CloudFront de différentes manières.
Réessayez. CloudFront peut être configuré pour réessayer la connexion TCP jusqu'à trois fois avec un délai de connexion configurable lorsqu'une connexion ne peut pas être établie avec l'origine. CloudFront relance également les GET/HEAD idempotents en fonction du nombre de tentatives configuré.
Répondre avec un contenu obsolète. Si les nouvelles tentatives échouent avec l'origine, CloudFront par défaut diffuse une version obsolète de l'objet si elle est disponible dans le cache au lieu de renvoyer une réponse d'erreur. Ce comportement peut être désactivé à l'aide de la directive Cache-Control: stale-if-error=0.
Basculement de l'origine vers l'origine secondaire. Vous pouvez configurer CloudFront pour qu'il bascule vers une origine secondaire pour la demande échouée spécifique à l'aide de la fonctionnalité Origin Failover. Origin Failover ne s'applique qu'aux demandes GET/HEAD idempotentes. Notez que si vous utilisez Lambda@Edge sur les événements d'origine, CloudFront exécute également la fonction en cas de basculement. Dans ce scénario, vous pouvez déduire dans la fonction Lambda@Edge si la demande concernait l'origine principale ou secondaire afin de différencier sa logique. Pour ce faire, configurez le même Origin Custom Header dans les deux origines, mais avec des valeurs différentes que Lambda@Edge peut lire.
Basculement gracieux. Si le basculement d'Origin Failover vers une autre origine n'est pas souhaitable (par exemple, maintenir une autre infrastructure d'origine), envisagez de basculer vers un fichier statique hébergé dans un emplacement différent (par exemple, un compartiment S3) à l'aide de la Page d'erreur personnalisée. Par défaut, la même page est utilisée pour toutes les demandes qui génèrent des erreurs, mais vous pouvez créer une réponse plus dynamique en suivant le troisième modèle de ce blog.
Basculement dynamique lors des pannes d'origine
Basculement basé sur la politique de Route 53
Vous pouvez utiliser la politique de routage de Basculement de Route 53 avec des surveillances de l'état sur le nom de domaine d'origine configuré comme origine dans CloudFront. Lorsque l'origine principale devient défectueuse, Route 53 la détecte, puis commence à résoudre le nom de domaine d'origine avec l'adresse IP de l'origine secondaire. CloudFront respecte le TTL DNS d'origine, ce qui signifie que le trafic commencera à circuler vers l'origine secondaire au sein du TTL DNS. La configuration la plus optimale (Fast Check activé, seuil de basculement de 1 et TTL DNS de 60 secondes) signifie que le basculement prendra au moins 70 secondes pour se produire. Dans ce cas, tout le trafic est transféré vers l'origine secondaire, car il s'agit d'un basculement dynamique. Notez que cette conception peut être encore étendue avec le Contrôle de récupération de l'application de Route 53 pour un basculement d'applications plus sophistiqué dans plusieurs régions AWS, zones de disponibilité et sur site. Cette approche peut être combinée avec la fonctionnalité CloudFront Origin Failover pour les demandes GET/HEAD afin de réduire les erreurs pendant que Route 53 bascule vers l'origine secondaire. Ce modèle est décrit dans ce blog.

Lorsque les différentes origines ne partagent pas le même nom de domaine, comme pour les origines basées sur S3, Route 53 ne peut pas être utilisée de la manière proposée ci-dessus. Dans ce scénario, vous avez besoin d'une fonction Lambda@Edge configurée sur l'événement de demande d'origine pour interroger Route 53 sur l'origine à sélectionner, puis réacheminer la demande vers l'origine sélectionnée, en modifiant le nom de domaine d'origine et avec l'en-tête hôte. Pour en savoir plus sur cette implémentation, lisez l'étude de cas suivante.
Basculement avec Global Accelerator
Les applications qui utilisent Global Accelerator peuvent bénéficier de ses fonctionnalités de basculement natives. À l'aide de Global Accelerator, votre application peut être déployée dans une seule région AWS dans plusieurs zones de disponibilité ou dans plusieurs régions AWS. Global Accelerator surveille l'état des points de terminaison de vos applications à l'aide des surveillances de l'état, et éloigne le trafic des points de terminaison défectueux en quelques dizaines de secondes.
Architectures active-active
Routage basé sur la latence
CloudFront peut être utilisé avec la politique basée sur la latence de Route 53 pour acheminer les demandes des utilisateurs vers la région AWS la plus proche dont vous avez répliqué l'origine dans une architecture multirégionale Active-Active. Pour ce faire, configurez le nom de domaine d'origine dans CloudFront avec une politique basée sur la latence dans Route 53. Lorsque CloudFront résout le nom de domaine d'origine pour se connecter et envoyer la demande à l'origine, Route 53 renvoie l'adresse IP d'origine la plus proche en fonction de la latence. Notez que l'emplacement à partir duquel CloudFront résout le nom de domaine d'origine dépend de la configuration de distribution et du type de trafic. En général, le nom de domaine est résolu dans l'emplacement périphérique pour les demandes dynamiques et dans les caches périphériques régionaux pour le contenu pouvant être mis en cache. Ce blog vous accompagne dans un déploiement multi-régions actif-actif pour la passerelle API.

Lorsque les différentes origines ne partagent pas le même nom de domaine, comme pour les origines basées sur S3, Route 53 ne peut pas être utilisée de la manière proposée ci-dessus. Dans ce scénario, vous avez besoin d'un événement de demande Lambda@Edge configuré sur l'origine pour acheminer vers l'origine la plus proche. Pour en savoir plus sur cette implémentation, consultez les blogs suivants :
- Utilisation d'Amazon CloudFront et d'Amazon S3 pour créer des applications de géolocalisation actives et actives multirégionales
- Réduire la latence pour les utilisateurs finaux grâce à des API multirégionales avec CloudFront. Dans ce blog, vous découvrirez comment implémenter une API GraphQL multi-régions basée sur AppSync.
Routage avancé
Dans certains scénarios, le routage des requêtes nécessite une logique au niveau de l’application. Lorsque la logique est simple, comme le routage vers différentes origines en fonction du chemin (par exemple, route /api1 vers l’origine 1 et /api2 vers l’origine 2), vous pouvez simplement utiliser la fonctionnalité de comportement de cache native de CloudFront.
Si la logique de routage est plus sophistiquée (par exemple en fonction du niveau d’abonnement des utilisateurs), vous pouvez utiliser les fonctions de périphérie de CloudFront. Avec les Fonctions CloudFront, vous pouvez récupérer vos définitions d’itinéraires depuis KeyValueStore et modifier le routage à l’aide de la méthode updateRequestOrigin(). Si la logique de routage nécessite l’accès à des sources externes, utilisez Lambda@Edge sur l’événement de requête d’origine et mettez à jour l’attribut origin de l’objet d’événement dans le gestionnaire de fonction.

Ressources
- Blog : Améliorer la disponibilité de votre site Web avec Amazon CloudFront
- Blog : Trois modèles de conception avancés pour des applications à haute disponibilité utilisant Amazon CloudFront
- Étude de cas OutSystems : Routage avancé au niveau des applications
- Étude de cas TrueCar : routage avancé au niveau de l'application
- AWS Summit SF 2022 : Sept modèles pour améliorer la disponibilité des applications
- AWS re:Invent 2022 : Améliorer les performances et la disponibilité avec AWS Global Accelerator
- AWS re:Invent 2024 : Configuration multiorigine de Booking.com