Bonjour à tous ! Je m'appelle Kirill, je suis CTO chez Adapty. La majeure partie de notre architecture se trouve sur AWS, et aujourd'hui, je vais vous expliquer comment nous avons réduit nos coûts de serveur par trois grùce à l'utilisation d'instances Spot dans notre environnement de production, ainsi que comment configurer leur auto-scaling. D'abord, je donnerai un aperçu de son fonctionnement, puis une instruction détaillée pour le lancer.
Qu'est-ce que les instances Spot ?
instances Spot sont des serveurs d'autres utilisateurs d'AWS qui sont actuellement inoccupĂ©s, et ils les vendent avec une grande remise (Amazon affirme jusqu'Ă 90%, selon notre expĂ©rience environ 3x, cela varie en fonction de la rĂ©gion, de l'AZ et du type d'instance). Leur principale diffĂ©rence avec les instances classiques est qu'elles peuvent s'arrĂȘter Ă tout moment. Nous avons longtemps pensĂ© qu'elles Ă©taient adaptĂ©es pour les environnements de dĂ©veloppement ou pour des tĂąches de calcul avec des rĂ©sultats intermĂ©diaires sauvegardĂ©s sur S3 ou dans une base de donnĂ©es, mais pas pour la production. Il existe des solutions tierces qui permettent d'utiliser les Spot en production, mais elles nĂ©cessitent beaucoup de bricolage pour notre cas d'utilisation, c'est pourquoi nous ne les avons pas mises en Ćuvre. L'approche dĂ©crite dans cet article fonctionne entiĂšrement dans le cadre des fonctionnalitĂ©s standard d'AWS, sans scripts supplĂ©mentaires, cron jobs, etc.
Voici quelques captures d'écran qui montrent l'historique des prix des instances Spot.
m5.large dans la région eu-west-1 (Irlande). Le prix est principalement stable depuis 3 mois, actuellement l'économie est de 2.9x.

m5.large dans la région us-east-1 (Virginie du Nord). Le prix change constamment pendant 3 mois, actuellement l'économie varie de 2.3x à 2.8x selon la zone de disponibilité.

t3.small dans la région us-east-1 (Virginie du Nord). Le prix est stable depuis 3 mois, actuellement l'économie est de 3.4x.

Architecture du service
L'architecture de base du service dont nous allons parler dans cet article est illustrée dans le diagramme ci-dessous.

Application Load Balancer â EC2 Target Group â Elastic Container Service
Un Application Load Balancer (ALB) est utilisĂ© comme Ă©quilibrage de charge, qui envoie des requĂȘtes au EC2 Target Group (TG). Le TG est responsable de l'ouverture des ports sur les instances pour l'ALB et de leur liaison avec les ports des conteneurs Elastic Container Service (ECS). L'ECS est l'Ă©quivalent de Kubernetes sur AWS, qui gĂšre les conteneurs Docker.
Un mĂȘme instance peut exĂ©cuter plusieurs conteneurs fonctionnant sur les mĂȘmes ports, c'est pourquoi nous ne pouvons pas les dĂ©finir de maniĂšre fixe. ECS informe le TG qu'il lance une nouvelle tĂąche (appelĂ©e pod dans le jargon Kubernetes), il vĂ©rifie les ports disponibles sur l'instance et en attribue un Ă la tĂąche en cours. De plus, le TG vĂ©rifie rĂ©guliĂšrement si l'instance fonctionne et si l'API y est opĂ©rationnelle grĂące Ă un contrĂŽle de santĂ©, et s'il dĂ©tecte des problĂšmes, il cesse d'y envoyer des requĂȘtes.
Groupes de mise à l'échelle EC2 + Fournisseurs de capacité ECS
Le service EC2 Auto Scaling Groups (ASG) n'est pas reprĂ©sentĂ© dans le diagramme ci-dessus. Comme son nom l'indique, il est responsable de la mise Ă l'Ă©chelle des instances. Cependant, jusqu'Ă rĂ©cemment, AWS n'avait pas de fonctionnalitĂ© intĂ©grĂ©e permettant de gĂ©rer le nombre de machines lancĂ©es depuis ECS. ECS permettait de faire Ă©voluer le nombre de tĂąches, par exemple, en fonction de l'utilisation de CPU, de RAM ou du nombre de requĂȘtes. Mais si les tĂąches prenaient toutes les instances disponibles, de nouvelles machines n'Ă©taient pas automatiquement lancĂ©es.
Cela a changĂ© avec l'introduction des Fournisseurs de capacitĂ© ECS (ECS CP). Maintenant, chaque service dans ECS peut ĂȘtre liĂ© Ă un ASG, et si les tĂąches ne tiennent pas sur les instances en cours, de nouvelles instances seront créées (dans les limites dĂ©finies par l'ASG). Cela fonctionne aussi dans l'autre sens, si ECS CP dĂ©tecte des instances inactives sans tĂąches, il commandera Ă l'ASG de les Ă©teindre. ECS CP a la possibilitĂ© de spĂ©cifier un pourcentage cible d'utilisation des instances, de sorte qu'un certain nombre de machines restent toujours disponibles pour un dĂ©ploiement rapide des tĂąches, j'en parlerai un peu plus tard.
ModĂšles de lancement EC2
Le dernier service dont je vais parler avant de passer à une description détaillée de la création de cette infrastructure est les ModÚles de lancement EC2. Il permet de créer un modÚle selon lequel toutes les machines seront lancées, afin de ne pas répéter ce processus à chaque fois depuis le début. Ici, vous pouvez choisir le type de machine à lancer, le groupe de sécurité, l'image disque et beaucoup d'autres paramÚtres. Vous pouvez également spécifier des données utilisateur qui seront appliquées à toutes les instances lancées. Dans ces données utilisateur, vous pouvez exécuter des scripts, par exemple, il est possible de modifier le contenu du fichier .
Un des paramĂštres de configuration les plus importants dans le cadre de cet article est =true. Si ce paramĂštre est activĂ©, dĂšs qu'ECS reçoit le signal qu'une instance spot est retirĂ©e, il change le statut de toutes les tĂąches qui fonctionnent dessus Ă Draining. Aucune nouvelle tĂąche ne sera affectĂ©e Ă cette instance ; si des tĂąches souhaitent immĂ©diatement ĂȘtre dĂ©ployĂ©es sur celle-ci, elles seront annulĂ©es. Les requĂȘtes du rĂ©partiteur de charge cessent Ă©galement d'arriver. La notification de suppression de l'instance arrive 2 minutes avant l'Ă©vĂ©nement rĂ©el. Donc, si votre service n'exĂ©cute pas des tĂąches pendant plus de 2 minutes et ne sauvegarde rien sur le disque, vous pouvez utiliser des instances spot sans perte de donnĂ©es.
Concernant le disque â AWS a rĂ©cemment possible l'utilisation du Elastic File System (EFS) avec ECS, avec ce schĂ©ma mĂȘme le disque ne reprĂ©sente pas un obstacle, mais nous ne l'avons pas essayĂ©, car en principe, nous n'avons pas besoin de disque pour stocker l'Ă©tat. Par dĂ©faut, aprĂšs avoir reçu un SIGINT (envoyĂ© au moment du changement de statut de la tĂąche Ă Draining), toutes les tĂąches en cours seront arrĂȘtĂ©es aprĂšs 30 secondes, mĂȘme si elles n'ont pas eu le temps de s'exĂ©cuter ; ce temps peut ĂȘtre modifiĂ© avec le paramĂštre . L'essentiel est de ne pas le rĂ©gler Ă plus de 2 minutes pour les machines spot.
Création du service
Passons directement Ă la crĂ©ation du service dĂ©crit. Au cours du processus, je vais dĂ©crire quelques points utiles supplĂ©mentaires qui n'ont pas Ă©tĂ© abordĂ©s prĂ©cĂ©demment. Dans l'ensemble, il s'agit d'un guide Ă©tape par Ă©tape, mais je ne vais pas aborder des cas trĂšs basiques ou trĂšs spĂ©cifiques. Toutes les actions s'effectuent dans la console visuelle AWS, mais elles peuvent ĂȘtre reproduites de maniĂšre programmatique avec CloudFormation ou Terraform. Chez Adapty, nous utilisons Terraform.
Template de lancement EC2
Dans ce service, une configuration des machines qui seront utilisées est créée. La gestion des modÚles se déroule dans la section EC2 -> Instances -> Templates de lancement.
Image machine Amazon (AMI) â nous indiquons l'image de disque avec laquelle toutes les instances seront lancĂ©es. Pour ECS, dans la plupart des cas, il est conseillĂ© d'utiliser l'image optimisĂ©e par Amazon. Elle est rĂ©guliĂšrement mise Ă jour et contient tout le nĂ©cessaire pour le fonctionnement d'ECS. Pour connaĂźtre l'ID de l'image actuel, nous visitons la page , choisissons la rĂ©gion utilisĂ©e et copions l'ID AMI pour celle-ci. Par exemple, pour la rĂ©gion us-east-1, l'ID actuel au moment de la rĂ©daction de cet article est ami-00c7c1cf5bdc913ed. Cet ID doit ĂȘtre insĂ©rĂ© dans le champ SpĂ©cifier une valeur personnalisĂ©e.
Type d'instance â indiquez le type d'instance. Choisissez celui qui convient le mieux Ă votre tĂąche.
ClĂ© de paire (connexion) â indiquez le certificat permettant de se connecter Ă l'instance via SSH, si nĂ©cessaire.
ParamĂštres rĂ©seau â indiquez les paramĂštres de rĂ©seau. Plateforme rĂ©seau dans la plupart des cas, cela devrait ĂȘtre un Virtual Private Cloud (VPC). Groupes de sĂ©curitĂ© â groupes de sĂ©curitĂ© pour vos instances. Comme nous allons utiliser un Ă©quilibreur de charge devant les instances, je recommande d'indiquer ici un groupe qui autorise les connexions entrantes uniquement depuis l'Ă©quilibreur de charge. Cela signifie que vous aurez 2 groupes de sĂ©curitĂ©, un pour l'Ă©quilibreur de charge qui autorise les connexions entrantes (inbound) de partout sur les ports 80 (http) et 443 (https), et un deuxiĂšme pour les machines, qui autorise les connexions entrantes sur n'importe quel port depuis le groupe de l'Ă©quilibreur de charge. Les connexions sortantes (outbound) dans les deux groupes doivent ĂȘtre ouvertes selon le protocole TCP sur tous les ports vers toutes les adresses. Il est possible de restreindre les ports et adresses pour les connexions sortantes, mais il faudra alors surveiller en permanence que vous ne tentez pas d'accĂ©der Ă un port fermĂ©.
Stockage (volumes) â indiquez les paramĂštres des disques pour les machines. Le volume du disque ne peut pas ĂȘtre infĂ©rieur Ă celui spĂ©cifiĂ© dans l'AMI, pour ECS Optimized â 30 GiB.
DĂ©tails avancĂ©s â indiquez des paramĂštres supplĂ©mentaires.
Option d'achat â voulons-nous acheter des instances spot. Nous voulons, mais nous ne cocherons pas cette case ici, nous le configurerons dans le groupe d'auto-scaling, oĂč il y a plus d'options.
Profil d'instance IAM â indiquez le rĂŽle sous lequel les instances seront lancĂ©es. Pour que les instances fonctionnent dans ECS, elles ont besoin de droits qui sont gĂ©nĂ©ralement associĂ©s au rĂŽle ecsInstanceRole. Dans certains cas, celui-ci peut ĂȘtre créé, s'il n'existe pas, alors ici des instructions sur la façon de le faire. AprĂšs sa crĂ©ation, nous l'indiquerons dans le modĂšle.
Ensuite, il y a beaucoup de paramÚtres, dans l'ensemble, il est possible de laisser les valeurs par défaut, mais chacun d'eux possÚde une description claire. J'active toujours les paramÚtres d'instance optimisée EBS et T2/T3 Unlimited, si des Données utilisateur
DonnĂ©es utilisateur â indiquez les donnĂ©es utilisateur. Nous allons modifier le fichier /etc/ecs/ecs.config, qui contient la configuration de l'agent ECS.
Voici un exemple de ce à quoi pourraient ressembler les données utilisateur :
#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.configECS_CLUSTER=DemoApiClusterProd â ce paramĂštre indique que l'instance appartient Ă un cluster avec le nom spĂ©cifiĂ©, c'est-Ă -dire que ce cluster pourra exĂ©cuter ses tĂąches sur ce serveur. Nous n'avons pas encore créé de cluster, mais lors de sa crĂ©ation, nous utiliserons ce nom.
ECS_ENABLE_SPOT_INSTANCE_DRAINING=true â ce paramĂštre indique que lors de la rĂ©ception d'un signal d'arrĂȘt d'une instance spot, toutes les tĂąches sur celle-ci doivent passer au statut Draining.
ECS_CONTAINER_STOP_TIMEOUT=1m â ce paramĂštre indique qu'aprĂšs rĂ©ception du signal SIGINT, toutes les tĂąches ont 1 minute avant d'ĂȘtre arrĂȘtĂ©es.
ECS_ENGINE_AUTH_TYPE=docker â ce paramĂštre indique que le mĂ©canisme d'authentification utilise le schĂ©ma docker.
ECS_ENGINE_AUTH_DATA=... â paramĂštres de connexion Ă un registre de conteneur privĂ©, oĂč sont stockĂ©es vos images Docker. S'il est public, il n'est pas nĂ©cessaire d'indiquer quoi que ce soit.
Dans cet article, j'utiliserai une image publique de Docker Hub, donc il n'est pas nécessaire d'indiquer les paramÚtres. ECS_ENGINE_AUTH_TYPE et ECS_ENGINE_AUTH_DATA aucun besoin.
Bon à savoir: il est recommandé de mettre à jour réguliÚrement l'AMI, car dans les nouvelles versions, les versions de Docker, Linux, de l'agent ECS, etc. sont mises à jour. Pour ne pas l'oublier, vous pouvez sur la sortie de nouvelles versions. Vous pouvez recevoir des notifications par email et mettre à jour manuellement, ou vous pouvez écrire une fonction Lambda qui créera automatiquement une nouvelle version de la Launch Template avec l'AMI mis à jour.
Groupe de mise à l'échelle EC2
Le groupe de mise à l'échelle est responsable du lancement et de la mise à l'échelle des instances. La gestion des groupes se fait dans la section EC2 -> Auto Scaling -> Groupes de mise à l'échelle.
Template de lancement â on choisit le modĂšle créé lors de l'Ă©tape prĂ©cĂ©dente. Nous laissons la version par dĂ©faut.
Options d'achat et types d'instance â on spĂ©cifie les types d'instances pour le cluster. Adhere to launch template utilise le type d'instance du modĂšle de lancement. Combine purchase options and instance types permet de configurer les types d'instances de maniĂšre flexible. Nous allons l'utiliser.
Base on-demand optionnelle â le nombre d'instances normales, non-spot, qui seront toujours en cours d'exĂ©cution.
Pourcentage on-demand au-dessus de la base â le rapport entre les instances normales et spot, 50-50 les rĂ©partit Ă©galement, 20-80 signifiera qu'il y aura 4 instances spot pour chaque instance normale. Dans cet exemple, je vais spĂ©cifier 50-50, mais dans la rĂ©alitĂ©, nous faisons souvent 20-80, et parfois 0-100.
Types d'instance â ici, vous pouvez spĂ©cifier des types supplĂ©mentaires d'instances qui seront utilisĂ©s dans le cluster. Nous ne l'avons jamais utilisĂ©, car je ne comprends pas trĂšs bien le sens de cette histoire. Peut-ĂȘtre est-ce liĂ© aux limites sur des types spĂ©cifiques d'instances, mais elles peuvent ĂȘtre facilement augmentĂ©es grĂące au support. Si vous connaissez une application, je serais ravi de lire vos commentaires)

