Bauen eng skalierbar API op AWS Spot Instanzen

Moien alleguer! Mäin Numm ass Kirill, ech sinn CTO bei Adapty. Déi meescht vun eiser Architektur ass op AWS, an haut wäert ech schwätzen iwwer wéi mir d'Serverkäschte ëm 3 Mol reduzéiert hunn andeems Dir Spot Instanzen an engem Produktiounsëmfeld benotzt, wéi och wéi se hir Auto-Scaling astellen. Als éischt gëtt et en Iwwerbléck iwwer wéi et funktionnéiert, an dann detailléiert Instruktioune fir unzefänken.

Wat sinn Spot Instanzen?

Fleck Instanzen sinn Servere vun aneren AWS Benotzer déi momentan idle sinn, a si verkafen se mat enger grousser Remise (Amazon schreift bis zu 90%, an eiser Erfahrung ~3x, variéiert jee no Regioun, AZ an Instanztyp). Hiren Haaptunterschied vu regelméissegen ass datt se zu all Moment ausschalten kënnen. Dofir hu mir laang gegleeft datt et normal ass fir se fir virgin Ëmfeld ze benotzen oder fir Aufgaben fir eppes ze berechnen, mat Zwëscheresultater op S3 oder an der Datebank gespäichert, awer net fir Verkaf. Et gi Drëtt-Partei-Léisungen déi Iech erlaben Flecken op der Produktioun ze benotzen, awer et gi vill Krutchen fir eise Fall, also hu mir se net ëmgesat. D'Approche, déi am Artikel beschriwwe gëtt, funktionnéiert ganz an der Standard AWS Funktionalitéit, ouni zousätzlech Scripten, Krounen, etc.

Drënner sinn e puer Screenshots déi d'Präisgeschicht fir Plazinstanzen weisen.

m5.grouss an der eu-west-1 (Irland) Regioun. Präis ass meeschtens stabil fir 3 Méint, aktuell spuert 2.9x.

Bauen eng skalierbar API op AWS Spot Instanzen

m5.grouss am US-Osten-1 Regioun (N. Virginia). De Präis ännert sech dauernd iwwer 3 Méint, spuert de Moment vun 2.3x op 2.8x ofhängeg vun der Disponibilitéitszone.

Bauen eng skalierbar API op AWS Spot Instanzen

t3.kleng an der US-Osten-1 Regioun (N. Virginia). De Präis ass stabil fir 3 Méint, aktuell spuert 3.4x.

Bauen eng skalierbar API op AWS Spot Instanzen

Service Architektur

D'Basisarchitektur vum Service, iwwer dee mir an dësem Artikel schwätzen, gëtt am Diagramm hei ënnen gewisen.

Bauen eng skalierbar API op AWS Spot Instanzen

Applikatioun Load Balancer → EC2 Target Group → Elastesche Container Service

Den Application Load Balancer (ALB) gëtt als Balancer benotzt, deen Ufroe un d'EC2 Target Group (TG) schéckt. TG ass verantwortlech fir d'Ouverture vun Häfen op Instanzen fir ALBs a verbënnt se mat Häfen vun Elastic Container Service (ECS) Container. ECS ass en Analog vu Kubernetes an AWS, deen Docker Container geréiert.

Eng Instanz kann e puer Lafen Container mat deene selwechte Ports hunn, sou datt mir se net fest setzen. ECS seet dem TG datt et eng nei Aufgab lancéiert (an der Kubernetes Terminologie gëtt dëst e Pod genannt), et iwwerpréift fir gratis Ports op der Instanz an zielt ee vun hinnen un déi lancéiert Aufgab. TG iwwerpréift och regelméisseg ob d'Instanz an d'API dru schaffen mat der Gesondheetscheck, a wann et Probleemer gesäit, stoppt se Ufroen do ze schécken.

EC2 Auto Skala Gruppen + ECS Kapazitéit Provider

Déi uewe genannte Diagramm weist net den EC2 Auto Scaling Groups (ASG) Service. Vum Numm kënnt Dir verstoen datt et verantwortlech ass fir Instanzen ze skaléieren. Wéi och ëmmer, bis viru kuerzem huet AWS keng agebaute Fäegkeet fir d'Zuel vun de lafende Maschinnen vun ECS ze managen. ECS huet et méiglech gemaach d'Zuel vun den Aufgaben ze skalaéieren, zum Beispill duerch CPU Benotzung, RAM oder Zuel vun Ufroen. Awer wann d'Aufgaben all gratis Instanzen besat hunn, da goufen nei Maschinnen net automatesch erstallt.

