Comment mettre à jour automatiquement la liste des serveurs en amont nginx lorsque le nom d'hôte aws ec2 change ou augmente?

16

Je souhaite configurer la mise à l'échelle automatique dans AWS. Je ne veux pas utiliser Elastic Load Balancer.

La numérotation automatique dans Amazon crée des instances EC2 de manière transparente pendant les pics de demande pour maintenir les performances et diminue automatiquement pendant les accalmies de demande pour minimiser les coûts.

Étant donné que ces instances EC2 sont créées automatiquement, leurs noms d'hôte sont inconnus de NGINX.

Je sais et j'ai déjà une configuration en amont dans nginx à 10 instances EC2.

Je veux pouvoir ajouter / mettre à jour / supprimer automatiquement les noms de serveur à ma configuration nginx en amont, lorsque la mise à l'échelle automatique ajoute / met à jour / supprime des instances EC2.

Luis Lobo Borobia
la source
1
Vous devez supprimer "mise à l'échelle automatique" de votre question. La mise à l'échelle automatique est un terme AWS. Je pense que vous voulez dire que vous voulez évoluer automatiquement (horizontalement), en ajoutant plus de nœuds en amont à votre nginx agissant comme un LB, et vous demandez comment modifier automatiquement votre configuration nginx lorsque des nœuds en amont sont ajoutés / supprimés / modifiés. Si tel est le cas, veuillez modifier votre question en conséquence.
talonx
eh bien, en fait, je sais ce qu'est la numérotation automatique, et je veux dire cela. Je veux mélanger les deux. Je mettrai à jour la question.
Luis Lobo Borobia
1
La question est plus claire maintenant, dans son intention. Je voulais voter pour rouvrir, mais je ne vois pas d'option - je suppose que je n'ai pas encore assez de représentants.
talonx
Merci @talonx J'espère que d'autres pourront voter pour trouver ma réponse
Luis Lobo Borobia
1
Je pense que vous pouvez combiner les notifications d'autoscaling AWS (livrées à l'aide de SNS) - en supposant qu'il renvoie le nom d'hôte de l'instance nouvellement créée / terminée - et l'une des API nginx tierces pour mettre à jour et recharger votre configuration nginx. Désolé d'être vague - je ne connais pas très bien l'API de mise à l'échelle automatique.
talonx

Réponses:

7