RĂ©seau â paramĂštres rĂ©seau, vous choisissez le VPC et les sous-rĂ©seaux pour les machines, dans la plupart des cas, il convient de choisir tous les sous-rĂ©seaux disponibles.
Ăquilibrage de charge â paramĂštres de l'Ă©quilibreur, mais nous le ferons sĂ©parĂ©ment, ici nous ne touchons Ă rien. ContrĂŽles de santĂ© seront Ă©galement configurĂ©s plus tard.
Taille du groupe â nous spĂ©cifions les limites pour le nombre de machines dans le cluster et le nombre souhaitĂ© de machines au dĂ©marrage. Le nombre de machines dans le cluster ne sera jamais infĂ©rieur au minimum spĂ©cifiĂ© ni supĂ©rieur au maximum, mĂȘme si les mĂ©triques indiquent qu'une mise Ă l'Ă©chelle devrait se produire.
Politiques de mise Ă l'Ă©chelle â paramĂštres de mise Ă l'Ă©chelle, mais nous allons nous baser sur les tĂąches ECS en cours, donc nous configurerons la mise Ă l'Ă©chelle plus tard.
Protection contre la rĂ©duction d'instance â protection des instances contre la suppression lors de la mise Ă l'Ă©chelle vers le bas. Nous l'activons pour que l'ASG ne supprime pas la machine sur laquelle des tĂąches fonctionnent. La protection pour les instances sans tĂąches sera dĂ©sactivĂ©e par le fournisseur de capacitĂ© ECS.
Ajouter des balises â vous pouvez spĂ©cifier des balises pour les instances (pour cela, la case Ă cocher Tag new instances doit ĂȘtre activĂ©e). Je recommande d'indiquer la balise Name, alors toutes les instances lancĂ©es dans le groupe auront le mĂȘme nom, ce qui les rendra faciles Ă visualiser dans la console.