Dëst huet sech mam Advent vun ECS Capacity Providers (ECS CP) geännert. Elo kann all Service an ECS mat engem ASG verbonne ginn, a wann d'Aufgaben net op déi lafend Instanzen passen, da ginn neier opgestallt (awer bannent den etabléierten ASG Grenzen). Dëst funktionnéiert och an der Géigendeel Richtung, wann ECS CP Idle Instanzen ouni Aufgaben gesäit, da gëtt et den ASG Kommando fir se auszeschalten. ECS CP huet d'Fäegkeet fir e Zilprozent vun der Instanzbelaaschtung ze spezifizéieren, sou datt eng gewëssen Unzuel vu Maschinnen ëmmer gratis sinn fir séier Skaléierungsaufgaben; Ech wäert e bësse méi spéit doriwwer schwätzen.

EC2 Launch Schablounen

Dee leschte Service iwwer deen ech wäert schwätzen ier ech am Detail iwwer d'Schafe vun dëser Infrastruktur schwätzen ass EC2 Launch Templates. Et erlaabt Iech eng Schabloun ze kreéieren no där all Maschinnen starten, fir dëst net all Kéier vun Null ze widderhuelen. Hei kënnt Dir d'Zort vun der Maschinn auswielen fir ze starten, Sécherheetsgrupp, Disk Image a vill aner Parameteren. Dir kënnt och Benotzerdaten uginn, déi op all lancéiert Instanzen eropgeluede ginn. Dir kënnt Scripten a Benotzerdaten lafen, zum Beispill, Dir kënnt den Inhalt vun enger Datei änneren ECS Agent Konfiguratiounen.

Ee vun de wichtegste Konfiguratiounsparameter fir dësen Artikel ass ECS_ENABLE_SPOT_INSTANCE_DRAINING= wouer. Wann dëse Parameter aktivéiert ass, soubal ECS e Signal kritt datt eng Plazinstanz ewechgeholl gëtt, iwwerdréit se all Aufgaben, déi dru schaffen, op den Draining-Status. Keng nei Aufgaben ginn op dës Instanz zougewisen; wann et Aufgaben sinn, déi elo direkt drop rullt wëllen, ginn se annuléiert. Ufroe vum Balancer stoppen och ze kommen. Notifikatioun vun Instanz Läsche kënnt 2 Minutte virum aktuellen Event. Dofir, wann Äre Service keng Aufgaben méi laang wéi 2 Minutten ausféiert an näischt op der Disk späichert, da kënnt Dir Spot Instanzen benotzen ouni Daten ze verléieren.

Betreffend Scheif - AWS kuerzem huet gemaach Et ass méiglech den Elastic File System (EFS) zesumme mat ECS ze benotzen; mat dësem Schema ass och d'Disk keen Hindernis, awer mir hunn dat net probéiert, well mir am Prinzip net d'Disk brauchen fir de Staat ze späicheren. Par défaut, nom Empfang vun SIGINT (geschéckt wann eng Aufgab op den Draining Status transferéiert gëtt), ginn all lafend Aufgaben no 30 Sekonnen gestoppt, och wa se nach net ofgeschloss sinn; Dir kënnt dës Kéier mam Parameter änneren ECS_CONTAINER_STOP_TIMEOUT. Den Haapt Saach ass et net méi wéi 2 Minutten fir Spotmaschinnen ze setzen.

Schafen engem Service

Loosst eis weidergoen fir de beschriwwene Service ze kreéieren. Am Prozess wäert ech zousätzlech e puer nëtzlech Punkten beschreiwen, déi net uewen ernimmt goufen. Am Allgemengen ass dëst eng Schrëtt-fir-Schrëtt Instruktioun, awer ech wäert net e puer ganz Basis oder, am Géigendeel, ganz spezifesch Fäll betruechten. All Aktiounen ginn an der AWS visueller Konsole gemaach, awer kënne programmatesch mat CloudFormation oder Terraform reproduzéiert ginn. Bei Adapty benotze mir Terraform.

EC2 Start Schabloun

Dëse Service erstellt eng Konfiguratioun vu Maschinnen déi benotzt ginn. Schabloune ginn an der EC2 -> Instanzen -> Schablounen Sektioun lancéiert.

Amazon Maschinn Bild (AMI) - spezifizéiert den Disk Image mat deem all Instanzen gestart ginn. Fir ECS ass et an de meeschte Fäll et derwäert dat optimiséiert Bild vun Amazon ze benotzen. Et gëtt regelméisseg aktualiséiert an enthält alles wat néideg ass fir ECS ze schaffen. Fir déi aktuell Bild ID erauszefannen, gitt op d'Säit Amazon ECS-optimiséiert AMIs, wielt d'Regioun déi Dir benotzt a kopéiert d'AMI ID dofir. Zum Beispill, fir d'US-East-1 Regioun, ass déi aktuell ID am Schreiwen ami-00c7c1cf5bdc913ed. Dës ID muss an d'Spezifizéiere vun engem Custom Value Element agefouert ginn.

