Mise à l'échelle basée sur Amazon SQS - Amazon EC2 Auto Scaling

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Mise à l'échelle basée sur Amazon SQS

Important

Les informations et étapes suivantes vous montrent comment calculer le backlog de file d'attente Amazon SQS par instance à l'aide de l'attribut ApproximateNumberOfMessages queue avant de le publier sous forme de métrique personnalisée sur. CloudWatch Cependant, vous pouvez désormais réduire les coûts et les efforts consacrés à la publication de votre propre métrique en utilisant une expression mathématique appliquée à une métrique. Pour plus d’informations, consultez Créer une politique de mise à l’échelle du suivi des cibles pour Amazon EC2 Auto Scaling à l’aide d’une expression mathématique appliquée à une métrique.

Cette section vous montre comment mettre à l'échelle votre groupe Auto Scaling en réponse aux modifications de la charge du système dans une file d'attente Amazon Simple Queue Service (Amazon SQS). Pour en savoir plus sur la façon dont vous pouvez utiliser Amazon SQS, veuillez consulter le Guide du développeur Amazon Simple Queue Service.

Il existe des scénarios dans lesquels vous pourriez envisager la mise à l'échelle en réponse à une activité dans une file d'attente Amazon SQS. Supposons par exemple que vous disposez d'une application web qui permet aux utilisateurs de charger des images et de les utiliser en ligne. Dans ce scénario, chaque image doit être codée et redimensionnée avant de pouvoir être publiée. L'application s'exécute sur des instances EC2 dans un groupe Auto Scaling et elle est configurée pour gérer les taux de chargement classiques. Les instances non saines sont résiliées et remplacées pour maintenir des niveaux d'instance actuels à tout moment. L'application place les données bitmap brutes des images dans une file d'attente SQS afin qu'elles soient traitées. Elle traite les images, puis publie les images traitées à un emplacement où elles peuvent être affichées par les utilisateurs. L'architecture de ce scénario fonctionne correctement si le nombre de chargements d'images ne varie pas au fil du temps. En revanche, si le nombre de chargements varie au fil du temps, vous pouvez envisager d'utiliser la mise à l'échelle dynamique pour mettre à l'échelle la capacité de votre groupe Auto Scaling.

Utiliser un suivi de la cible avec la métrique appropriée

Si vous utilisez une politique de suivi des objectifs et d'échelonnement basée sur une métrique de file d'attente Amazon SQS personnalisée, la mise à l'échelle dynamique peut s'adapter plus efficacement à la courbe de la demande de votre application. Pour de plus amples informations sur le choix des métriques pour le suivi de la cible, veuillez consulter Choisissez métriques.

Le problème lié à l'utilisation d'une métrique CloudWatch Amazon SQS, comme ApproximateNumberOfMessagesVisible pour le suivi des cibles, est que le nombre de messages dans la file d'attente peut ne pas changer proportionnellement à la taille du groupe Auto Scaling qui traite les messages de la file d'attente. En effet, le nombre de messages dans votre file d'attente SQS ne définit pas uniquement le nombre d'instances nécessaires. Le nombre d'instances du groupe Auto Scaling peut être dicté par plusieurs facteurs, y compris le temps nécessaire pour traiter un message et la durée de latence acceptable (délai de file d'attente).

La solution consiste à utiliser une métrique d'éléments en attente par instance avec la valeur cible constituant les éléments en attente acceptables par instance à conserver. Vous pouvez calculer ces valeurs comme suit :

  • Éléments en attente par instance : pour calculer les éléments en attente par instance, commencez avec l'attribut de file d'attente ApproximateNumberOfMessages pour déterminer la longueur de la file d'attente SQS (nombre de messages disponibles dans cette file d'attente). Divisez ce nombre par la capacité d'exécution du parc, ce qui correspond dans le cas d'un groupe Auto Scaling au nombre d'instances dans l'état InService, pour obtenir les éléments en attente par instance.

  • Éléments en attente acceptables par instance : pour calculer votre valeur cible, commencez par déterminer ce que votre application peut accepter en termes de latence. Prenez ensuite la valeur de latence acceptable et divisez-la par le temps moyen nécessaire à une instance EC2 pour traiter un message.

Par exemple, disons que vous avez actuellement un groupe Auto Scaling avec 10 instances et le nombre de messages visibles dans la file d'attente (ApproximateNumberOfMessages) s'élève à 1500. Si le temps de traitement moyen est de 0,1 seconde pour chaque message et si la plus grande latence acceptable est de 10 secondes, alors les éléments en attente acceptables par instance sont de 10/0,1, ce qui équivaut à 100 messages. Cela signifie que 100 est la valeur cible pour votre politique de suivi des objectifs et d'échelonnement. Lorsque les éléments en attente par instance atteignent la valeur cible, une diminution se produit. Si les éléments en attente par instance sont actuellement à 150 messages (1500 messages / 10 instances), votre groupe augmente de cinq instances pour maintenir la proportion de la valeur cible.