AprÚs la création du groupe, ouvrez-le et allez dans la section Configurations avancées, car lors de la création, toutes les options ne sont pas visibles dans la console.
Politiques de termination â rĂšgles pris en compte lors de la suppression d'instances. Elles s'appliquent dans l'ordre. Nous utilisons gĂ©nĂ©ralement celles montrĂ©es sur l'image ci-dessous. D'abord, les instances avec le modĂšle de lancement le plus ancien sont supprimĂ©es (par exemple, si nous avons mis Ă jour l'AMI, une nouvelle version a Ă©tĂ© créée, mais toutes les instances ont rĂ©ussi Ă y passer). Ensuite, les instances les plus proches du prochain moment de facturation sont choisies. Puis, les plus anciennes en date de lancement sont sĂ©lectionnĂ©es.

Bon Ă savoir: pour la mise Ă jour de toutes les machines dans le cluster, il est pratique d'utiliser . Si vous combinez cela avec une fonction Lambda de l'Ă©tape prĂ©cĂ©dente, vous disposerez d'un systĂšme de mise Ă jour des instances entiĂšrement automatisĂ©. Avant de mettre Ă jour toutes les machines, il est nĂ©cessaire de dĂ©sactiver la protection contre la rĂ©duction de l'Ă©chelle des instances pour toutes les instances du groupe. Ce n'est pas la configuration du groupe, mais plutĂŽt la protection des machines elles-mĂȘmes, qui se fait dans l'onglet Gestion des instances.
Application Load Balancer et EC2 Target Group
Le rĂ©partiteur est créé dans la section EC2 â Load Balancing â Load Balancers. Nous allons utiliser un Application Load Balancer, pour comparer les diffĂ©rents types de rĂ©partiteurs, vous pouvez consulter la .
Listeners â il est logique de crĂ©er les ports 80 et 443, et de rediriger le port 80 vers le 443 Ă l'aide de rĂšgles du rĂ©partiteur.
Zones de disponibilitĂ© â dans la plupart des cas, nous choisissons toutes les zones de disponibilitĂ©.
Configurer les paramĂštres de sĂ©curitĂ© â ici, le certificat SSL pour le rĂ©partiteur est spĂ©cifiĂ©, la solution la plus pratique est de dans ACM. Vous pouvez lire sur les diffĂ©rences de Politique de sĂ©curitĂ© dans , vous pouvez laisser le choix par dĂ©faut ELBSecurityPolicy-2016-08. AprĂšs la crĂ©ation du rĂ©partiteur, vous verrez son nom DNS, pour lequel vous devez configurer un CNAME pour votre domaine. Par exemple, c'est ainsi que cela apparaĂźt dans Cloudflare.