Instanz Typ - gitt den Instanztyp un. Wielt deen deen am Beschten Är Aufgab passt.

Schlësselpaar (Login) - spezifizéiert e Certificat mat deem Dir mat der Instanz iwwer SSH konnektéiere kënnt, wann néideg.

Netzwierk Astellungen - spezifizéiert d'Netzparameter. Vernetzung Plattform an deene meeschte Fäll sollt et eng Virtual Private Cloud (VPC) sinn. Sécherheetsgruppen - Sécherheetsgruppen fir Är Fäll. Well mir e Balancer virun den Instanzen benotzen, recommandéieren ech e Grupp hei ze spezifizéieren deen erakommen Verbindungen nëmmen aus dem Balancer erlaabt. Dat ass, Dir wäert 2 Sécherheetsgruppen hunn, eng fir de Balancer, deen Inbound Verbindunge vun iwwerall op Ports 80 (http) an 443 (https) erlaabt, an déi zweet fir Maschinnen, déi Entréeën Verbindungen op all Ports aus der Balancergrupp erlaabt . Outbound Verbindungen a béid Gruppen musse mam TCP Protokoll op all Ports op all Adressen opgemaach ginn. Dir kënnt Ports an Adressen fir erausginn Verbindungen limitéieren, awer da musst Dir stänneg iwwerwaachen datt Dir net probéiert eppes op engem zouenen Hafen ze kréien.

Lagerung (Volumen) - spezifizéiert d'Diskparameter fir d'Maschinnen. D'Diskgréisst kann net manner sinn wéi déi am AMI spezifizéiert; fir ECS Optimiséiert ass et 30 GiB.

Fortgeschratt Detailer - zousätzlech Parameteren uginn.

Kaf Optioun - ob mir Spot-Instanzen wëllen kafen. Mir wëllen, awer mir wäerte dës Këscht net hei kontrolléieren; mir konfiguréieren et an der Auto Scaling Group, et gi méi Optiounen do.

IAM Instanz Profil - uginn d'Roll mat där d'Instanzen lancéiert ginn. Fir Instanzen an ECS ze lafen, brauche se Permissiounen, déi normalerweis an der Roll fonnt ginn ecsInstanceRole. An e puer Fäll kann et geschaf ginn, wann net, dann hei manuell op wéi dëst ze maachen. No der Schafung weisen mir et an der Schabloun un.
Als nächst ginn et vill Parameteren, am Fong kënnt Dir Standardwäerter iwwerall verloossen, awer jidderee vun hinnen huet eng kloer Beschreiwung. Ech aktivéieren ëmmer déi EBS-optimiséiert Instanz an T2 / T3 Unlimited Optiounen wann se benotzt ginn burstable Instanzen.

Benotzer Daten - Benotzerdaten uginn. Mir wäerten d'Datei änneren /etc/ecs/ecs.config, déi d'ECS Agent Konfiguratioun enthält.
E Beispill vu wéi Benotzerdaten kéinte ausgesinn:

#!/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.config

ECS_CLUSTER=DemoApiClusterProd - de Parameter weist datt d'Instanz zu engem Cluster mam Numm gehéiert, dat heescht, dëse Cluster wäert fäeg sinn seng Aufgaben op dësem Server ze placéieren. Mir hunn nach kee Cluster erstallt, awer mir wäerten dësen Numm benotzen wann Dir en erstellt.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true - de Parameter spezifizéiert datt wann e Signal kritt gëtt fir eng Spot Instanz auszeschalten, all Aufgaben dorop sollen op den Draining Status transferéiert ginn.

ECS_CONTAINER_STOP_TIMEOUT=1m - de Parameter präziséiert datt no engem SIGINT-Signal all Aufgaben 1 Minutt hunn ier se ëmbruecht ginn.

ECS_ENGINE_AUTH_TYPE=docker - de Parameter weist datt den Docker Schema als Autorisatiounsmechanismus benotzt gëtt

ECS_ENGINE_AUTH_DATA=... - Verbindungsparameter fir de private Container Registry, wou Är Docker Biller gespäichert sinn. Wann et ëffentlech ass, da musst Dir näischt uginn.

Fir den Zweck vun dësem Artikel wäert ech en ëffentlecht Bild vum Docker Hub benotzen, also spezifizéiert d'Parameteren ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA net néideg.

