{"id":87393,"date":"2020-07-08T01:42:02","date_gmt":"2020-07-07T23:42:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws"},"modified":"2020-07-08T01:42:02","modified_gmt":"2020-07-07T23:42:02","slug":"sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","title":{"rendered":"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo zusammen! Ich bin Kirill, CTO bei Adapty. Der Gro\u00dfteil unserer Architektur l\u00e4uft auf AWS, und heute werde ich erl\u00e4utern, wie wir unsere Serverkosten um das Dreifache gesenkt haben, indem wir Spot-Instanzen in unserer Produktionsumgebung verwendet haben, sowie wie man ihre automatische Skalierung einrichtet. Zuerst gibt es einen \u00dcberblick, wie das funktioniert, gefolgt von einer detaillierten Anleitung zum Start.<\/p>\n<p><\/p>\n<h2 id=\"chto-takoe-spotovye-instansy\">Was sind Spot-Instanzen?<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/ec2\/spot\/\">Spot-<\/a><\/noindex> Instanzen sind Server anderer AWS-Nutzer, die derzeit ungenutzt sind und diese zu einem gro\u00dfen Rabatt verkaufen (Amazon gibt bis zu 90% an, nach unserer Erfahrung etwa 3x, variiert je nach Region, AZ und Instanztyp). Das Hauptunterscheidungsmerkmal zu regul\u00e4ren Instanzen ist, dass sie jederzeit abgeschaltet werden k\u00f6nnen. Daher dachten wir lange, dass es in Ordnung sei, sie f\u00fcr Entwicklungsumgebungen oder f\u00fcr Berechnungsaufgaben zu verwenden, wobei die Zwischenergebnisse in S3 oder einer Datenbank gespeichert werden, aber nicht f\u00fcr Produktionen. Es gibt Drittanbieter-L\u00f6sungen, die die Verwendung von Spot-Instanzen in Produktionen erm\u00f6glichen, aber in unserem Fall gibt es viele Probleme mit diesen, weshalb wir sie nicht implementiert haben. Der in diesem Artikel beschriebene Ansatz funktioniert vollst\u00e4ndig innerhalb der Standardfunktionalit\u00e4t von AWS, ohne zus\u00e4tzliche Skripte, Cronjobs usw.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Im Folgenden werde ich einige Screenshots zeigen, die die Preisentwicklung von Spot-Instanzen verdeutlichen.<\/p>\n<p><\/p>\n<p>m5.large in der Region eu-west-1 (Irland). Der Preis ist \u00fcber einen Zeitraum von 3 Monaten \u00fcberwiegend stabil, derzeit liegt die Einsparung bei 2,9x.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/901a259955c386493557280489f582fe.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>m5.large in der Region us-east-1 (N. Virginia). Der Preis \u00e4ndert sich st\u00e4ndig \u00fcber einen Zeitraum von 3 Monaten, gegenw\u00e4rtig liegt die Einsparung zwischen 2,3x und 2,8x, je nach Verf\u00fcgbarkeitszone.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/49c89430f03b2c7025355562d2873b6b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>t3.small in der Region us-east-1 (N. Virginia). Der Preis ist \u00fcber einen Zeitraum von 3 Monaten stabil, aktuell liegt die Einsparung bei 3,4x.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/2e139dcc6d44bd37caf9d75eb6ec4835.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"arhitektura-servisa\">Architektur des Dienstes<\/h2>\n<p><\/p>\n<p>Die Grundarchitektur des Dienstes, \u00fcber den wir in diesem Artikel sprechen werden, ist im folgenden Diagramm dargestellt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/d89bd595675400861360670adaacaf03.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"application-load-balancer--ec2-target-group--elastic-container-service\">Application Load Balancer \u2192 EC2 Target Group \u2192 Elastic Container Service<\/h3>\n<p><\/p>\n<p>Als Lastverteilung wird der Application Load Balancer (ALB) verwendet, der Anfragen an die EC2 Target Group (TG) weiterleitet. Die TG sorgt daf\u00fcr, dass die Ports auf den Instanzen f\u00fcr den ALB ge\u00f6ffnet werden und sie mit den Ports der Container des Elastic Container Service (ECS) verbunden sind. ECS ist das Pendant zu Kubernetes in AWS, das das Management von Docker-Containern \u00fcbernimmt.<\/p>\n<p><\/p>\n<p>Auf einer Instanz k\u00f6nnen mehrere Container mit denselben Ports ausgef\u00fchrt werden, weshalb wir diese nicht festlegen k\u00f6nnen. ECS teilt TG mit, dass es eine neue Aufgabe startet (in der Terminologie von Kubernetes wird dies als Pod bezeichnet), TG pr\u00fcft die verf\u00fcgbaren Ports auf der Instanz und weist einen davon f\u00fcr die gestartete Aufgabe zu. Au\u00dferdem \u00fcberpr\u00fcft TG regelm\u00e4\u00dfig, ob die Instanz und die API darauf funktionieren, indem es Health Checks durchf\u00fchrt, und wenn es Probleme feststellt, h\u00f6rt es auf, Anfragen dorthin zu senden.<\/p>\n<p><\/p>\n<h3 id=\"ec2-auto-scaling-groups--ecs-capacity-providers\">EC2 Auto Scaling Groups + ECS Capacity Providers<\/h3>\n<p><\/p>\n<p>In dem obigen Diagramm wurde der Dienst EC2 Auto Scaling Groups (ASG) nicht dargestellt. Aus dem Namen kann man entnehmen, dass er f\u00fcr das Skalieren der Instanzen verantwortlich ist. Bis vor kurzem gab es in AWS keine integrierte M\u00f6glichkeit, die Anzahl der von ECS gestarteten Maschinen zu verwalten. ECS erlaubte es, die Anzahl der Aufgaben basierend auf der CPU-Nutzung, RAM oder der Anzahl der Anfragen zu skalieren. Wenn jedoch alle freien Instanzen von Aufgaben belegt waren, wurden keine neuen Maschinen automatisch gestartet.<\/p>\n<p><\/p>\n<p>Das hat sich mit der Einf\u00fchrung von ECS Capacity Providers (ECS CP) ge\u00e4ndert. Jetzt kann jeder Dienst in ECS mit ASG verbunden werden, und wenn die Aufgaben nicht auf den laufenden Instanzen Platz finden, werden neue gestartet (aber innerhalb der festgelegten ASG-Grenzen). Das funktioniert auch umgekehrt: Wenn ECS CP ungenutzte Instanzen ohne Aufgaben sieht, gibt es ASG den Befehl, diese abzuschalten. ECS CP hat die M\u00f6glichkeit, einen Zielauslastungsprozentsatz f\u00fcr die Instanzen anzugeben, damit immer eine bestimmte Anzahl von Maschinen frei bleibt, um die Aufgaben schnell zu skalieren, mehr dazu sp\u00e4ter.<\/p>\n<p><\/p>\n<h3 id=\"ec2-launch-templates\">EC2 Launch Templates<\/h3>\n<p><\/p>\n<p>Der letzte Dienst, \u00fcber den ich sprechen werde, bevor ich in die detaillierte Beschreibung der Erstellung dieser Infrastruktur \u00fcbergehe, sind EC2 Launch Templates. Sie erm\u00f6glichen es, eine Vorlage zu erstellen, nach der alle Maschinen gestartet werden, um dies nicht jedes Mal von Grund auf neu zu tun. Hier kann man den Typ der zu startenden Maschine, die Sicherheitsgruppe, das Disk-Image und viele andere Parameter ausw\u00e4hlen. Au\u00dferdem kann man benutzerdefinierte Daten angeben, die auf alle gestarteten Instanzen \u00fcbertragen werden. In den benutzerdefinierten Daten k\u00f6nnen Skripte ausgef\u00fchrt werden, beispielsweise kann der Inhalt einer Datei bearbeitet werden. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-agent-config.html\">Konfiguration des ECS-Agenten<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Einer der wichtigsten Parameter in diesem Artikel ist die Konfiguration \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/container-instance-spot.html\">ECS_ENABLE_SPOT_INSTANCE_DRAINING<\/a><\/noindex>=true. Wenn diese Option aktiviert ist, wechselt ECS, sobald es ein Signal erh\u00e4lt, dass der Spot-Instance zur\u00fcckgenommen wird, alle Aufgaben, die darauf ausgef\u00fchrt werden, in den Status Draining. Es werden keine neuen Aufgaben auf diese Instanz zugewiesen, und wenn Aufgaben derzeit darauf ausgef\u00fchrt werden sollen, werden sie abgebrochen. Anfragen vom Load Balancer kommen ebenfalls nicht mehr an. Die Benachrichtigung \u00fcber das Entfernen der Instanz erfolgt 2 Minuten vor dem tats\u00e4chlichen Ereignis. Wenn Ihr Dienst also keine Aufgaben l\u00e4nger als 2 Minuten ausf\u00fchrt und nichts auf der Festplatte speichert, k\u00f6nnen Sie Spot-Instanzen ohne Datenverlust nutzen.<\/p>\n<p><\/p>\n<p>Bez\u00fcglich der Festplatte \u2013 AWS hat k\u00fcrzlich <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2020\/04\/amazon-ecs-aws-fargate-support-amazon-efs-filesystems-generally-available\/#:~:text=To%20use%20EFS%20with%20ECS,or%20TLS%20encryption%20in%20transit.\">erm\u00f6glicht<\/a><\/noindex> die Verwendung des Elastic File System (EFS) zusammen mit ECS. Mit diesem Schema ist selbst die Festplatte kein Hindernis, aber wir haben das nicht ausprobiert, da wir im Grunde keine Festplatte zur Speicherung des Status ben\u00f6tigen. Standardm\u00e4\u00dfig werden nach Erhalt von SIGINT (das zum Zeitpunkt des Wechsels der Aufgabe in den Status Draining gesendet wird) alle aktiven Aufgaben nach 30 Sekunden gestoppt, selbst wenn sie nicht abgeschlossen sind. Diese Zeit kann mit dem Parameter <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-agent-config.html\">ECS_CONTAINER_STOP_TIMEOUT<\/a><\/noindex>ge\u00e4ndert werden. Wichtig ist, ihn nicht auf mehr als 2 Minuten f\u00fcr Spot-Maschinen zu setzen.<\/p>\n<p><\/p>\n<h2 id=\"sozdanie-servisa\">Erstellung des Dienstes<\/h2>\n<p><\/p>\n<p>Wir gehen jetzt direkt zur Erstellung des beschriebenen Dienstes \u00fcber. Dabei werde ich einige n\u00fctzliche Punkte beschreiben, die oben nicht erw\u00e4hnt wurden. Insgesamt handelt es sich um eine Schritt-f\u00fcr-Schritt-Anleitung, aber ich werde sehr grundlegende oder sehr spezifische F\u00e4lle nicht behandeln. Alle Aktionen werden \u00fcber die visuelle AWS-Konsole ausgef\u00fchrt, k\u00f6nnen aber auch programmgesteuert mit CloudFormation oder Terraform reproduziert werden. Bei Adapty verwenden wir Terraform.<\/p>\n<p><\/p>\n<h3 id=\"ec2-launch-template\"><strong>EC2 Launch Template<\/strong><\/h3>\n<p><\/p>\n<p>In diesem Dienst wird eine Konfiguration f\u00fcr die Maschinen erstellt, die verwendet werden. Die Verwaltung der Vorlagen erfolgt im Abschnitt EC2 -&gt; Instances -&gt; Launch templates.<\/p>\n<p><\/p>\n<p><strong>Amazon Machine Image (AMI)<\/strong> \u2013 wir geben das Disk-Image an, mit dem alle Instanzen gestartet werden. F\u00fcr ECS sollte in den meisten F\u00e4llen das von Amazon optimierte Image verwendet werden. Es wird regelm\u00e4\u00dfig aktualisiert und enth\u00e4lt alles, was f\u00fcr den Betrieb von ECS erforderlich ist. Um die aktuelle ID des Images zu erfahren, gehen wir auf die Seite <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-optimized_AMI.html\">Amazon ECS-optimized AMIs<\/a><\/noindex>, w\u00e4hlen die verwendete Region aus und kopieren die AMI-ID daf\u00fcr. Zum Beispiel, f\u00fcr die Region us-east-1 ist zu dem Zeitpunkt, zu dem dieser Artikel geschrieben wurde, die aktuelle ID \u2013 <em>ami-00c7c1cf5bdc913ed<\/em>. Diese ID muss in den Punkt Specify a custom value eingef\u00fcgt werden.<\/p>\n<p><\/p>\n<p><strong>Instanztyp<\/strong> \u2014 der Typ der Instanz wird angegeben. W\u00e4hlen Sie den, der am besten zu Ihrer Aufgabe passt.<\/p>\n<p><\/p>\n<p><strong>Schl\u00fcsselpaar (Login)<\/strong> \u2014 das Zertifikat, mit dem eine Verbindung zur Instanz \u00fcber SSH hergestellt werden kann, falls erforderlich.<\/p>\n<p><\/p>\n<p><strong>Netzwerkeinstellungen<\/strong> \u2014 die Netzparameter werden angegeben. <strong>Netzwerktechnologie<\/strong> in den meisten F\u00e4llen sollte es sich um ein Virtual Private Cloud (VPC) handeln. <strong>Sicherheitsgruppen<\/strong> \u2014 Sicherheitsgruppen f\u00fcr Ihre Instanzen. Da wir einen Load Balancer vor den Instanzen verwenden werden, empfehle ich, hier eine Gruppe anzugeben, die eingehende Verbindungen nur vom Load Balancer zul\u00e4sst. Das bedeutet, dass Sie 2 Sicherheitsgruppen haben werden: eine f\u00fcr den Load Balancer, die eingehende (Inbound) Verbindungen von \u00fcberall \u00fcber die Ports 80 (http) und 443 (https) erlaubt, und eine zweite f\u00fcr die Maschinen, die eingehende Verbindungen \u00fcber alle Ports von der Gruppe des Load Balancers erlaubt. Ausgehende (Outbound) Verbindungen in beiden Gruppen m\u00fcssen \u00fcber das TCP-Protokoll auf alle Ports zu allen Adressen ge\u00f6ffnet sein. Es ist m\u00f6glich, die Ports und Adressen f\u00fcr ausgehende Verbindungen einzuschr\u00e4nken, aber dann m\u00fcssen Sie st\u00e4ndig \u00fcberwachen, dass Sie nicht versuchen, auf einen geschlossenen Port zuzugreifen.<\/p>\n<p><\/p>\n<p><strong>Speicher (Volumen)<\/strong> \u2014 die Plattenparameter f\u00fcr die Maschinen werden angegeben. Der Plattenumfang darf nicht kleiner sein als der, der in der AMI angegeben ist, f\u00fcr ECS-Optimierte \u2014 30 GiB.<\/p>\n<p><\/p>\n<p><strong>Erweiterte Details<\/strong> \u2014 zus\u00e4tzliche Parameter werden angegeben.<\/p>\n<p><\/p>\n<p><strong>Kaufoption<\/strong> \u2014 ob wir Spot-Instanzen kaufen m\u00f6chten. Wir m\u00f6chten das, aber hier werden wir dieses Kontrollk\u00e4stchen nicht aktivieren, wir konfigurieren es in der Auto Scaling Group, dort gibt es mehr Optionen.<\/p>\n<p><\/p>\n<p><strong>IAM-Instanzprofil<\/strong> \u2014 die Rolle angeben, mit der die Instanzen gestartet werden. Damit die Instanzen in ECS funktionieren, ben\u00f6tigen sie Rechte, die normalerweise in der Rolle <em>ecsInstanceRole<\/em>liegen. In einigen F\u00e4llen kann sie erstellt werden, falls sie nicht existiert, dann hier <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/instance_IAM_role.html\">Anleitung<\/a><\/noindex> finden Sie Informationen, wie das geht. Nach der Erstellung geben wir sie im Template an.<br \/>\nDanach folgen viele Parameter, die in der Regel auf den Standardwerten belassen werden k\u00f6nnen, aber jeder von ihnen hat eine verst\u00e4ndliche Beschreibung. Ich aktiviere immer die Parameter EBS-optimierte Instanz und T2\/T3 Unlimited, wenn verwendet werden. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSEC2\/latest\/UserGuide\/burstable-performance-instances.html\">burstable<\/a><\/noindex> Instanzen.<\/p>\n<p><\/p>\n<p><strong>Benutzerdaten<\/strong> \u2014 die Benutzerdaten werden angegeben. Wir werden die Datei <code>\/etc\/ecs\/ecs.config<\/code>bearbeiten, in der die Konfiguration des ECS-Agenten gespeichert ist.<br \/>\nEin Beispiel, wie die Benutzerdaten aussehen k\u00f6nnen:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">#!\/bin\/bash\necho ECS_CLUSTER=DemoApiClusterProd &gt;&gt; \/etc\/ecs\/ecs.config\necho ECS_ENABLE_SPOT_INSTANCE_DRAINING=true &gt;&gt; \/etc\/ecs\/ecs.config\necho ECS_CONTAINER_STOP_TIMEOUT=1m &gt;&gt; \/etc\/ecs\/ecs.config\necho ECS_ENGINE_AUTH_TYPE=docker &gt;&gt; \/etc\/ecs\/ecs.config\necho &quot;ECS_ENGINE_AUTH_DATA={&quot;registry.gitlab.com&quot;:{&quot;username&quot;:&quot;username&quot;,&quot;password&quot;:&quot;password&quot;}}&quot; &gt;&gt; \/etc\/ecs\/ecs.config<\/code><\/pre>\n<p><\/p>\n<p><code>ECS_CLUSTER=DemoApiClusterProd<\/code> \u2014 Der Parameter gibt an, dass die Instanz zu einem Cluster mit dem angegebenen Namen geh\u00f6rt, d.h. dieses Cluster kann seine Aufgaben auf diesem Server hosten. Wir haben bisher noch keinen Cluster erstellt, werden jedoch beim Erstellen diesen Namen verwenden.<\/p>\n<p><\/p>\n<p><code>ECS_ENABLE_SPOT_INSTANCE_DRAINING=true<\/code> \u2014 Der Parameter gibt an, dass alle Aufgaben auf der Spot-Instanz beim Empfang des Abschaltsignals in den Status Draining versetzt werden sollen.<\/p>\n<p><\/p>\n<p><code>ECS_CONTAINER_STOP_TIMEOUT=1m<\/code> \u2014 Der Parameter gibt an, dass nach Empfang des SIGINT-Signals alle Aufgaben 1 Minute Zeit haben, bevor sie beendet werden.<\/p>\n<p><\/p>\n<p><code>ECS_ENGINE_AUTH_TYPE=docker<\/code> \u2014 Der Parameter gibt an, dass das Docker-Schema als Authentifizierungsmechanismus verwendet wird.<\/p>\n<p><\/p>\n<p><code>ECS_ENGINE_AUTH_DATA=...<\/code> \u2014 Verbindungseinstellungen zu einem privaten Container-Registry, in dem Ihre Docker-Images gespeichert werden. Wenn es \u00f6ffentlich ist, m\u00fcssen keine Angaben gemacht werden.<\/p>\n<p><\/p>\n<p>Im Rahmen dieses Artikels werde ich ein \u00f6ffentliches Bild aus dem Docker Hub verwenden, daher sind keine Angaben n\u00f6tig. <code>ECS_ENGINE_AUTH_TYPE<\/code> und <code>ECS_ENGINE_AUTH_DATA<\/code> sind nicht erforderlich.<\/p>\n<p><\/p>\n<p><strong>N\u00fctzliche Informationen<\/strong>: Es wird empfohlen, AMIs regelm\u00e4\u00dfig zu aktualisieren, da neue Versionen Docker, Linux, ECS-Agenten usw. aktualisieren. Um dies nicht zu vergessen, k\u00f6nnen Sie <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ECS-AMI-SubscribeTopic.html\">Benachrichtigungen einstellen<\/a><\/noindex> \u00fcber neue Versionen. Sie k\u00f6nnen Benachrichtigungen per E-Mail erhalten und manuell aktualisieren oder eine Lambda-Funktion schreiben, die automatisch eine neue Version des Launch Templates mit dem aktualisierten AMI erstellt.<\/p>\n<p><\/p>\n<h3 id=\"ec2-auto-scaling-group\"><strong>EC2 Auto Scaling Gruppe<\/strong><\/h3>\n<p><\/p>\n<p>Die Auto Scaling Gruppe ist verantwortlich f\u00fcr das Starten und Skalieren von Instanzen. Die Verwaltung der Gruppen erfolgt im Bereich EC2 -&gt; Auto Scaling -&gt; Auto Scaling Gruppen.<\/p>\n<p><\/p>\n<p><strong>Launch-Vorlage<\/strong> \u2014 W\u00e4hlen Sie die im vorherigen Schritt erstellte Vorlage aus. Die Version bleibt auf der Standard-Einstellung.<\/p>\n<p><\/p>\n<p><strong>Kaufoptionen und Instanztypen<\/strong> \u2014 Geben Sie die Instanztypen f\u00fcr das Cluster an. Adhere to launch template verwendet den Instanztyp aus der Launch-Vorlage. Combine purchase options and instance types erm\u00f6glicht eine flexible Konfiguration der Instanztypen. Wir werden dies verwenden.<\/p>\n<p><\/p>\n<p><strong>Optionale On-Demand-Basis<\/strong> \u2014 Die Anzahl der normalen, nicht-Spot-Instanzen, die immer laufen werden.<\/p>\n<p><\/p>\n<p><strong>On-Demand-Prozentsatz \u00fcber der Basis<\/strong> \u2014 Das prozentuale Verh\u00e4ltnis von normalen und Spot-Instanzen; 50-50 wird gleichm\u00e4\u00dfig verteilen, 20-80 bedeutet, dass auf jede normale Instanz 4 Spot-Instanzen hochgefahren werden. Im Rahmen dieses Beispiels werde ich 50-50 angeben, aber in der Realit\u00e4t machen wir h\u00e4ufig 20-80, in einigen F\u00e4llen 0-100.<\/p>\n<p><\/p>\n<p><strong>Instanztypen<\/strong> \u2014 hier k\u00f6nnen zus\u00e4tzliche Instanztypen angegeben werden, die im Cluster verwendet werden. Wir haben das nie genutzt, weil ich den Sinn dieser Geschichte nicht ganz verstehe. Vielleicht liegt es an den Limits f\u00fcr bestimmte Instanztypen, aber diese lassen sich leicht \u00fcber den Support erh\u00f6hen. Wenn Sie eine Anwendung kennen, w\u00fcrde ich mich freuen, in den Kommentaren dar\u00fcber zu lesen)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c1ee742d2059674f39a53cac6b9f2347.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Netzwerk<\/strong> \u2014 Netzwerkeinstellungen, Sie w\u00e4hlen VPC und Subnetze f\u00fcr die Maschinen aus, in den meisten F\u00e4llen sollten alle verf\u00fcgbaren Subnetze ausgew\u00e4hlt werden.<\/p>\n<p><\/p>\n<p><strong>Lastverteilung<\/strong> \u2014 Einstellungen f\u00fcr den Load Balancer, aber das werden wir separat machen, hier r\u00fchren wir nichts an. <strong>Health Checks<\/strong> werden ebenfalls sp\u00e4ter eingerichtet.<\/p>\n<p><\/p>\n<p><strong>Gruppengr\u00f6\u00dfe<\/strong> \u2014 wir geben die Limits f\u00fcr die Anzahl der Maschinen im Cluster und die gew\u00fcnschte Anzahl der Maschinen beim Start an. Die Anzahl der Maschinen im Cluster wird nie kleiner sein als die minimal angegebene und nie gr\u00f6\u00dfer als die maximale, selbst wenn das Scaling nach Metriken erfolgen sollte.<\/p>\n<p><\/p>\n<p><strong>Scaling-Richtlinien<\/strong> \u2014 Skalierungseinstellungen, aber wir werden die Skalierung basierend auf den laufenden ECS-Tasks vornehmen, daher werden wir die Skalierung sp\u00e4ter einstellen.<\/p>\n<p><\/p>\n<p><strong>Instanz-Skalierungsschutz<\/strong> \u2014 Schutz von Instanzen vor L\u00f6schung beim Downscaling. Wir aktivieren dies, damit ASG die Maschine, auf der aktive Tasks laufen, nicht l\u00f6scht. Der Schutz wird f\u00fcr Instanzen ohne Tasks von der ECS Capacity Provider deaktiviert.<\/p>\n<p><\/p>\n<p><strong>Tags hinzuf\u00fcgen<\/strong> \u2014 Sie k\u00f6nnen Tags f\u00fcr Instanzen angeben (daf\u00fcr muss das Kontrollk\u00e4stchen 'Neue Instanzen taggen' aktiviert sein). Ich empfehle, das Tag 'Name' anzugeben, sodass alle Instanzen, die innerhalb der Gruppe gestartet werden, denselben Namen haben, was die Anzeige in der Konsole erleichtert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/61fa0ccb38c11f61431db0938140efb7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nach der Erstellung der Gruppe \u00f6ffnen Sie diese und gehen Sie zu den erweiterten Konfigurationen, warum bei der Erstellung in der Konsole nicht alle Optionen sichtbar sind.<\/p>\n<p><\/p>\n<p><strong>Beendigungsrichtlinien<\/strong> \u2014 Regeln, die beim L\u00f6schen von Instanzen ber\u00fccksichtigt werden. Sie werden in der Reihenfolge angewendet. Wir verwenden normalerweise solche wie auf dem Bild unten. Zuerst werden die Instanzen mit dem \u00e4ltesten Launch Template gel\u00f6scht (zum Beispiel, wenn wir das AMI aktualisiert haben, wurde eine neue Version erstellt, aber alle Instanzen wurden rechtzeitig darauf umgestellt). Dann werden die Instanzen ausgew\u00e4hlt, die dem n\u00e4chsten Abrechnungszeitpunkt am n\u00e4chsten sind. Und weiter werden die \u00e4ltesten nach dem Startdatum ausgew\u00e4hlt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/8236624fe08a03f36aedc7665e18b060.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>N\u00fctzliche Informationen<\/strong>: um alle Maschinen im Cluster zu aktualisieren, ist es sinnvoll, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/autoscaling\/ec2\/userguide\/asg-instance-refresh.html\">Instanz-Refresh<\/a><\/noindex>. Wenn Sie dies mit der Lambda-Funktion aus dem vorherigen Schritt kombinieren, erhalten Sie ein vollst\u00e4ndig automatisiertes Update-System f\u00fcr Instanzen. Vor der Aktualisierung aller Maschinen m\u00fcssen Sie den Schutz vor dem Skalieren von Instanzen f\u00fcr alle Instanzen in der Gruppe deaktivieren. Dies bezieht sich auf den Schutz der Maschinen selbst, diesen Schritt f\u00fchren Sie im Tab f\u00fcr das Instantenmanagement durch.<\/p>\n<p><\/p>\n<h3 id=\"application-load-balancer-i-ec2-target-group\">Application Load Balancer und EC2 Zielgruppe<\/h3>\n<p><\/p>\n<p>Der Lastenausgleich wird im Bereich EC2 \u2192 Load Balancing \u2192 Load Balancers erstellt. Wir werden den Application Load Balancer verwenden. Einen Vergleich verschiedener Arten von Lastenausgleich finden Sie auf <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/elasticloadbalancing\/features\/#compare\">der Service-Seite<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Listener<\/strong> \u2014 es macht Sinn, die Ports 80 und 443 zu erstellen und eine Weiterleitung von 80 nach 443 mit sp\u00e4teren Regeln des Lastenausgleichs einzurichten.<\/p>\n<p><\/p>\n<p><strong>Verf\u00fcgbarkeitszonen<\/strong> \u2014 in den meisten F\u00e4llen w\u00e4hlen wir alle Verf\u00fcgbarkeitszonen aus.<\/p>\n<p><\/p>\n<p><strong>Sicherheitseinstellungen konfigurieren<\/strong> \u2014 hier wird das SSL-Zertifikat f\u00fcr den Lastenausgleich angegeben, die bequemste Option ist es, ein Zertifikat <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/acm\/latest\/userguide\/gs-acm-request-public.html\">in ACM zu erstellen. Um die Unterschiede zu<\/a><\/noindex> der Sicherheitsrichtlinie <strong>k\u00f6nnen Sie auf<\/strong> lesen, Sie k\u00f6nnen die standardm\u00e4\u00dfig ausgew\u00e4hlte Option belassen, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/elasticloadbalancing\/latest\/classic\/elb-security-policy-table.html\">Dokumentation<\/a><\/noindex>ELBSecurityPolicy-2016-08 <code>. Nach der Erstellung des Lastenausgleichs sehen Sie dessen<\/code>DNS-Namen <strong>, f\u00fcr den Sie einen CNAME f\u00fcr Ihre Domain einrichten m\u00fcssen. So sieht es beispielsweise in Cloudflare aus.<\/strong>\u2014 erstellen oder w\u00e4hlen Sie eine Sicherheitsgruppe f\u00fcr den Lastenausgleich, weitere Einzelheiten dazu finden Sie etwas weiter oben im Abschnitt EC2 Launch Template \u2192 Netzwerkeinstellungen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/899ff0f30df4117fc0ccd91af135def3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Security Group<\/strong> Zielgruppe<\/p>\n<p><\/p>\n<p><strong>\u2014 erstellen Sie eine Gruppe, die f\u00fcr das Routing von Anfragen vom Lastenausgleich zu den Maschinen verantwortlich ist und deren Verf\u00fcgbarkeit \u00fcberpr\u00fcft, um sie bei Problemen zu ersetzen.<\/strong> Typ der Zielgruppe <strong>muss Instance sein,<\/strong> beliebig, wenn Sie HTTPS f\u00fcr die Kommunikation zwischen dem Lastenausgleich und den Instanzen verwenden, m\u00fcssen Sie das Zertifikat auf diesen hochladen. In diesem Beispiel werden wir dies nicht tun, sondern einfach Port 80 belassen. <strong>Protokoll<\/strong> und <strong>Port<\/strong> \u2014 Parameter zur \u00dcberpr\u00fcfung der Dienstverf\u00fcgbarkeit. In einem echten Dienst sollte dies eine separate Anfrage sein, die wichtige Teile der Gesch\u00e4ftsanwendung implementiert. In diesem Beispiel lasse ich die Standardeinstellungen. Danach k\u00f6nnen Sie das Anfragenintervall, die Zeit\u00fcberschreitung, die Codes f\u00fcr erfolgreiche Antworten usw. ausw\u00e4hlen. In unserem Beispiel geben wir die Erfolgs-Codes 200-399 an, da das Docker-Image, das verwendet wird, den Code 304 zur\u00fcckgibt.<\/p>\n<p><\/p>\n<p><strong>Health Checks<\/strong> Ziele registrieren<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/e295ab1c3bf1dfe13c76b4942a31c7ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>\u2014 hier w\u00e4hlen Sie die Maschinen f\u00fcr die Gruppe aus, aber in unserem Fall wird dies von ECS erledigt, daher \u00fcberspringen wir diesen Schritt einfach.<\/strong> : auf Ebene des Lastenausgleichs k\u00f6nnen Sie Protokolle aktivieren, die in S3 an einem bestimmten Ort gespeichert werden.<\/p>\n<p><\/p>\n<p><strong>N\u00fctzliche Informationen<\/strong>Auf der Ebene des Load Balancers k\u00f6nnen Protokolle aktiviert werden, die in S3 gespeichert werden. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/elasticloadbalancing\/latest\/application\/load-balancer-access-logs.html\">im SVG-Konturformat festgelegt wird.<\/a><\/noindex>. Von dort aus k\u00f6nnen sie in externe Dienstleistungen f\u00fcr Analysen exportiert werden, oder man kann SQL-Abfragen direkt auf die Daten in S3 mit <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/athena\/latest\/ug\/application-load-balancer-logs.html\">Athena<\/a><\/noindex>. Das ist praktisch und funktioniert ohne zus\u00e4tzlichen Code. Ich empfehle au\u00dferdem, die Protokolldaten aus dem S3-Bucket nach Ablauf eines bestimmten Zeitraums zu l\u00f6schen.<\/p>\n<p><\/p>\n<h3 id=\"ecs-task-definition\">ECS Task Definition<\/h3>\n<p><\/p>\n<p>In den vorherigen Schritten haben wir alles in Bezug auf die Infrastruktur des Dienstes erstellt, nun kommen wir zur Beschreibung der Container, die wir starten werden. Dies erfolgt im Abschnitt ECS \u2192 Task Definitions.<\/p>\n<p><\/p>\n<p><strong>Kompatibilit\u00e4tstyp des Startvorgangs<\/strong> \u2014 w\u00e4hlen Sie EC2.<\/p>\n<p><\/p>\n<p><strong>IAM-Rolle f\u00fcr die Taskausf\u00fchrung<\/strong> \u2014 w\u00e4hlen Sie <code>ecsTaskExecutionRole<\/code>. Mit ihr werden Protokolle geschrieben, der Zugang zu geheimen Variablen gew\u00e4hrt usw.<\/p>\n<p><\/p>\n<p>Im Abschnitt Container Definitions klicken wir auf Add Container.<\/p>\n<p><\/p>\n<p><strong>Bild<\/strong> \u2014 Link zum Image mit dem Code des Projekts, in diesem Beispiel werde ich ein \u00f6ffentliches Image von Docker Hub verwenden <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/bitnami\/node-example\">bitnami\/node-example:0.0.1<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Speicherlimits<\/strong> \u2014 Limits f\u00fcr den Speicher des Containers. <strong>Harter Limit<\/strong> \u2014 harter Limit, wenn der Container den angegebenen Wert \u00fcberschreitet, wird der Befehl docker kill ausgef\u00fchrt, der Container stirbt sofort. <strong>Weicher Limit<\/strong> \u2014 weicher Limit, der Container kann den angegebenen Wert \u00fcberschreiten, aber bei der Platzierung von Tasks auf den Maschinen wird dieser Parameter ber\u00fccksichtigt. Wenn beispielsweise auf der Maschine 4 GiB RAM vorhanden sind und das weiche Limit des Containers 2048 MiB betr\u00e4gt, k\u00f6nnen auf dieser Maschine maximal 2 Tasks mit diesem Container gestartet werden. Tats\u00e4chlich sind 4 GiB RAM etwas weniger als 4096 MiB, das kann man auf der Registerkarte ECS Instances im Cluster sehen. Das weiche Limit darf nicht gr\u00f6\u00dfer sein als das harte Limit. Wichtig zu verstehen ist, dass, wenn in einem Task mehrere Container vorhanden sind, deren Limits addiert werden.<\/p>\n<p><\/p>\n<p><strong>Portzuordnungen<\/strong> \u2014 bei <strong>Host-Port<\/strong> geben wir 0 an, das bedeutet, dass der Port dynamisch zugewiesen wird, er wird von der Target Group \u00fcberwacht. <strong>Container-Port<\/strong> \u2014 der Port, an dem Ihre Anwendung l\u00e4uft, wird oft im Ausf\u00fchrungsbefehl festgelegt oder im Code Ihrer Anwendung, Dockerfile usw. zugewiesen. F\u00fcr unser Beispiel verwenden wir 3000, weil er in der <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bitnami\/bitnami-docker-node\/blob\/master\/example\/Dockerfile\">Dockerfile<\/a><\/noindex> verwendeten Abbildung angegeben ist.<\/p>\n<p><\/p>\n<p><strong>Health Check<\/strong> \u2014 Parameter zur \u00dcberpr\u00fcfung der Funktionsf\u00e4higkeit des Containers, nicht zu verwechseln mit dem, der in der Target Group konfiguriert ist.<\/p>\n<p><\/p>\n<p><strong>Umgebung<\/strong> \u2014 Umgebungsparameter. <strong>CPU-Einheiten<\/strong> \u2014 sieht \u00e4hnlich aus wie Memory-Limits, nur f\u00fcr die CPU. Jedes CPU-Kern entspricht 1024 Einheiten, daher k\u00f6nnen bei einem Server mit einer dual-core CPU und einem Wert von 512 f\u00fcr den Container insgesamt 4 Aufgaben mit diesem Container gestartet werden. CPU-Einheiten sind immer an die Anzahl der Kerne gebunden, es kann nicht leicht weniger wie bei dem Speicher sein.<\/p>\n<p><\/p>\n<p><strong>Befehl<\/strong> \u2014 Befehl zum Starten eines Dienstes innerhalb des Containers, alle Parameter werden durch ein Komma angegeben. Dies kann gunicorn, npm usw. sein. Wenn nicht angegeben, wird der Wert der CMD-Direktive aus der Dockerfile verwendet. Wir geben an <code>npm,start<\/code>.<\/p>\n<p><\/p>\n<p><strong>Umgebungsvariablen<\/strong> \u2014 Umgebungsvariablen des Containers. Dies k\u00f6nnen sowohl einfache Textdaten als auch geheime Variablen aus <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/specifying-sensitive-data-secrets.html\">Secrets Manager<\/a><\/noindex> oder <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/specifying-sensitive-data-parameters.html\">Parameter Store<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Speicherung und Protokollierung<\/strong> \u2014 hier konfigurieren wir die Protokollierung in den CloudWatch Logs (AWS-Dienst f\u00fcr Protokolle). Dazu gen\u00fcgt es, das K\u00e4stchen Auto-configure CloudWatch Logs zu aktivieren. Nach dem Erstellen der Task-Definition wird automatisch eine Log-Gruppe in CloudWatch erstellt. Standardm\u00e4\u00dfig werden die Protokolle dort unbegrenzt gespeichert; ich empfehle, den Aufbewahrungszeitraum von Never Expire auf den gew\u00fcnschten Zeitraum zu \u00e4ndern. Dies geschieht in den CloudWatch Log-Gruppen, man muss auf den aktuellen Zeitraum klicken und einen neuen ausw\u00e4hlen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c9ad7ca39dfde9343be89eb9ab1aef10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"ecs-cluster-i-ecs-capacity-provider\">ECS-Cluster und ECS-Kapazit\u00e4tsprovider<\/h3>\n<p><\/p>\n<p>Wir gehen zum Abschnitt ECS \u2192 Clusters, um einen Cluster zu erstellen. Als Vorlage w\u00e4hlen wir EC2 Linux + Networking.<\/p>\n<p><\/p>\n<p><strong>Clustername<\/strong> \u2014 sehr wichtig, hier das gleiche Name wie im Launch Template im Parameter <code>ECS_CLUSTER<\/code>, in unserem Fall \u2014 <code>DemoApiClusterProd<\/code>. Wir aktivieren das K\u00e4stchen Create an empty cluster. Optional kann Container Insights aktiviert werden, um die Metriken der Dienste in CloudWatch zu sehen. Wenn Sie alles richtig gemacht haben, sehen Sie im Abschnitt ECS Instances die Maschinen, die in der Auto Scaling-Gruppe erstellt wurden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/cd70062c9783ae359a2b27cbfc66cbe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wechseln Sie zur Registerkarte <strong>Kapazit\u00e4tsanbieter<\/strong> und wir erstellen einen neuen. Ich erinnere daran, dass dieser ben\u00f6tigt wird, um die Erstellung und das Ausschalten von Maschinen abh\u00e4ngig von der Anzahl der laufenden ECS-Aufgaben zu verwalten. Es ist wichtig zu beachten, dass der Anbieter nur an eine Gruppe gebunden werden kann.<\/p>\n<p><\/p>\n<p><strong>Auto Scaling-Gruppe<\/strong> \u2014 wir w\u00e4hlen die zuvor erstellte Gruppe.<\/p>\n<p><\/p>\n<p><strong>Verwaltetes Scaling<\/strong> \u2014 aktivieren, damit der Anbieter den Dienst skalieren kann.<\/p>\n<p><\/p>\n<p><strong>Zielkapazit\u00e4t %<\/strong> \u2014 welcher Prozentsatz der Maschinenlast durch Aufgaben ben\u00f6tigt wird. Wenn 100% angegeben wird, sind alle Maschinen immer mit laufenden Aufgaben besch\u00e4ftigt. Wenn 50% angegeben wird, sind immer die H\u00e4lfte der Maschinen frei. In diesem Fall werden bei einem pl\u00f6tzlichen Anstieg der Last die neuen Aufgaben sofort auf die freien Maschinen verteilt, ohne auf die Bereitstellung von Instanzen warten zu m\u00fcssen.<\/p>\n<p><\/p>\n<p><strong>Verwalteter K\u00fcndigungsschutz<\/strong> \u2014 aktivieren, dieser Parameter erlaubt dem Anbieter, den Schutz von Instanzen vor der L\u00f6schung zu entfernen. Dies geschieht, wenn auf der Maschine keine aktiven Aufgaben vorhanden sind und erm\u00f6glicht Zielkapazit\u00e4ts %.<\/p>\n<p><\/p>\n<h3 id=\"ecs-service-i-nastroyka-masshtabirovaniya\">ECS-Dienst und Skalierungseinstellungen<\/h3>\n<p><\/p>\n<p>Letzter Schritt :) Um einen Dienst zu erstellen, muss man in den zuvor erstellten Cluster auf den Tab Dienste gehen.<\/p>\n<p><\/p>\n<p><strong>Starttyp<\/strong> \u2014 man muss auf \u201aWechseln zu Kapazit\u00e4tsanbieterstrategie\u2018 klicken und den zuvor erstellten Anbieter ausw\u00e4hlen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/9d9dfdd8e333cce24bfb048ac84097e4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Aufgabenbeschreibung<\/strong> \u2014 w\u00e4hlen Sie die zuvor erstellte Aufgabenbeschreibung und deren Revision aus.<\/p>\n<p><\/p>\n<p><strong>Service name<\/strong> \u2014 um Verwirrung zu vermeiden, geben wir immer dieselbe an wie die Aufgabenbeschreibung.<\/p>\n<p><\/p>\n<p><strong>Diensttyp<\/strong> \u2014 immer Replica.<\/p>\n<p><\/p>\n<p><strong>Anzahl der Aufgaben<\/strong> \u2014 die gew\u00fcnschte Anzahl aktiver Aufgaben im Dienst. Dieses Parameter wird durch die Skalierung gesteuert, muss aber dennoch angegeben werden.<\/p>\n<p><\/p>\n<p><strong>Minimaler gesunder Prozentsatz<\/strong> und <strong>Maximaler Prozentsatz<\/strong> \u2014 bestimmen das Verhalten der Aufgaben beim Deployment. Die Standardwerte von 100 und 200 bedeuten, dass sich die Anzahl der Aufgaben w\u00e4hrend des Deployments verdoppeln wird, bevor sie wieder auf das gew\u00fcnschte Niveau zur\u00fcckkehrt. Wenn Sie 1 Aufgabe haben, min=0 und max=100, wird die Aufgabe beim Deployment beendet und danach wird eine neue gestartet, es wird also eine Ausfallzeit geben. Wenn 1 Aufgabe aktiv ist, min=50, max=150, findet das Deployment nicht statt, da man die 1 Aufgabe nicht halbieren oder um eineinhalb erh\u00f6hen kann.<\/p>\n<p><\/p>\n<p><strong>Deploymenttyp<\/strong> \u2014 wir lassen Rolling update.<\/p>\n<p><\/p>\n<p><strong>Platzierungsvorlagen<\/strong> \u2014 Regeln f\u00fcr die Platzierung von Aufgaben auf Maschinen. Standardm\u00e4\u00dfig ist AZ Balanced Spread festgelegt \u2013 das bedeutet, dass jede neue Aufgabe auf eine neue Instanz gesetzt wird, bis alle Maschinen in allen Verf\u00fcgbarkeitszonen gestartet sind. Normalerweise verwenden wir BinPack \u2013 CPU und Spread \u2013 AZ, wobei die Aufgaben so nah wie m\u00f6glich auf eine Maschine nach CPU platziert werden. Bei Bedarf wird eine neue Maschine in einer neuen Verf\u00fcgbarkeitszone erstellt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/6430bdf046fc5b970e0afbbf0d9ef65e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Typ des Lastenausgleichs<\/strong> \u2014 wir w\u00e4hlen den Application Load Balancer.<\/p>\n<p><\/p>\n<p><strong>IAM-Rolle f\u00fcr den Dienst<\/strong> \u2014 wir w\u00e4hlen <code>ecsServiceRole<\/code>.<\/p>\n<p><\/p>\n<p><strong>Name des Lastenausgleichs<\/strong> \u2014 wir w\u00e4hlen den zuvor erstellten Lastenausgleich aus.<\/p>\n<p><\/p>\n<p><strong>Gesundheitspr\u00fcfungs-Gnadenfrist<\/strong> \u2014 Pause vor der Durchf\u00fchrung von Gesundheitspr\u00fcfungen nach dem Rollout neuer Aufgaben, wir setzen normalerweise 60 Sekunden.<\/p>\n<p><\/p>\n<p><strong>Container zum Lastenausgleich<\/strong> \u2014 im Punkt \u201aZielgruppename\u2018 w\u00e4hlen wir die zuvor erstellte Gruppe aus, und alles wird automatisch ausgef\u00fcllt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c067868ff73c25c3d9b65e02be64f5c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Automatische Skalierung des Dienstes<\/strong> \u2014 Parameter zur Skalierung des Dienstes. Wir w\u00e4hlen \u201aDienst-Automatisierungskalierung konfigurieren, um die gew\u00fcnschte Anzahl Ihres Dienstes anzupassen\u2018. Wir geben die minimale und maximale Anzahl von Aufgaben bei der Skalierung an.<\/p>\n<p><\/p>\n<p><strong>IAM-Rolle f\u00fcr die automatische Skalierung des Dienstes<\/strong> \u2014 wir w\u00e4hlen <code>AWSServiceRoleForApplicationAutoScaling_ECSService<\/code>.<\/p>\n<p><\/p>\n<p><strong>Automatische Skalierungsrichtlinien f\u00fcr Aufgaben<\/strong> \u2014 Regeln zum Skalieren. Es gibt 2 Typen:<\/p>\n<p><\/p>\n<ol>\n<li><strong>Zielverfolgung<\/strong> \u2014 Verfolgung einer Zielmetrik (Nutzung von CPU\/RAM oder die Anzahl der Anfragen f\u00fcr jede Aufgabe). Zum Beispiel, wir m\u00f6chten, dass die durchschnittliche CPU-Auslastung 85% betr\u00e4gt. Wenn sie dar\u00fcber steigt, werden neue Aufgaben hinzugef\u00fcgt, bis sie den Zielwert erreicht. Liegt die Auslastung darunter, werden Aufgaben abgebaut, es sei denn, die Downsizing-Skalierungsschutz ist aktiviert (<strong>Skalierung nach unten deaktivieren<\/strong>).<\/li>\n<li><strong>Step-Skalierung<\/strong> \u2014 Reaktion auf ein beliebiges Ereignis. Hier k\u00f6nnen Sie die Reaktion auf jedes Ereignis (CloudWatch Alarm) festlegen. Wenn es passiert, k\u00f6nnen Sie eine bestimmte Anzahl von Aufgaben hinzuf\u00fcgen oder entfernen, oder eine genaue Anzahl von Aufgaben angeben.<\/li>\n<\/ol>\n<p><\/p>\n<p>Ein Dienst kann mehrere Skalierungsregeln haben, was n\u00fctzlich sein kann. Es ist wichtig, darauf zu achten, dass sie sich nicht gegenseitig behindern.<\/p>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Fazit<\/h2>\n<p><\/p>\n<p>Wenn Sie die Anweisungen befolgt und dasselbe Docker-Image verwendet haben, sollte Ihr Dienst diese Seite zur\u00fcckgeben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Erstellung einer skalierbaren API auf Spot-Instanzen von AWS\" src=\"\/wp-content\/uploads\/2020\/07\/ac592e3194480ac8b347a3a1faf0cee0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ol>\n<li>Wir haben eine Vorlage erstellt, nach der alle Maschinen im Dienst gestartet werden. Wir haben auch gelernt, Maschinen bei \u00c4nderungen an der Vorlage zu aktualisieren.<\/li>\n<li>Wir haben die Verarbeitung des Stoppsignals f\u00fcr Spot-Instanzen eingerichtet, daher werden innerhalb einer Minute nach Erhalt alle aktiven Aufgaben von der Maschine entfernt, sodass nichts verloren geht und nichts unterbrochen wird.<\/li>\n<li>Wir haben einen Load Balancer eingerichtet, um die Last gleichm\u00e4\u00dfig auf die Maschinen zu verteilen.<\/li>\n<li>Wir haben einen Dienst eingerichtet, der auf Spot-Instanzen l\u00e4uft, wodurch die Maschinenkosten um etwa das Dreifache gesenkt werden.<\/li>\n<li>Wir haben das automatische Skalieren in beide Richtungen eingerichtet, um Lastspitzen zu bew\u00e4ltigen, aber gleichzeitig nicht f\u00fcr Leerlaufzeiten zu zahlen.<\/li>\n<li>Wir verwenden einen Capacity Provider, damit die Anwendung die Infrastruktur (Maschinen) verwaltet und nicht umgekehrt.<\/li>\n<li>Wir sind gro\u00dfartig.<\/li>\n<\/ol>\n<p><\/p>\n<p>Wenn Sie vorhersehbare Laststeigerungen haben, z.B. wenn Sie in einem gro\u00dfen E-Mail-Newsletter werben, k\u00f6nnen Sie die Skalierung nach <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/autoscaling\/application\/userguide\/application-auto-scaling-scheduled-scaling.html\">Zeitplan<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Au\u00dferdem k\u00f6nnen Sie die Skalierung basierend auf Daten aus verschiedenen Teilen Ihres Systems durchf\u00fchren. Zum Beispiel haben wir die Funktion <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.adapty.io\/promo-campaigns\">Versand von individuellen Rabattangeboten<\/a><\/noindex> Nutzern der mobilen Anwendung. Manchmal wird die Kampagne an \u00fcber 1 Million Personen versendet. Nach einem solchen Versand beobachten wir immer einen deutlichen Anstieg der Anfragen an die API, da viele Benutzer gleichzeitig die Anwendung aufrufen. Wenn wir also sehen, dass die Anzahl der Warteschlangen f\u00fcr das Versenden von Promo-Push-Benachrichtigungen deutlich \u00fcber den Standardwerten liegt, k\u00f6nnen wir sofort mehrere zus\u00e4tzliche Maschinen und Aufgaben starten, um auf die Last vorbereitet zu sein.<\/p>\n<p><\/p>\n<p>Ich w\u00fcrde mich freuen, wenn ihr in den Kommentaren interessante Anwendungsf\u00e4lle f\u00fcr Spot-Instanzen und ECS oder etwas zum Thema Skalierung erz\u00e4hlt.<\/p>\n<p><\/p>\n<p>Bald erscheinen Artikel dar\u00fcber, wie wir tausende analytischer Events pro Sekunde auf einem \u00fcberwiegend serverless Stack (mit Finanzen) verarbeiten und wie das Deployment von Services mit GitLab CI und Terraform Cloud funktioniert.<\/p>\n<p><\/p>\n<p>Folgt uns, es wird interessant!<\/p>\n<p class=\"for_users_only_msg\">Nur registrierte Benutzer k\u00f6nnen an der Umfrage teilnehmen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Bitte einloggen<\/a><\/noindex>.<\/p>\n<h2 class=\"default-block__polling-title\">Verwendet ihr Spot-Instanzen in der Produktion?<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">22,2%<\/strong>Ja6<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent  poll-result__data-percent_winner\">66,7%<\/strong>Nein18<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">11,1%<\/strong>Ich habe von ihnen in einem Artikel erfahren und plane, sie zu nutzen.<\/p>\n<\/li>\n<\/ul>\n<p>    27 Benutzer haben abgestimmt. 5 Benutzer haben sich enthalten.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509790\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 AWS, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 3 \u0440\u0430\u0437\u0430 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0437\u043e\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":87394,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e API \u043d\u0430 \u0441\u043f\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445 AWS | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-07T23:42:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-07T23:42:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Erstellung einer skalierbaren API auf AWS Spot-Instanzen | ProHoster","description":"Hallo zusammen! Ich bin Kirill, CTO bei Adapty.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e API \u043d\u0430 \u0441\u043f\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445 AWS | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-07T23:42:02+00:00","article:modified_time":"2020-07-07T23:42:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87393","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:44:41","updated":"2022-09-28 14:12:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/87393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=87393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/87393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/87394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=87393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=87393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=87393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}