Groupe de SĂ©curitĂ© â nous crĂ©ons ou choisissons un groupe de sĂ©curitĂ© pour le rĂ©partiteur, dont j'ai parlĂ© plus haut dans la section ModĂšle de lancement EC2 â ParamĂštres rĂ©seau.
Groupe cible â nous crĂ©ons un groupe qui se charge de router les requĂȘtes du rĂ©partiteur vers les machines et vĂ©rifie leur disponibilitĂ© afin de remplacer en cas de problĂšme. Le type de cible doit ĂȘtre Instance, Protocole et Port tous, si vous utilisez HTTPS pour communiquer entre le rĂ©partiteur et les instances, vous devez y tĂ©lĂ©charger le certificat. Dans cet exemple, nous ne le ferons pas, nous laisserons simplement le port 80.
ContrĂŽles de santĂ© â paramĂštres de vĂ©rification de la disponibilitĂ© du service. Dans un vrai service, cela devrait ĂȘtre une requĂȘte distincte, qui implĂ©mente les parties importantes de la logique mĂ©tier, dans cet exemple, je laisserai les paramĂštres par dĂ©faut. Ensuite, vous pouvez choisir l'intervalle des requĂȘtes, le dĂ©lai d'attente, les codes de rĂ©ponses rĂ©ussies, etc. Dans notre exemple, indiquons les codes de succĂšs 200-399, car l'image Docker qui sera utilisĂ©e renvoie le code 304.