Gutt Wëssen: Et ass recommandéiert den AMI regelméisseg ze aktualiséieren, well nei Versiounen Update Versioune vun Docker, Linux, ECS Agent, etc.. Fir dëst net ze vergiessen, kënnt Dir ageriicht Notifikatiounen iwwer d'Verëffentlechung vun neie Versiounen. Dir kënnt Notifikatiounen per E-Mail kréien an manuell aktualiséieren, oder Dir kënnt eng Lambda-Funktioun schreiwen, déi automatesch eng nei Versioun vum Launch Template mat engem aktualiséierten AMI erstellt.

EC2 Auto Skaléieren Group

Auto Scaling Group ass verantwortlech fir d'Start an d'Skaléierung vun Instanzen. Gruppe ginn an der EC2 -> Auto Scaling -> Auto Scaling Groups Sektioun geréiert.

Schabloun starten - wielt d'Schabloun erstallt am virege Schrëtt. Mir verloossen d'Standardversioun.

Kaf Optiounen an Instanz Zorte - spezifizéiert d'Typen vun Instanzen fir de Cluster. Adhere to launch template benotzt den Instanztyp vun der Launch Template. Kombinéiert Kafoptiounen an Instanztypen erlaabt Iech Instanztypen flexibel ze konfiguréieren. Mir wäerten et benotzen.

Optional On-Demand Basis - d'Zuel vu reegelméissegen, non-spot Instanzen déi ëmmer funktionnéieren.

On-Demand Prozentsaz iwwer Basis - Prozentsaz Verhältnis vu regelméissegen a Fleck Instanzen, 50-50 ginn gläich verdeelt, 20-80 fir all regulär Instanz ginn 4 Plazen eropgesat. Fir den Zweck vun dësem Beispill wäert ech 50-50 uginn, awer a Wierklechkeet maache mir meeschtens 20-80, an e puer Fäll 0-100.

Instanz Typen - hei kënnt Dir zousätzlech Aarte vun Instanzen uginn, déi am Cluster benotzt ginn. Mir hunn et ni benotzt well ech d'Bedeitung vun der Geschicht net wierklech verstinn. Vläicht ass dëst wéinst de Limiten op spezifesch Aarte vun Instanzen, awer si kënne ganz einfach duerch Ënnerstëtzung erhéicht ginn. Wann Dir d'Applikatioun kennt, wäert ech frou et an de Kommentaren ze liesen)

Bauen eng skalierbar API op AWS Spot Instanzen

Network - Netz Astellungen, wielt VPC an Subnets fir Maschinnen, an de meeschte Fäll sollt Dir all verfügbare Subnets auswielen.

Lueden ausgeglach - Balancer Astellunge, awer mir wäerten dat separat maachen, mir beréieren näischt hei. Gesondheet Kontrollen wäert och spéider konfiguréiert ginn.

Gruppegréisst - Mir weisen d'Limiten op d'Zuel vun de Maschinnen am Stärekoup an déi gewënscht Unzuel vun de Maschinnen am Ufank un. D'Zuel vun de Maschinnen am Cluster wäert ni manner wéi de Minimum spezifizéiert a méi wéi de Maximum sinn, och wann d'Skaléierung no de Metriken geschéie soll.

Skaléieren Politik - Skaléierungsparameter, awer mir skaléieren op Basis vun den lafenden ECS Aufgaben, sou datt mir d'Skaléierung méi spéit konfiguréieren.

Instanz Skala-an Schutz - Schutz vun Instanzen aus Läschen beim Ofbau. Mir aktivéieren et sou datt ASG d'Maschinn net läscht déi Aufgaben huet. ECS Kapazitéit Provider wäert de Schutz fir Fäll auszeschalten déi keng Aufgaben hunn.