Les procédures suivantes montrent comment publier la métrique personnalisée et créer la politique de suivi des objectifs et d'échelonnement qui configure la mise à l'échelle du groupe Auto Scaling en fonction de ces calculs.

Important

N'oubliez pas que pour réduire les coûts, vous pouvez utiliser une expression mathématique appliquée à une métrique. Pour plus d’informations, consultez Créer une politique de mise à l’échelle du suivi des cibles pour Amazon EC2 Auto Scaling à l’aide d’une expression mathématique appliquée à une métrique.

Il existe trois parties principales pour cette configuration :

  • Un groupe Auto Scaling pour gérer les instances EC2 afin de traiter les messages d'une file d'attente SQS.

  • Une métrique personnalisée à envoyer à Amazon CloudWatch qui mesure le nombre de messages dans la file d'attente par instance EC2 du groupe Auto Scaling.

  • Une politique de suivi des cibles qui configure votre groupe Auto Scaling pour qu'il évolue en fonction de la métrique personnalisée et d'une valeur cible définie. CloudWatch les alarmes invoquent la politique de dimensionnement.

Le graphique suivant illustre l'architecture de cette configuration.

Diagramme d'architecture Amazon EC2 Auto Scaling avec les files d'attente

Limitations et prérequis

Pour utiliser cette configuration, vous devez être conscient des limitations suivantes :

  • Vous devez utiliser le AWS CLI ou un SDK pour publier votre métrique personnalisée sur. CloudWatch Vous pouvez ensuite surveiller votre métrique à l'aide du AWS Management Console.

  • La console Amazon EC2 Auto Scaling ne prend pas en charge les politiques de suivi des objectifs et d'échelonnement utilisant des métriques personnalisés. Vous devez utiliser le AWS CLI ou un SDK pour spécifier une métrique personnalisée pour votre politique de dimensionnement.

Les sections suivantes vous indiquent comment utiliser le AWS CLI pour les tâches que vous devez effectuer. Par exemple, pour obtenir des données de métrique qui reflètent l'utilisation actuelle de la file d'attente, utilisez la commande SQS get-queue-attributes. Assurez-vous d'avoir installé et configuré l'interface de ligne de commande.

Avant de commencer, vous devez disposer d'une file d'attente Amazon SQS afin de l'utiliser. Dans les sections suivantes, il est supposé que vous disposez déjà d'une file d'attente (standard ou FIFO), d'un groupe Auto Scaling et d'instances EC2 exécutant l'application qui utilise la file d'attente. Pour plus d'informations sur Amazon SQS, consultez le Guide du développeur Amazon Simple Queue Service.

Configuration de la mise à l'échelle en fonction d'Amazon SQS

Étape 1 : créer une métrique CloudWatch personnalisée

Une métrique personnalisée est définie au moyen d'un nom de métrique et d'un espace de noms de votre choix. Les espaces de noms pour les métriques personnalisées ne peuvent pas commencer par AWS/. Pour plus d'informations sur la publication de métriques personnalisées, consultez la rubrique Publier des métriques personnalisées dans le guide de CloudWatch l'utilisateur Amazon.

Suivez cette procédure pour créer la métrique personnalisée en lisant d'abord les informations de votre AWS compte. Calculez ensuite les éléments en attente par métrique d'instance, comme recommandé précédemment. Enfin, publiez ce numéro avec une granularité d'une minute. CloudWatch Nous vous recommandons vivement de mettre à l'échelle les métriques avec une granularité d'une minute afin de garantir une réponse plus rapide aux modifications de la charge du système, dans la mesure du possible.

Pour créer une métrique CloudWatch personnalisée (AWS CLI)
  1. Utilisez la commande SQS get-queue-attributes pour obtenir le nombre de messages en attente dans la file d'attente (ApproximateNumberOfMessages).

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. Utilisez la commande describe-auto-scaling-groups pour obtenir la capacité d'exécution du groupe, qui correspond au nombre d'instances dans l'état du cycle de vie InService. Cette commande renvoie les instances d'un groupe Auto Scaling, avec leur état de cycle de vie.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. Calculez les éléments en attente par instance en divisant le nombre approximatif de messages disponibles pour la récupération dans la file d'attente par la capacité d'exécution du groupe.

  4. Créez un script qui s'exécute toutes les minutes pour récupérer le backlog par valeur d'instance et le publier dans une métrique CloudWatch personnalisée. Lorsque vous publiez une métrique personnalisée, vous spécifiez son nom, son espace de noms et aucune ou plusieurs dimensions. Une dimension se compose d’un nom de dimension et d’une valeur de dimension.

    Pour publier votre métrique personnalisée, remplacez les valeurs d’espace réservé en italique par le nom de métrique de votre choix, la valeur de la métrique, un espace de noms (à condition qu’il ne commence pas par « AWS ») et des dimensions (facultatif), puis exécutez la commande put-metric-data suivante.

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \ --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue

Une fois que votre application a émis la métrique souhaitée, les données sont envoyées à CloudWatch. La métrique est visible dans la CloudWatch console. Vous pouvez y accéder en vous connectant AWS Management Console et en accédant à la CloudWatch page. Consultez ensuite la métrique en accédant à la page des métriques ou en la recherchant à l'aide de la zone de recherche. Pour plus d'informations sur l'affichage des métriques, consultez la section Afficher les métriques disponibles dans le guide de CloudWatch l'utilisateur Amazon.

Étape 2 : créer une politique de suivi des objectifs et d’échelonnement

La métrique que vous avez créée peut désormais être ajoutée à une politique de suivi des cibles et de mise à l’échelle.

Pour créer une politique de suivi des cibles et de mise à l’échelle (AWS CLI)
  1. Utilisez la commande cat suivante pour spécifier une valeur cible pour votre politique de mise à l’échelle et une spécification métrique personnalisée dans un fichier JSON appelé config.json dans votre répertoire de base. Remplacez chaque espace réservé à la saisie de l'utilisateur par vos propres informations. Pour TargetValue, calculez la métrique des éléments en attente acceptables par instance et saisissez la valeur ici. Pour calculer cette valeur, décidez d’une valeur de latence normale et divisez-la par la durée moyenne nécessaire au traitement d’un message, comme décrit dans une précédente section.

    Si vous n’avez spécifié aucune dimension pour la métrique que vous avez créée à l’étape 1, n’incluez aucune dimension dans la spécification de métrique personnalisée.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. Utilisez la commande put-scaling-policy ainsi que le fichier config.json créé à l'étape précédente pour élaborer la politique de mise à l'échelle.

    aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://~/config.json

    Cela crée deux alarmes, une pour augmenter et une pour réduire la taille des instances, Il renvoie également l'Amazon Resource Name (ARN) de la politique enregistrée CloudWatch, qui est CloudWatch utilisée pour invoquer le dimensionnement chaque fois que le seuil métrique est dépassé.

Étape 3 : tester votre politique de mise à l'échelle

Une fois votre configuration terminée, vérifiez que votre politique de mise à l'échelle fonctionne. Vous pouvez tester la politique de montée en puissance en augmentant le nombre de messages dans la file d'attente SQS, puis vérifier que le groupe Auto Scaling a lancé une instance EC2 supplémentaire. De la même façon, vous pouvez tester la politique de mise à l'échelle horizontale en réduisant le nombre de messages dans la file d'attente SQS, puis vérifier que le groupe Auto Scaling a résilié l'instance EC2.

Pour tester la fonction d'évolutivité horizontale
  1. Suivez les étapes décrites dans Création d'une file d'attente standard Amazon SQS et envoi d'un message ou Création d'une file d'attente FIFO Amazon SQS et envoi d'un message pour ajouter des messages à votre file d'attente. Assurez-vous que vous avez augmenté le nombre de messages dans la file d'attente, afin que la métrique d'éléments en attente par instance dépasse la valeur cible.

    Il peut s'écouler quelques minutes avant que les modifications n'appellent l'alarme.

  2. Utilisez la commande describe-auto-scaling-groups pour vérifier si le groupe a lancé une instance.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
Pour tester la fonction de mise à l'échelle horizontale
  1. Suivez les étapes décrites dans la section Recevoir et supprimer un message (console) pour supprimer des messages de la file d'attente. Assurez-vous que vous avez réduit le nombre de messages dans la file d'attente, afin que la métrique d'éléments en attente par instance soit inférieure à la valeur cible.

    Il peut s'écouler quelques minutes avant que les modifications n'appellent l'alarme.

  2. Utilisez la commande describe-auto-scaling-groups suivante pour vérifier si le groupe a résilié une instance.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

Protection contre la mise à l'échelle horizontale d'instance et Amazon SQS

Les messages qui n'ont pas été traités au moment de la résiliation d'une instance sont renvoyés à la file d'attente SQS où ils peuvent être traités par une autre instance qui est encore en cours d'exécution. Pour les applications dans lesquelles des tâches longues sont exécutées, vous pouvez éventuellement utiliser la protection contre la mise à l'échelle horizontale d'instance pour contrôler les processus Worker de file d'attente qui sont résiliés lorsque votre groupe Auto Scaling est mis à l'échelle.

Le pseudocode suivant illustre une façon de protéger les processus Worker de longue durée pilotés par la file d'attente contre la résiliation de mise à l'échelle horizontale.

while (true) { SetInstanceProtection(False); Work = GetNextWorkUnit(); SetInstanceProtection(True); ProcessWorkUnit(Work); SetInstanceProtection(False); }

Pour plus d’informations, consultez Concevez vos applications sur Amazon EC2 Auto Scaling pour gérer de manière optimale la résiliation des instances.