Enregistrer les cibles â ici, nous sĂ©lectionnons les machines pour le groupe, mais dans notre cas, cela sera gĂ©rĂ© par ECS, donc nous passons simplement cette Ă©tape.
Bon Ă savoir: au niveau du rĂ©partiteur, nous pouvons activer les journaux, qui seront enregistrĂ©s dans S3 Ă un emplacement spĂ©cifique. . Vous pouvez les exporter vers des services externes pour l'analyse, ou effectuer des requĂȘtes SQL directement sur les donnĂ©es dans S3 avec . C'est pratique et cela fonctionne sans code supplĂ©mentaire. Je recommande Ă©galement de configurer la suppression des logs du bucket S3 aprĂšs une pĂ©riode de temps dĂ©terminĂ©e.
Définition de la tùche ECS
Lors des Ă©tapes prĂ©cĂ©dentes, nous avons créé tout ce qui concerne l'infrastructure du service, maintenant nous allons dĂ©crire les conteneurs que nous allons exĂ©cuter. Cela se fait dans la section ECS â DĂ©definitions des tĂąches.
CompatibilitĂ© du type de lancement â nous choisissons EC2.
RĂŽle IAM d'exĂ©cution de la tĂąche â nous choisissons ecsTaskExecutionRole. Il permet d'Ă©crire des logs, d'accĂ©der aux variables secrĂštes, etc.
Dans la section Définitions du conteneur, cliquez sur Ajouter un conteneur.
Image â l'URL de l'image avec le code du projet, dans cet exemple je vais utiliser une image publique de Docker Hub .
Limites de mĂ©moire â limites de mĂ©moire pour le conteneur. Limite stricte â limite stricte, si le conteneur dĂ©passe cette valeur, la commande docker kill sera exĂ©cutĂ©e, le conteneur mourra immĂ©diatement. Limite souple â limite souple, le conteneur peut dĂ©passer cette valeur, mais lors du placement des tĂąches sur les machines, ce paramĂštre sera pris en compte. Par exemple, si une machine dispose de 4 GiB de RAM, et que la limite souple du conteneur est de 2048 MiB, alors un maximum de 2 tĂąches avec ce conteneur peut ĂȘtre exĂ©cutĂ© sur cette machine. En rĂ©alitĂ©, 4 GiB de RAM c'est lĂ©gĂšrement moins que 4096 MiB, ce que vous pouvez voir dans l'onglet Instances ECS du cluster. La limite souple ne peut pas ĂȘtre supĂ©rieure Ă la limite stricte. Il est important de comprendre que si une tĂąche a plusieurs conteneurs, leurs limites s'additionnent.
Mapping des ports â dans Port hĂŽte nous indiquons 0, cela signifie que le port sera attribuĂ© dynamiquement et sera suivi par le groupe cible. Port du conteneur â le port sur lequel votre application fonctionne, souvent spĂ©cifiĂ© dans la commande d'exĂ©cution, ou attribuĂ© dans le code de votre application, Dockerfile, etc. Pour notre exemple, nous utilisons 3000, car il est mentionnĂ© dans l'image utilisĂ©e.
VĂ©rification de l'Ă©tat â paramĂštres de vĂ©rification de la disponibilitĂ© du conteneur, Ă ne pas confondre avec celui configurĂ© dans le groupe cible.
Environnement â paramĂštres d'environnement. UnitĂ©s CPU â ressemble Ă Memory limits, mais pour le processeur. Chaque cĆur de processeur Ă©quivaut Ă 1024 unitĂ©s, donc si le serveur a un processeur dual-core et que le conteneur a une valeur de 512, alors quatre tĂąches avec ce conteneur peuvent ĂȘtre exĂ©cutĂ©es sur un serveur. Les unitĂ©s CPU correspondent toujours au nombre de cĆurs, il ne peut pas y en avoir un peu moins comme c'est le cas avec la mĂ©moire.
Commande â commande pour lancer un service Ă l'intĂ©rieur du conteneur, tous les paramĂštres sont indiquĂ©s par virgule. Cela peut ĂȘtre gunicorn, npm, etc. Si non spĂ©cifiĂ©, la directive CMD du Dockerfile sera utilisĂ©e. Nous indiquons npm,start.
Variables d'environnement â variables d'environnement du conteneur. Cela peut ĂȘtre Ă la fois des donnĂ©es textuelles simples et des variables secrĂštes de ou .
Stockage et journalisation â ici nous configurerons la journalisation dans CloudWatch Logs (service de logs d'AWS). Pour cela, il suffit de cocher la case Auto-configure CloudWatch Logs. AprĂšs la crĂ©ation de la dĂ©finition de tĂąche, un groupe de logs sera automatiquement créé dans CloudWatch. Par dĂ©faut, les logs y sont conservĂ©s indĂ©finiment, je recommande de modifier la pĂ©riode de conservation de Never Expire Ă la durĂ©e requise. Cela se fait dans les groupes de logs CloudWatch, il faut cliquer sur la pĂ©riode actuelle et choisir une nouvelle.

ECS Cluster et ECS Capacity Provider
Allons dans la section ECS â Clusters pour crĂ©er un cluster. En tant que modĂšle, choisissons EC2 Linux + Networking.
Nom du cluster â trĂšs important, donnez ici le mĂȘme nom que celui indiquĂ© dans le Launch Template dans le paramĂštre ECS_CLUSTER, dans notre cas â DemoApiClusterProd. Cochez la case Create an empty cluster. Optionnellement, vous pouvez activer Container Insights pour voir les mĂ©triques des services dans CloudWatch. Si vous avez tout fait correctement, vous verrez dans la section ECS Instances les machines qui ont Ă©tĂ© créées dans le groupe Auto Scaling.

AccĂ©dez Ă l'onglet Capacity Providers et crĂ©ons un nouveau. Rappelons que cela est nĂ©cessaire pour gĂ©rer la crĂ©ation et l'arrĂȘt des machines en fonction du nombre de tĂąches ECS en cours. Il est important de noter que le fournisseur ne peut ĂȘtre liĂ© qu'Ă un seul groupe.
Auto Scaling group â choisissons le groupe créé prĂ©cĂ©demment.
Mise Ă l'Ă©chelle gĂ©rĂ©e â activez-le pour que le fournisseur puisse mettre Ă l'Ă©chelle le service.
CapacitĂ© ciblĂ©e % â quel pourcentage d'occupation des machines par des tĂąches est nĂ©cessaire. Si vous spĂ©cifiez 100%, toutes les machines seront toujours occupĂ©es par des tĂąches en cours. Si vous spĂ©cifiez 50%, la moitiĂ© des machines seront toujours libres. Dans ce cas, si un pic de charge se produit, les nouvelles tĂąches iront immĂ©diatement vers les machines libres, sans attendre le dĂ©ploiement d'instances.
Protection de terminaison gĂ©rĂ©e â si activĂ©, ce paramĂštre permet au fournisseur de supprimer la protection des instances contre la suppression. Cela se produit lorsque la machine n'a pas de tĂąches actives et permet de gĂ©rer la capacitĂ© cible %.
Service ECS et configuration de la mise à l'échelle
DerniÚre étape :) Pour créer un service, il faut accéder au cluster créé précédemment dans l'onglet Services.
Type de lancement â il suffit de cliquer sur Passer Ă la stratĂ©gie de fournisseur de capacitĂ© et de sĂ©lectionner le fournisseur créé prĂ©cĂ©demment.