Füügt Tags - Dir kënnt Tags fir Instanzen spezifizéieren (fir dëst muss d'Tag nei Instanzen Checkbox markéiert ginn). Ech recommandéieren den Numm Tag ze spezifizéieren, dann hunn all Instanzen déi bannent der Grupp lancéiert ginn deeselwechten Numm, an et ass bequem se an der Konsole ze gesinn.

Bauen eng skalierbar API op AWS Spot Instanzen

Nodeems Dir de Grupp erstallt hutt, öffnen se a gitt op d'Advanced Configurations Sektioun Firwat sinn net all Optiounen an der Konsole an der Schafungsstadium ze gesinn.

Terminpolitik - Regelen déi berécksiichtegt gi wann Dir Instanzen läschen. Si ginn an Uerdnung applizéiert. Mir benotzen normalerweis déi op der Foto hei drënner. Als éischt ginn Instanzen mat der eelster Launch Template geläscht (zum Beispill wa mir den AMI aktualiséiert hunn, hu mir eng nei Versioun erstallt, awer all Instanzen hunn et fäerdeg bruecht ze wiesselen). Da ginn d'Instanzen ausgewielt, déi am nootste bei der nächster Rechnungsstonn sinn. An da ginn déi eelst ausgewielt op Basis vum Startdatum.

Bauen eng skalierbar API op AWS Spot Instanzen

Gutt Wëssen: fir all Maschinnen an engem Cluster ze aktualiséieren, bequem ze benotzen Instanz Refresh. Wann Dir dëst mat der Lambda Funktioun aus dem virege Schrëtt kombinéiert, hutt Dir e voll automatiséierten Instanz Update System. Ier Dir all Maschinnen aktualiséiert, musst Dir Instanz Skala-In Schutz fir all Instanzen an der Grupp deaktivéieren. Net Konfiguratioun an der Grupp, awer Schutz vun de Maschinnen selwer, dëst gëtt op der Instance Management Tab gemaach.

Applikatioun Load Balancer an EC2 Target Group

De Balancer gëtt an der Rubrik EC2 → Load Balance → Load Balancer erstallt. Mir benotzen d'Applikatioun Load Balancer; e Verglach vu verschiddenen Zorte Balancer ka gelies ginn Service Säit.

Listener - et mécht Sënn fir Häfen 80 an 443 ze maachen a Viruleedung vun 80 op 443 mat Balancerregelen méi spéit.

Disponibilitéit Zonen - an deene meeschte Fäll wielen mir Accessibilitéitszonen fir jiddereen.

Configuréieren Sécherheet Astellunge - den SSL Zertifikat fir de Balancer gëtt hei uginn, déi bequemste Optioun ass e Certificat maachen an der ACM. Iwwert d'Ënnerscheeder Sécherheetspolitik ka gelies ginn Dokumentatioun, Dir kënnt et par défaut ausgewielt loossen ELBSecurityPolicy-2016-08. Nodeems Dir de Balancer erstallt hutt, gesitt Dir et DNS Numm, déi Dir braucht fir den CNAME fir Ären Domain ze konfiguréieren. Zum Beispill, dëst ass wéi et an Cloudflare ausgesäit.

Bauen eng skalierbar API op AWS Spot Instanzen

Sécherheetsgrupp - erstellt oder wielt e Sécherheetsgrupp fir de Balancer, Ech hunn méi iwwer dëst just uewen an der EC2 Launch Template → Network Settings Sektioun geschriwwen.

Zilgrupp - Mir kreéieren e Grupp dee verantwortlech ass fir Ufroe vum Balancer op Maschinnen ze vermëttelen an hir Disponibilitéit ze kontrolléieren fir se am Fall vu Probleemer ze ersetzen. Zilzort muss Instanz sinn, Protokoll и Port all, wann Dir benotzt HTTPS fir Kommunikatioun tëscht dem balancer an Instanzen, da musst Dir e Certificat hinnen eropluede. Fir den Zweck vun dësem Beispill wäerte mir dat net maachen, mir verloossen einfach den Hafen 80.

Gesondheet Kontrollen - Parameteren fir d'Funktionalitéit vum Service ze kontrolléieren. An engem richtege Service sollt dëst eng separat Ufro sinn, déi wichteg Deeler vun der Geschäftslogik implementéiert; fir den Zweck vun dësem Beispill loossen ech d'Standardastellungen. Als nächst kënnt Dir d'Ufro-Intervall, Timeout, Erfollegscoden, etc. An eisem Beispill wäerte mir Erfollegscodes 200-399 uginn, well d'Docker-Bild, déi benotzt gëtt, en 304-Code zréckginn.

Bauen eng skalierbar API op AWS Spot Instanzen

Aschreiwen Ziler - hei ginn d'Autoen fir de Grupp ausgewielt, awer an eisem Fall gëtt dat vun ECS gemaach, also sprange mir dëse Schrëtt just iwwer.

Gutt Wëssen: um balancer Niveau kënnt Dir Logbicher aktivéieren, datt an S3 an engem bestëmmte gespäichert ginn format. Vun do aus kënne se an Drëtt Partei Servicer fir Analyse exportéiert ginn, oder Dir kënnt SQL Ufroen direkt op d'Donnéeën am S3 maachen Athena benotzt. Et ass bequem a funktionnéiert ouni zousätzlech Code. Ech recommandéieren och d'Ewechhuele vu Logbicher aus dem S3 Eemer no enger spezifizéierter Zäit opzestellen.

ECS Aufgab Definitioun

An de fréiere Schrëtt hu mir alles erstallt am Zesummenhang mat der Serviceinfrastruktur; elo gi mir weider fir d'Container ze beschreiwen déi mir starten. Dëst gëtt an der ECS → Task Definitions Sektioun gemaach.

Starttyp Kompatibilitéit - wielt EC2.

Aufgab Ausféierung IAM Roll - wielt ecsTaskExecutionRole. Mat et gi Logbicher geschriwwe, Zougang zu geheime Variablen gëtt uginn, etc.

An der Rubrik Container Definitioun, klickt op Behälter derbäi.

Bild - Link op d'Bild mam Projet Code; fir dëst Beispill wäert ech en ëffentlecht Bild vum Docker Hub benotzen bitnami/Node-Beispill:0.0.1.

Erënnerung Grenzen - Erënnerung Limite fir de Container. Hard Limit - schwéier Limit, wann de Container iwwer de spezifizéierte Wäert geet, gëtt den Docker Kill Kommando ausgefouert, de Container stierft direkt. Soft Limit - mëll Limite, de Container kann iwwer de spezifizéierte Wäert goen, awer dëse Parameter gëtt berücksichtegt wann Dir Aufgaben op Maschinnen placéiert. Zum Beispill, wann eng Maschinn 4 GiB RAM huet, an déi mëll Limit vun engem Container ass 2048 MiB, da kann dës Maschinn maximal 2 Lafen Aufgaben mat dësem Container hunn. A Wierklechkeet ass 4 GiB vum RAM liicht manner wéi 4096 MiB, dëst kann op der ECS Instances Tab am Cluster gekuckt ginn. Soft Limit kann net méi grouss sinn wéi schwéier Limit. Et ass wichteg ze verstoen datt wann et e puer Container an enger Aufgab ass, da sinn hir Grenzen zesummegefaasst.

Port Kaarten - an Host Hafen Mir weisen 0, dat heescht datt den Hafen dynamesch zougewisen gëtt a vun der Zilgrupp iwwerwaacht gëtt. Container Port - den Hafen op deem Är Applikatioun leeft gëtt dacks am Ausféierungsbefehl spezifizéiert, oder an Ärem Applikatiounscode, Dockerfile, etc. Fir eist Beispill benotze mir 3000 well et opgezielt ass dockerfile d'Bild dat benotzt gëtt.

Gesondheetscheck - Container Gesondheetscheckparameter, net ze verwiessele mat deem deen an der Zilgrupp konfiguréiert ass.

Emwelt - Ëmfeld Astellunge. CPU Unitéiten - ähnlech ze Memory Limiten, nëmmen iwwer de Prozessor. All Prozessor Kär ass 1024 Eenheeten, also wann de Server en Dual-Core Prozessor huet an de Container op 512 gesat ass, da kënnen 4 Aufgaben mat dësem Container op engem Server gestart ginn. CPU-Eenheeten entspriechen ëmmer d'Zuel vun de Kären; et kann net e bësse manner vun hinnen sinn, sou wéi de Fall mat Erënnerung.

Kommando - e Kommando fir e Service an engem Container unzefänken, all Parameter ginn duerch Komma getrennt spezifizéiert. Dëst kéint Gunicorn, npm, etc. Wann net uginn, gëtt de Wäert vun der CMD Direktiv aus der Dockerfile benotzt. Mir weisen npm,start.

Ëmfeld Verännerlechen - Container Ëmfeld Variablen. Dëst kann entweder einfach Text Daten oder geheime Verännerlechen aus Geheimnisser Manager oder Parameter Store.

Späicheren a Logbicher - hei wäerte mir de Logbicher an CloudWatch Logs astellen (e Service fir Logbicher vun AWS). Fir dëst ze maachen, aktivéiert just d'Auto-configure CloudWatch Logs Checkbox. Nodeems Dir d'Task Definitioun erstallt hutt, gëtt eng Grupp vu Logbicher automatesch an CloudWatch erstallt. Par défaut ginn d'Logbicher onbestëmmt dran gespäichert; Ech recommandéieren d'Retentiounsperiod vun Nier Expire op déi erfuerderlech Period z'änneren. Dëst gëtt an CloudWatch Log Gruppen gemaach, Dir musst op déi aktuell Period klickt a wielt eng nei.

Bauen eng skalierbar API op AWS Spot Instanzen

ECS Cluster an ECS Kapazitéit Provider

Gitt an d'ECS → Cluster Sektioun fir e Cluster ze kreéieren. Mir wielen EC2 Linux + Networking als Schabloun.

Numm Cluster - ganz wichteg, mir maachen hei dee selwechten Numm wéi am Launch Template Parameter spezifizéiert ECS_CLUSTER, an eisem Fall - DemoApiClusterProd. Kontrolléiert d'Schécken en eidele Cluster Checkbox. Optional kënnt Dir Container Insights aktivéieren fir Metriken fir Servicer an CloudWatch ze gesinn. Wann Dir alles richteg gemaach hutt, da gesitt Dir an der ECS Instanzen Sektioun Maschinnen déi an der Auto Scaling Grupp erstallt goufen.

Bauen eng skalierbar API op AWS Spot Instanzen

Gitt op d'Tab Kapazitéit Provider a schafen eng nei. Loosst mech Iech drun erënneren datt et néideg ass fir d'Schafung an d'Ausschaltung vu Maschinnen ze kontrolléieren ofhängeg vun der Unzuel vun de lafenden ECS Aufgaben. Et ass wichteg ze notéieren datt e Provider nëmmen un eng Grupp zougewisen ka ginn.

Auto Skaléieren Grupp - wielt déi virdru erstallt Grupp.

Verwalte Skaléieren - aktivéiert et sou datt de Provider de Service kann skaléieren.

Zil Kapazitéit % - wéi engem Prozentsaz vun Maschinnen mat Aufgaben gelueden mir brauchen. Wann Dir 100% spezifizéiert, da sinn all Maschinnen ëmmer beschäftegt mat Lafen Aufgaben. Wann Dir 50% uginn, da wäert d'Halschent vun den Autoen ëmmer gratis sinn. An dësem Fall, wann et e schaarfe Sprang an der Belaaschtung ass, kommen nei Taxien direkt op fräi Autoen, ouni op Instanzen ze waarden fir agesat ze ginn.

Managed Termin Schutz - aktivéieren, dëse Parameter erlaabt dem Provider de Schutz vun Instanzen aus der Läsch ze läschen. Dëst geschitt wann et keng aktiv Aufgaben op der Maschinn sinn an erlaabt Target Kapazitéit%.

ECS Service a Skaléierungsopstellung

Leschten Schrëtt :) Fir e Service ze kreéieren, musst Dir op de virdru erstallte Cluster op der Services Tab goen.

