Panne AWS : 10 incidents dont la région us-east-1 fut l’épicentre
Une région cloud vous manque est tout est dépeuplé…
L’image est probablement exagérée, mais elle illustre le niveau de centralisation qui demeure chez AWS. Sa principale région (us-east-1, qui est aussi la plus ancienne) apparaît comme un point faible, ne serait-ce que par le nombre de services qui y ont leur plan de contrôle. On a pu le mesurer cette semaine avec un incident au retentissement mondial parti d’un problème de DNS interne.
Cet incident n’est pas, et de loin, le premier à avoir eu comme épicentre la région us-east-1. En témoigne, en particulier, une liste publique de post-mortem qu’AWS a consacrés aux problèmes qu’il considère avoir eu « un impact clent significatif ».
Avril 2011 : EBS part en boucle infinie
EC2 a connu des perturbations dues essentiellement au dysfonctionnement d’un sous-ensemble de volumes EBS dans une AZ. Ils n’acceptaient plus les opérations de lecture et d’écriture.
À l’origine, il y a une modification destinée à augmenter la capacité du réseau primaire – celui qui porte la communication entre les nœuds EBS, les instances EC2 et le plan de contrôle.
La redirection du trafic a été mal exécutée. Au lieu de basculer vers un routeur secondaire sur ce même réseau, tout a été acheminé sur le réseau secondaire, dédié à la réplication et dont les capacités étaient plus faibles. De sorte qu’il a saturé.
Certains nœuds se sont ainsi retrouvés privés des deux réseaux et ont perdu le lien avec leurs répliques. Dès la reconnexion, ils ont enclenché massivement un re-mirrorring, dépassant rapidement les capacités du cluster et entrant par là même dans une boucle infinie.
Le cluster ne pouvait plus répondre aux requêtes API visant à créer des volumes. Or, puisque cette API avait un long timeout, les appels se sont accumulés jusqu’à épuiser les threads alloués au plan de contrôle. Lequel a fini par devoir basculer les traitements vers une autre AZ.
À cela s’est ajoutée une condition de concurrence dans le code des nœuds EBS. Elle favorisait les échecs lors de la fermeture simultanée d’un grand nombre de requêtes de réplication.
Dans ce contexte, le volume de négociations entre instances EC2 et nœuds EBS pour s’entendre sur la copie principale a explosé, pesant d’autant plus sur le plan de contrôle.
Juin 2012 : EC2, EBS, ELB et RDS secoués par un orage
À la suite d’une surtension causée par un orage, deux datacenters soutenant une même AZ basculent sur les groupes électrogènes. La procédure échoue toutefois sur l’un d’entre eux, faute d’une stabilisation de la tension. Les serveurs passent alors sur onduleur… jusqu’à épuisement de la réserve énergétique. La séquence se produit à deux reprises, l’alimentation ayant été brièvement rétablie.
Le datacenter problématique n’hébergeait qu’une petite partie des ressources de la région (environ 7 % des instances EC2, par exemple). Mais l’impact a été fort pour certains clients. Sur deux plans. D’un côté, l’indisponibilité d’instances et de volumes (limitée à l’AZ touchée). De l’autre, la dégradation de l’accès aux plans de contrôle (sur toute la région east-us-1).
Le délai de rétablissement d’EC2 a été allongé par un goulet d’étranglement au niveau du démarrage des serveurs. Il l’a aussi été pour EBS, vu l’incapacité à basculer rapidement vers un nouveau datastore primaire.
L’offre ELB a aussi été perturbée. L’alimentation revenue, un bug est survenu : le plan de contrôle a tenté de scaler les instances sous-jacentes. Le flux de requêtes qui en a résulté a occasionné une surcharge. Couplé aux requêtes d’association des nouvelles instances EC2 que créaient les clients, il a saturé le plan de contrôle, d’autant plus que celui-ci utilisait une file d’attente partagée pour toute la région.
RDS a été nettement tributaire de la récupération d’EBS. Il a aussi fallu faire avec un bug logiciel qui a empêché le failover sur certaines configurations multi-AZ.
Octobre 2012 : l’agent de collecte EBS frappe à la mauvaise adresse
Des nœuds EBS ont rencontré des problèmes dans une AZ. La cause : un bug dans l’agent collectant des données à des fins de maintenance.
La semaine précédente, un des serveurs destinés à héberger ces données avait été remplacé après une panne matérielle. Dans ce cadre, l’enregistrement DNS avait été actualisé. La mise à jour ne s’était néanmoins pas propagée correctement. Certaines instances de l’agent continuaient donc à tenter de joindre l’ancienne adresse.
Le service de collecte étant tolérant aux manques de données, le problème n’avait pas été immédiatement visible. Jusqu’à ce que l’agent en arrive à saturer la mémoire des serveurs à force de répéter les tentatives de connexion. À tel point que les serveurs EBS ne pouvaient plus répondre aux requêtes clients. Pour ne rien arranger, beaucoup étant tombés au même moment, il n’y en avait pas assez de rechange.
L’incident a entraîné des difficultés pour utiliser les API de gestion. A fortiori parce que la politique de plafonnement de débit mise en place par AWS pour assurer la stabilité lors de la phase de récupération était trop agressive.
Juin 2014 : SimpleDB (quasiment) injoignable
Pendant deux heures, presque aucun appel API vers ce datastore distribué n’a abouti. Il a ensuite fallu du temps supplémentaire pour que tout revienne à la normale, notamment sur la création et la suppression de domaines.
Le déclencheur fut une coupure de courant. Plusieurs nœuds de stockage étaient devenus indisponibles. Lorsqu’ils ont redémarré, la charge s’est accrue sur le service de verrouillage interne de SimpleDB.
Ce service sert à déterminer quel ensemble de nœuds est responsable d’un domaine donné. Chaque nœud le contacte régulièrement pour vérifier qu’il a toujours les responsabilités qu’il pense avoir.
Avec l’augmentation de la charge, la latence s’est accrue et les nœuds ne pouvaient pas finaliser le handshake avant le timeout. Ils finissaient ainsi par s’auto-éjecter du cluster. Ils ne pouvaient alors le rejoindre qu’en recevant une autorisant de la part des nœuds de métadonnées… qui étaient malheureusement eux-mêmes indisponibles.
Septembre 2015 : DynamoDB dépassé par ses index secondaires globaux
En septembre 2015, les index secondaires globaux (GSI, global secondary index) sont encore relativement nouveaux sur DynamoDB. Ils permettent d’accéder aux tables via des clés alternatives.
Les tables DynamoDB, rappelons-le, sont partitionnées et distribuées entre serveurs. L’attribution d’un groupe de partitions à un serveur est alors dite membership. Elle est gérée par un service de métadonnées interne auprès duquel les serveurs de stockage doivent périodiquement se renseigner. C’est le cas après une coupure réseau.
Il en est justement intervenu une. Sauf qu’à la relance, une partie des réponses du service de métadonnées a dépassé les délais de transmission autorisés. En conséquence de quoi les serveurs de données concernés ont arrêté d’accepter des requêtes.
L’adoption des GSI a pesé lourd. Ces derniers ont en effet leur propre ensemble de partitions. Ils contribuent ainsi à augmenter la taille des infos de membership. C’est ainsi que le temps de traitement de certaines a fini par dépasser les délais. Le phénomène a été accentué du fait de la sollicitation simultanée par un grand nombre de serveurs de données. Lesquels ont réitéré leurs requêtes, maintenant donc une charge élevée.
AWS a dû se résoudre à mettre la communication en pause pour pouvoir ajouter de la capacité (la charge continue l’empêchait d’effectuer ses requêtes administratives).
SQS, qui utilise une table DynamoDB interne décrivant les files d’attente, a été affecté, faute de pouvoir rafraîchir correctement son cache. Les erreurs API se sont par ailleurs multipliées sur l’autoscaling EC2, qui exploite lui aussi DynamoDB (stockage des infos sur les groupes et de configs de lancement). CloudWatch n’a pas été épargné, entre autres sur la partie métriques.
Février 2017 : S3 planté par une erreur de débogage
Au début, il y a une opération de débogage d’un problème qui causait des lenteurs sur le système de facturation de S3.
Une commande était censée retirer quelques serveurs d’un sous-système. Mais une entrée incorrecte en a retiré davantage, et liés à deux autres sous-systèmes. L’un, dit d’index, gérait les métadonnées et les infos d’emplacement de tous les objets S3 dans la région us-east-1. L’autre, dit de placement, permettait l’allocation de nouveaux espaces de stockage.
Il a fallu relancer les deux, qui ne l’avaient pas été depuis des années. Le processus de vérification d’intégrité a ainsi pris plus longtemps que prévu.
Pendant le redémarrage, S3 ne pouvait pas répondre aux requêtes. D’autres services ont été impactés dans la région pendant l’indisponibilité de ses API. Parmi eux, le lancement de nouvelle instances EC2 et la création de volumes EBS à partir de snapshots.
Novembre 2020 : Kinesis atteint son plafond de threads
Le déclencheur fut l’ajout de capacité sur le front-end.
Cette flotte de serveurs gère le routage vers le back-end. Elle assure pour cela l’authentification et le contrôle des débits ; tout en maintenant des informations de membership (shard-map), dont chaque serveur stocke une copie.
Ces infos sont obtenues par appel à un microservice et par récupération de données dans une table DynamoDB. Mais aussi par le traitement continu des messages des autres serveurs du front-end, un thread étant dédié à chacun.
Les nombreuses erreurs constatées se sont avérées ne pas toutes découler de l’ajout de capacité. La principale en résultait, néanmoins. La cause racine : le dépassement, sur tous les serveurs du front-end, du nombre maximal de threads autorisé par une configuration OS. Les caches n’étaient donc plus construits et les shard-maps devenaient obsolètes, ne permettant plus de diriger les requêtes.
Pour des raisons de concurrence, il n’a été possible de relaner que quelques centaines de serveurs par heure, alors que la flotte en comptait des milliers. Il existait effectivement une situation de compétition entre les ressources utilisées pour peupler le shard-map et celles utilisées pour traiter les requêtes entrantes. Une remise en ligne trop rapide aurait entraîné un risque de conflits et donc d’erreurs.
Parmi les services impactés, Cognito, qui exploite Kinesis Data Streams pour collecter et analyser les patterns d’accès aux API. Ou CloudWatch, qui s’en sert pour traiter logs et métriques… et qui a aussi eu un effet en cascade sur Lambda (l’invocation de fonctions supposait alors la publication de métriques vers CloudWatch).
Décembre 2021 : de la friture sur le réseau
AWS utilise un réseau interne pour héberger des services fondamentaux de type monitoring, DNS, autorisation… et une partie du plan de contrôle EC2. Des passerelles permettent de communiquer avec le réseau principal, où fonctionnent la majorité des services de la branche cloud d’Amazon ainsi que les applications des clients.
La mise à l’échelle automatique d’un service sur le réseau principal a déclenché de l’agitation sur le réseau interne. Un pic de connexions a surchargé les passerelles, accroissant latence et erreurs. Les tentatives répétées de connexion ont favorisé une congestion.
Cette congestion a limité les capacités de supervision et donc de résolution du problème. La redirection du trafic DNS a aidé, mais n’a pas tout résolu. Le délai s’est allongé d’autant plus que les systèmes internes de déploiement d’AWS étaient eux aussi touchés.
Parmi les services affectés ont figuré les API EC2 destinées à lancer et à décrire des instances. Et donc, par rebond, des services comme RDS, EMR et WorkSpaces.
Les API Route 53 ont aussi subi le choc (pas possible de modifier des enregistrements). Sur STS, la latence s’est accrue pour la communication d’authentifiants aux fournisseurs d’identité tiers. L’accès aux buckets S3 et aux tables DynamoDB via des endpoints VPC a également été perturbé.
Juin 2023 : le front-end Lambda en surcapacité
Lambda est architecturé en cellules composées de sous-systèmes. Sur chacune, le front-end réceptionne les invocations et en assure le routage, tandis qu’un gestionnaire met à disposition un environnement d’exécution.
Un jour de juin 2023, le front-end a scalé pour absorber un pic de trafic… et a atteint, dans une cellule, un palier de capacité « jamais vu auparavant ». Assez pour entraîner un problème logiciel : les environnements d’exécution alloués n’étaient pas complètement utilisés par le front-end. Les invocations produisaient ainsi davantage d’erreurs.
L’incident a impacté la console AWS dans la région us-east-1. Il a aussi touché STS (taux d’erreurs sur la fédération SAML, notamment), EKS (provisionnement de clusters) et EventBridge (jusqu’à 801 secondes de latence pour le routage vers Lambda).
Juillet 2024 : Kinesis perturbé par un profil de workload
Problème également dans une cellule pour Kinesis Data Streams. Plus précisément, une cellule utilisée exclusivement par les services AWS (par opposition à celles dédiées aux clients).
En toile de fond, une mise à niveau d’architecture, avec un nouveau système de gestion. Celui-ci n’a malheureusement pas réussi à gérer le profil de workload spécifique de la cellule en question (un très grand nombre de shards à très bas débit).
Ces shards n’ont pas été bien répartis entre les hôtes. Les quelques-uns qui ont hérité des « gros morceaux » se sont mis à transmettre des messages de statut volumineux qui n’ont pas pu être traités dans les délais autorisés. Le système de gestion, pensant avoir affaire à des nœuds défectueux, a commencé à redistribuer les shards. D’où un pic d’activité qui a surchargé un autre composant, utilisé pour établir des connexions sécurisées vers les sous-système du plan de données. Le traitement du trafic Kinesis s’en est trouvé affecté.
Parmi les services touchés, CloudWatch Logs (utilisant Kinesis comme tampon), la livraison d’événements dans S3, ainsi que l’invocation des API PutRecord et PutRecordBatch avec Data Firehose. Des effets en cascade ont été recensés sur ECS, Lambda, Glue ou encore Redshift.
Illustration générée par IA
The post Panne AWS : 10 incidents dont la région us-east-1 fut l’épicentre appeared first on Silicon.fr.