DĂ©finition de la tĂąche â sĂ©lectionnez la dĂ©finition de tĂąche créée prĂ©cĂ©demment et sa rĂ©vision.
Nom du service â pour Ă©viter toute confusion, nous indiquons toujours le mĂȘme nom que la dĂ©finition de tĂąche.
Type de service â toujours RĂ©plica.
Nombre de tĂąches â nombre souhaitĂ© de tĂąches actives dans le service. Ce paramĂštre est gĂ©rĂ© par la mise Ă l'Ă©chelle, mais doit quand mĂȘme ĂȘtre indiquĂ©.
Pourcentage minimum de santĂ© et Pourcentage maximum â dĂ©finissent le comportement des tĂąches lors du dĂ©ploiement. Les valeurs par dĂ©faut sont 100 et 200, ce qui signifie qu'au moment du dĂ©ploiement, le nombre de tĂąches augmentera plusieurs fois, puis retournera au souhaitĂ©. Si vous avez 1 tĂąche, min=0 et max=100, alors lors du dĂ©ploiement, elle sera tuĂ©e, et ensuite une nouvelle sera lancĂ©e, ce qui entraĂźnera un temps d'arrĂȘt. Si une tĂąche est en cours d'exĂ©cution, min=50 et max=150, le dĂ©ploiement ne se produira pas du tout, car une tĂąche ne peut pas ĂȘtre partagĂ©e ou augmentĂ©e par un facteur de 1,5.
Type de dĂ©ploiement â nous choisissons Mise Ă jour progressive.
ModĂšles de placement â rĂšgles de placement des tĂąches sur les machines. Par dĂ©faut, la stratĂ©gie est AZ Balanced Spread, ce qui signifie que chaque nouvelle tĂąche sera placĂ©e sur une nouvelle instance jusqu'Ă ce que des machines soient créées dans toutes les zones de disponibilitĂ©. Nous prĂ©fĂ©rons gĂ©nĂ©ralement BinPack â CPU et Spread â AZ, avec cette politique, les tĂąches sont optimisĂ©es pour occuper autant que possible une seule machine par rapport au CPU. Si une nouvelle machine doit ĂȘtre créée, elle est créée dans une nouvelle zone de disponibilitĂ©.