Typ starten - Dir musst op Schalten op Kapazitéit Provider Strategie klickt a wielt déi virdru erstallt Ubidder.

Bauen eng skalierbar API op AWS Spot Instanzen

Aufgab Definitioun - wielt déi virdru erstallt Task Definitioun a seng Versioun.

Service Numm - Fir Duercherneen ze vermeiden, weisen mir ëmmer d'selwecht wéi Task Definition un.

Service Typ - ëmmer Replica.

Zuel vun Aufgaben - déi gewënscht Zuel vun aktiven Aufgaben am Service. Dëse Parameter gëtt duerch Skaléierung kontrolléiert, awer muss nach ëmmer spezifizéiert ginn.

Minimum gesond Prozent и Maximum Prozent - bestëmmen d'Behuele vun Aufgaben während Détachement. D'Standardwäerter sinn 100 an 200, wat beweist datt d'Zuel vun den Aufgaben e puer Mol eropgeet, an dann op de gewënschten Wäert zréck. Wann Dir 1 Aufgab laaft, min = 0, a max = 100, da gëtt se während der Deployment ëmbruecht, an duerno gëtt eng nei opgehuewen, dat heescht, et ass Ausdauer. Wann 1 Aufgab leeft, min = 50, max = 150, da wäert d'Deployment guer net geschéien, well 1 Aufgab kann net an d'Halschent opgedeelt oder ëm annerhallef Mol eropgesat ginn.