Cela peut être réalisé en utilisant Amazon SDK (j'en ai presque fini, je le mettrai sur github), en utilisant le service SNS, EC2 et Autoscaling.

J'ai suivi les étapes ci-dessous pour y parvenir:

  1. Activez la notification HTTP et abonnez mon serveur Web.
  2. Ajout d'un hook de cycle de vie avec un battement de coeur de 1 min (pour attendre 1 min avant de terminer) à mon groupe de mise à l'échelle automatique pour terminer le serveur
  3. Création d'un fichier d'index pour analyser le message afin de détecter de quel type de message il s'agit (c.-à-d. Lancer ou terminer)
  4. Une fois le type d'événement décidé, j'ai demandé à EC2 d'obtenir l'adresse IP privée de l'instance
  5. En cas de lancement, attendez que l'en-tête 200 soit reçu, puis ajoutez l'ip à la configuration nginx et rechargez
  6. En cas de terminaison, supprimez l'IP de la configuration et rechargez nginx

Veuillez trouver le script ici https://github.com/singhupendra/aws-autoscale

Upendra
la source
Y a-t-il une chance que vous ayez posté ceci sur github? J'essaie de faire la même chose et toute aide serait appréciée.
Aaron
veuillez utiliser - github.com/singhupendra/aws-autoscale
Upendra
2

Merci @talonx, j'ai fait quelques recherches, Amazon Autoscale a une API pour interroger le statut actuel du groupe de mise à l'échelle automatique et énumère ses membres. Il renvoie l'ID d'instance ( http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/api_requests.html#query-example ), puis vous pouvez utiliser les outils de description pour obtenir le nom du serveur ( http: // docs .aws.amazon.com / AWSEC2 / latest / CommandLineReference / ApiReference-cmd-DescribeInstances.html ) et enfin recréer le fichier include en amont. Je pouvais sentir les notifications de mise à l'échelle automatique pour lancer un processus qui effectue ces tâches.

Je ne l'ai toujours pas implémenté mais c'est un chemin à parcourir.

On peut également utiliser Autocaling avec SNS http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ASGettingNotifications.html

Luis Lobo Borobia
la source
C'est essentiellement ce que j'ai fait. J'ai écrit un script ruby ​​qui s'exécute toutes les N minutes. À l'aide de l'AWS SDK, il interroge les membres de l'ASG et à l'aide d'un modèle ERB, il génère une nouvelle configuration. Si la nouvelle configuration est différente de la configuration actuelle, elle la copie en place et demande au démon (haproxy dans mon cas) de recharger sa configuration. Notez que les instances restent dans l'ASG un peu après leur fin, assurez-vous donc que instance.status ==: est en cours d'exécution. Notez également que si cela prend N minutes après le lancement de l'instance pour qu'il puisse servir les requêtes, ne l'utilisez pas unil maintenant> instance.launch_time + N.
Mark Wagner
Merci @MarkWagner. Y a-t-il une possibilité que vous puissiez partager ce script quelque part? Gist, github? Merci!
Luis Lobo Borobia
Avez-vous eu de la chance avec ce script? Y a-t-il un exemple sur github ou ailleurs?
Aaron
Non mais en ce moment, nginx-plus (la version payante) le permet encore plus.
Luis Lobo Borobia
1

Je ne l'ai pas encore implémenté moi-même, mais je cherche à utiliser la reconfiguration à la volée de NGiNX Plus . Je pense que l'AMI, ou la gestion de la configuration (Puppet, Salt, ou autre) qui met en place une instance Auto Scaling Group, pourrait atteindre l'API de reconfiguration NGiNX (peut-être, via un nom de domaine Route53 interne afin qu'aucune IP fixe ne le fasse doivent être utilisés) et s’ajouter au cluster en amont pour le proxy inverse. Après cela, le contrôle de santé intégré de NGiNX prendrait alors le relais pour cette instance [ajoutée] et la supprimerait au cas où elle deviendrait indisponible. Cela semble la solution la plus propre et il n'y a aucun délai pour ajouter l'instance, et pratiquement aucun délai pour la supprimer, car NGiNX Plus propose un contrôle d'intégrité hors bande.

Cette approche évite d'avoir à mettre en place un système de détection automatique (Consul, Serf, ou autre) qui, pour les configurations plus petites, semble souvent être une surcharge, tant en termes de configuration / administration que d'instances EC2 requises. Consul, par exemple, nécessite un minimum de trois instances pour être stable. Serf pourrait peut-être s'exécuter sur les instances ASG elles-mêmes, mais il reste la charge de le maintenir, et si l'ASG se réduit à une ou deux instances, vous perdriez le quorum.

Enfin, cela pourrait être combiné avec une notification automatique des modifications du groupe Auto Scaling, peut-être sur le (s) serveur (s) NGiNX utilisé (s) pour l'équilibrage de charge. Un auditeur déclenché par une telle notification (c'est peut-être ce à quoi Upendra a également fait référence) pourrait alors ajouter instantanément la nouvelle instance à NGiNX via l'API de modification à la volée. Outre le coût de NGiNX Plus, cela fait que l'on se demande pourquoi quelqu'un utiliserait Elastic Load Balancer avec ses nombreux problèmes en premier lieu.

Edit 2015-12-07 : ngx_openresty 's balancer-by-lua ( voir ce fil GitHub ) offre une autre solution open source possible pour ajouter / supprimer des serveurs à chaud du groupe en amont NGiNX. Je n'ai pas encore expérimenté cela moi-même, mais je voulais ajouter une mention ici pour quiconque tombe sur ce post.

Ville
la source