Type de charge balancĂ©e â nous choisissons le Load Balancer d'application.
RĂŽle IAM du service â nous choisissons ecsServiceRole.
Nom du chargeur d'Ă©quilibre â nous choisissons le chargeur d'Ă©quilibre créé prĂ©cĂ©demment.
PĂ©riode de grĂące de vĂ©rification de santĂ© â pause avant l'exĂ©cution des vĂ©rifications de viabilitĂ© aprĂšs le dĂ©ploiement d'une nouvelle tĂąche, nous mettons gĂ©nĂ©ralement 60 secondes.
Conteneur Ă Ă©quilibrer â dans le champ Nom du groupe cible, sĂ©lectionnez le groupe créé prĂ©cĂ©demment, et tout se remplira automatiquement.

Mise Ă l'Ă©chelle automatique du service â paramĂštres de mise Ă l'Ă©chelle du service. Nous choisissons Configurer la mise Ă l'Ă©chelle automatique du service pour ajuster le nombre souhaitĂ© du service. DĂ©finissons le nombre minimum et maximum de tĂąches lors de la mise Ă l'Ă©chelle.
RĂŽle IAM pour la mise Ă l'Ă©chelle automatique du service â nous choisissons AWSServiceRoleForApplicationAutoScaling_ECSService.
Politiques de mise Ă l'Ă©chelle automatique des tĂąches â rĂšgles de mise Ă l'Ă©chelle. Il existe 2 types :
- Suivi de cible â suivi d'une mĂ©trique cible (utilisation du CPU/RAM ou nombre de requĂȘtes pour chaque tĂąche). Par exemple, nous souhaitons que la charge moyenne du processeur soit de 85 %, lorsqu'elle dĂ©passe ce seuil, de nouvelles tĂąches seront ajoutĂ©es jusqu'Ă ce qu'elle atteigne la valeur cible. Si la charge est infĂ©rieure, les tĂąches seront rĂ©duites, sauf si la protection contre la mise Ă lâĂ©chelle descendante est activĂ©e (DĂ©sactiver la mise Ă l'Ă©chelle descendante).
- Mise Ă l'Ă©chelle par Ă©tape â rĂ©action Ă un Ă©vĂ©nement arbitraire. Ici, il est possible de configurer la rĂ©ponse Ă tout Ă©vĂ©nement (Alarme CloudWatch) lorsqu'il se produit, vous pouvez ajouter ou retirer un certain nombre de tĂąches, ou indiquer un nombre exact de tĂąches.
Le service peut avoir plusieurs rĂšgles de mise Ă l'Ă©chelle, ce qui peut ĂȘtre utile, il est important de s'assurer qu'elles ne se contredisent pas.
Conclusion
Si vous avez suivi les instructions et utilisĂ© la mĂȘme image Docker, votre service devrait renvoyer cette page.

- Nous avons créé un modÚle selon lequel toutes les machines dans le service sont lancées. Nous avons également appris à mettre à jour les machines lors de la modification du modÚle.
- Nous avons configurĂ© le traitement du signal d'arrĂȘt d'une instance spot, donc dans la minute suivant sa rĂ©ception, toutes les tĂąches en cours sont supprimĂ©es de la machine, ainsi rien n'est perdu et aucune interruption ne se produit.
- Nous avons mis en place un équilibreur pour répartir uniformément la charge entre les machines.
- Nous avons créé un service qui fonctionne sur des instances spot, ce qui réduit les coûts des machines d'environ 3 fois.
- Nous avons configuré l'auto-scaling dans les deux sens, afin de gérer l'augmentation des charges, tout en évitant de payer pour des temps d'inactivité.
- Nous utilisons le Capacity Provider pour que l'application gĂšre l'infrastructure (machines), et non l'inverse.
- Nous avons bien travaillé.
Si vous avez des pics de charge prévisibles, par exemple, si vous faites de la publicité dans une grande campagne email, vous pouvez configurer la mise à l'échelle selon .
Il est Ă©galement possible de faire de la mise Ă l'Ă©chelle basĂ©e sur des donnĂ©es provenant de diffĂ©rentes parties de votre systĂšme. Par exemple, nous avons une fonctionnalitĂ© aux utilisateurs de l'application mobile. Parfois, une campagne est envoyĂ©e Ă plus de 1 million de personnes. AprĂšs un tel envoi, nous constatons toujours une forte augmentation des requĂȘtes Ă l'API, car de nombreux utilisateurs se connectent simultanĂ©ment Ă l'application. Donc, si nous voyons que la file d'attente pour l'envoi de notifications promotionnelles a augmentĂ© de maniĂšre significative par rapport aux indicateurs standards, nous pouvons immĂ©diatement lancer plusieurs machines supplĂ©mentaires et tĂąches pour ĂȘtre prĂȘts Ă faire face Ă la charge.
Je serais ravi si vous partagiez dans les commentaires des cas intéressants d'utilisation des instances spot et de l'ECS, ou des éléments sur le dimensionnement.
BientÎt, nous publierons des articles sur comment nous traitons des milliers d'événements analytiques par seconde sur une architecture majoritairement serverless (avec des fonds) et sur la maniÚre dont nous déployons des services à l'aide de GitLab CI et Terraform Cloud.
Suivez-nous, ce sera intéressant !
Seuls les utilisateurs enregistrés peuvent participer au sondage. , s'il vous plaßt.
Utilisez-vous des instances spot en production ?
22,2%Oui6
66,7%Non18
11,1%J'ai entendu parler d'eux à travers un article, je prévois de les utiliser3
27 utilisateurs ont voté. 5 utilisateurs se sont abstenus.
Source : habr.com