Deployment Typ - verloossen Rolling Update.

Placement Schablounen - Regele fir Aufgaben op Maschinnen ze placéieren. De Standard ass AZ Balanced Spread - dat heescht datt all nei Aufgab op eng nei Instanz gesat gëtt bis Maschinnen an all Disponibilitéitszonen eropgoen. Mir maachen normalerweis BinPack - CPU a Spread - AZ; mat dëser Politik ginn Aufgaben esou dicht wéi méiglech op enger Maschinn pro CPU plazéiert. Wann et néideg ass eng nei Maschinn ze kreéieren, gëtt se an enger neier Disponibilitéitszone erstallt.

Bauen eng skalierbar API op AWS Spot Instanzen

Lueden Balancer Typ - wielt Application Load Balancer.

Service IAM Roll - wielt ecsServiceRole.

Lueden Balancer Numm - wielt de virdru erstallte Balancer.

Gesondheet Check Gnod Period - Paus ier Dir Gesondheetskontrollen ausféiert nodeems Dir eng nei Aufgab ausrollt, mir setzen se normalerweis op 60 Sekonnen.

Container fir Gläichgewiicht ze lueden - am Zilgrupp Numm Element, wielt déi virdru erstallt Grupp, an alles gëtt automatesch ausgefëllt.

Bauen eng skalierbar API op AWS Spot Instanzen

Service Auto Skala - Service Skala Parameteren. Wielt Configure Service Auto Scaling fir de gewënschten Unzuel vun Ärem Service unzepassen. Mir setzen de Minimum a maximal Unzuel vun Aufgaben beim Skaléieren.

IAM Roll fir Service Auto Scaling - wielt AWSServiceRoleForApplicationAutoScaling_ECSService.

Automatesch Aufgab Skala Politiken - Regele fir Skala. Et ginn 2 Typen:

  1. Zilverfolgung - Tracking Zil Metriken (CPU / RAM Notzung oder Zuel vun Ufroe fir all Aufgab). Zum Beispill wëlle mir datt d'Duerchschnëttsprozessorbelaaschtung 85% ass, wann et méi héich gëtt, ginn nei Aufgaben derbäi, bis et den Zilwäert erreecht. Wann d'Belaaschtung méi niddereg ass, ginn d'Aufgaben ewechgeholl, am Géigendeel, ausser de Schutz géint d'Skaléierung aktivéiert ass (Skala-in auszeschalten).
  2. Schrëtt Skala - Reaktioun op eng arbiträr Event. Hei kënnt Dir eng Reaktioun op all Event konfiguréieren (CloudWatch Alarm), wann et geschitt, kënnt Dir déi spezifizéiert Zuel vun Aufgaben derbäisetzen oder ewechhuelen, oder déi exakt Unzuel vun Aufgaben uginn.

E Service kann e puer Skaléierungsregelen hunn, dëst kann nëtzlech sinn, den Haapt Saach ass ze garantéieren datt se net matenee konflikt sinn.

Konklusioun

Wann Dir d'Instruktioune gefollegt hutt an datselwecht Docker-Bild benotzt hutt, sollt Äre Service eng Säit wéi dës zréckginn.

Bauen eng skalierbar API op AWS Spot Instanzen

  1. Mir hunn eng Schabloun erstallt, no där all Maschinnen am Service lancéiert ginn. Mir hunn och geléiert wéi Maschinnen aktualiséieren wann d'Schabloun ännert.
  2. Mir hunn d'Veraarbechtung vum Spot Instanz Stop Signal konfiguréiert, sou datt bannent enger Minutt no der Empfang all lafend Aufgaben aus der Maschinn geläscht ginn, sou datt näischt verluer oder ënnerbrach ass.
  3. Mir hunn de Balancer erhéicht fir d'Laascht gläichméisseg iwwer d'Maschinnen ze verdeelen.
  4. Mir hunn e Service erstallt deen op Plazinstanzen leeft, wat d'Maschinnkäschte ëm ongeféier 3 Mol reduzéiert.
  5. Mir hunn Autoscaling a béid Richtungen konfiguréiert fir erhéicht Aarbechtsbelaaschtungen ze handhaben ouni Downtime Käschten ze maachen.
  6. Mir benotzen Capacity Provider sou datt d'Applikatioun d'Infrastruktur (Maschinnen) geréiert an net ëmgedréint.
  7. Mir sinn super.

Wann Dir prévisibel Spikes an der Belaaschtung hutt, zum Beispill Dir reklaméiert an enger grousser E-Mail Kampagne, kënnt Dir d'Skaléierung astellen duerch Zäitplang.

Dir kënnt och Skala baséiert op Daten aus verschiddenen Deeler vun Ärem System. Zum Beispill hu mir d'Funktionalitéit individuell Promotiouns Offeren schécken Benotzer vun der mobiler Applikatioun. Heiansdo gëtt eng Kampagne un 1M+ Leit geschéckt. No esou enger Verdeelung gëtt et ëmmer eng grouss Erhéijung vun Ufroen un d'API, well vill Benotzer gläichzäiteg an d'Applikatioun aloggen. Also wa mir gesinn datt et wesentlech méi Standard Indikatoren an der Schlaang sinn fir Promotiouns Push Notifikatiounen ze schécken, kënne mir direkt e puer zousätzlech Maschinnen an Aufgaben starten fir prett ze sinn fir d'Laascht.

Ech wäert frou sinn wann Dir mir an de Kommentaren interessant Fäll vun der Benotzung vun Spot Instanzen an ECS oder eppes iwwer Skaléieren erzielt.

Geschwënn ginn et Artikelen iwwer wéi mir Dausende vun analyteschen Eventer pro Sekonn op engem haaptsächlech serverlosen Stack (mat Suen) veraarbecht a wéi d'Deployment vu Servicer mat GitLab CI an Terraform Cloud funktionnéiert.

Abonnéiert Iech bei eis, et wäert interessant sinn!

Nëmme registréiert Benotzer kënnen un der Ëmfro deelhuelen. Umellen, wann ech glift.

Benotzt Dir Spot Instanzen an der Produktioun?

  • 22,2%jo6

  • 66,7%Nee18

  • 11,1%Ech hunn iwwer si vun engem Artikel geléiert a plangen se ze benotzen3

27 Benotzer hunn gestëmmt. 5 Benotzer hu sech enthalen.

Source: will.com

Setzt e Commentaire