Hej alla! Jag heter Kirill och jag Àr CTO pÄ Adapty. Största delen av vÄr arkitektur Àr pÄ AWS, och idag kommer jag att berÀtta hur vi har minskat serverkostnaderna med 3 gÄnger genom att anvÀnda spotinstanser i produktionsmiljö, samt hur man stÀller in autoskalning för dem. Först blir en översikt över hur detta fungerar och sedan en detaljerad guide för att sÀtta igÄng.
Vad Àr spotinstanser?
Àr servrar som tillhör andra AWS-anvÀndare och som för nÀrvarande stÄr tomma, och de sÀljer dem med en stor rabatt (Amazon skriver upp till 90 %, men enligt vÄr erfarenhet Àr det ~3x, beroende pÄ region, AZ och typ av instans). Den frÀmsta skillnaden frÄn vanliga instanser Àr att de kan stÀngas av nÀr som helst. DÀrför trodde vi lÀnge att det var okej att anvÀnda dem för utvecklingsmiljöer eller för berÀkningsuppgifter, med lagring av mellanresultat pÄ S3 eller i en databas, men inte för produktion. Det finns tredjepartslösningar för att anvÀnda spotinstanser i produktion, men de har mÄnga begrÀnsningar för vÄrt fall, sÄ vi implementerade inte dem. Metoden som beskrivs i artikeln fungerar helt inom standardfunktionaliteten för AWS, utan extra skript, cron-jobb etc.
Nedan följer nÄgra skÀrmdumpar som visar prishistoriken för spotinstanser.
m5.large i regionen eu-west-1 (Irland). Priset har huvudsakligen varit stabilt under 3 mÄnader, just nu Àr besparingen 2.9x.

m5.large i regionen us-east-1 (N. Virginia). Priset Àndras kontinuerligt under 3 mÄnader, just nu Àr besparingen mellan 2.3x och 2.8x beroende pÄ tillgÀnglighetszon.

t3.small i regionen us-east-1 (N. Virginia). Priset har varit stabilt under 3 mÄnader, just nu Àr besparingen 3.4x.

TjÀnstens arkitektur
Den grundlÀggande arkitekturen för tjÀnsten som vi kommer att diskutera i denna artikel visas i diagrammet nedan.

Application Load Balancer â EC2 Target Group â Elastic Container Service
Vi anvÀnder Application Load Balancer (ALB) som balansrÀknare, som skickar förfrÄgningar till EC2 Target Group (TG). TG ansvarar för att öppna portar pÄ instanserna för ALB och koppla dem till portarna för Elastic Container Service (ECS) containrar. ECS Àr motsvarigheten till Kubernetes i AWS som hanterar Docker-kontainrar.
PÄ en instans kan det finnas flera aktiva containrar med samma portar, sÄ vi kan inte ange dem fast. ECS meddelar TG att den startar en ny uppgift (i Kubernetes-termer kallas det en pod), den gör en kontroll av tillgÀngliga portar pÄ instansen och tilldelar en av dem till den startade uppgiften. TG kontrollerar ocksÄ regelbundet om instansen och API:t pÄ den fungerar genom hÀlsokontroll, och om den ser nÄgra problem slutar den att skicka begÀrningar dit.
EC2 Auto Scaling-grupper + ECS kapacitetsleverantörer
I diagrammet ovan visas inte tjÀnsten EC2 Auto Scaling-grupper (ASG). Av namnet kan man förstÄ att den ansvarar för att skala instanser. Fram till nyligen fanns det ingen inbyggd möjlighet i AWS att hantera antalet aktiva maskiner frÄn ECS. ECS tillÀt att skala antalet uppgifter, till exempel baserat pÄ CPU-, RAM-anvÀndning eller antal begÀrningar. Men om uppgifterna tog upp alla fria instanser, sÄ startades inga nya maskiner automatiskt.
Detta Àndrades med introduktionen av ECS kapacitetsleverantörer (ECS CP). Nu kan varje tjÀnst i ECS kopplas till ASG, och om uppgifterna inte fÄr plats pÄ de aktiva instanserna startas nya (men inom de grÀnser som ASG har stÀllt in). Detta fungerar ocksÄ Ät andra hÄllet; om ECS CP ser inaktiva instanser utan uppgifter ger det en signal till ASG att stÀnga av dem. ECS CP har möjlighet att ange en mÄlsatt procentandel av instansbelastningen, sÄ att ett antal maskiner alltid Àr fria för snabb skalning av uppgifter, vilket jag kommer att berÀtta mer om lite senare.
EC2 startmallar
Den sista tjÀnsten jag kommer att berÀtta om innan jag gÄr in pÄ en detaljerad beskrivning av skapandet av denna infrastruktur Àr EC2 startmallar. Den gör det möjligt att skapa en mall som alla maskiner kommer att startas utifrÄn, sÄ att man inte behöver göra det frÄn grunden varje gÄng. HÀr kan man vÀlja typ av körd maskin, sÀkerhetsgrupp, diskbild och mÄnga andra parametrar. Man kan ocksÄ ange anvÀndardata som kommer att laddas upp till alla startade instanser. I anvÀndardata kan man köra skript, till exempel kan man redigera innehÄllet i filen .
En av de viktigaste konfigurationsparametrarna i denna artikel Àr =true. Om den hÀr instÀllningen Àr aktiverad, kommer ECS, sÄ snart den fÄr signalen om att en spot-instans tas bort, att överföra alla uppgifter som körs pÄ den till status Draining. Inga nya uppgifter kommer att tilldelas till denna instans, och om det finns uppgifter som just nu vill startas pÄ den, kommer de att avbrytas. FörfrÄgningar frÄn lastbalanseraren slutar ocksÄ komma. Aviseringen om borttagning av instansen kommer tvÄ minuter innan den faktiska hÀndelsen. DÀrför, om din tjÀnst inte har uppgifter som pÄgÄr lÀngre Àn 2 minuter och inte sparar nÄgonting pÄ disken, kan du anvÀnda spot-instans utan risk för dataloss.
NĂ€r det gĂ€ller disken â AWS har nyligen det möjligt att anvĂ€nda Elastic File System (EFS) tillsammans med ECS, med detta upplĂ€gg utgör inte ens disken ett hinder, men vi har inte provat det eftersom vi i princip inte behöver en disk för att spara status. Som standard, efter att ha mottagit SIGINT (som skickas i det ögonblick dĂ„ uppgiften övergĂ„r till status Draining), kommer alla aktiva uppgifter att stoppas inom 30 sekunder, Ă€ven om de inte har blivit klara, detta tidsintervall kan justeras med hjĂ€lp av parametern . Det viktigaste Ă€r att inte stĂ€lla in detta till mer Ă€n 2 minuter för spot-maskiner.
Skapa tjÀnst
LÄt oss gÄ direkt till att skapa den beskrivna tjÀnsten. Under processen kommer jag att beskriva nÄgra ytterligare anvÀndbara punkter som inte nÀmndes ovan. Generellt Àr detta en steg-för-steg-instruktion, men nÄgra mycket grundlÀggande eller Ä sin sida mycket specifika fall kommer jag inte att diskutera. Alla ÄtgÀrder utförs i den visuella konsolen i AWS, men de kan Àven reproduceras programatiskt med hjÀlp av CloudFormation eller Terraform. PÄ Adapty anvÀnder vi Terraform.
EC2 Launch Template
I denna tjÀnst skapas en konfiguration av maskiner som ska anvÀndas. Hanteringen av mallarna sker under EC2 -> Instances -> Launch templates.
Amazon machine image (AMI) â vi anger diskimage som alla instanser ska startas med. För ECS bör man i de flesta fall anvĂ€nda en optimerad bild frĂ„n Amazon. Den uppdateras regelbundet och innehĂ„ller allt nödvĂ€ndigt för att ECS ska fungera. För att ta reda pĂ„ aktuell bild-ID gĂ„r vi till sidan , vĂ€ljer den aktuella regionen och kopierar AMI ID för den. Till exempel, för regionen us-east-1, Ă€r det aktuella ID som skrivs i artikeln â ami-00c7c1cf5bdc913ed. Detta ID mĂ„ste klistras in i punkten Specificera ett anpassat vĂ€rde.
Instanstyp â specificera typ av instans. VĂ€lj den som passar bĂ€st för dina uppgifter.
Nyckelpar (inloggning) â specificera certifikatet som gör det möjligt att ansluta till instansen via SSH, om det Ă€r nödvĂ€ndigt.
NĂ€tverksinstĂ€llningar â specificera nĂ€tverksparametrar. NĂ€tverksplattform bör i de flesta fall vara Virtual Private Cloud (VPC). SĂ€kerhetsgrupper â sĂ€kerhetsgrupper för dina instanser. Eftersom vi kommer att anvĂ€nda en lastbalanserare framför instanserna, rekommenderar jag att ange en grupp hĂ€r som tillĂ„ter inkommande anslutningar endast frĂ„n lastbalanseraren. Det betyder att du kommer att ha 2 sĂ€kerhetsgrupper, en för lastbalanseraren som tillĂ„ter inkommande (inbound) anslutningar frĂ„n alla hĂ„ll pĂ„ portarna 80 (http) och 443 (https), och en andra för maskinerna som tillĂ„ter inkommande anslutningar pĂ„ alla portar frĂ„n lastbalanserarens grupp. UtgĂ„ende (outbound) anslutningar i bĂ„da grupperna mĂ„ste öppnas via TCP-protokollet pĂ„ alla portar till alla adresser. Du kan begrĂ€nsa portar och adresser för utgĂ„ende anslutningar, men dĂ„ mĂ„ste du stĂ€ndigt övervaka att du inte försöker ansluta till nĂ„gon stĂ€ngd port.
Lagring (volymer) â specificera diskparametrar för maskinerna. Diskens storlek kan inte vara mindre Ă€n vad som anges i AMI, för ECS-optimerad â 30 GiB.
Avancerade detaljer â specificera ytterligare parametrar.
Köpalternativ â vill vi köpa spottinstanser. Vi vill, men hĂ€r kommer vi inte att markera denna ruta, vi konfigurerar det i Auto Scaling Group, dĂ€r det finns fler alternativ.
IAM instansprofil â specificera rollen som instanserna ska startas med. För att instanserna ska fungera i ECS behövs rĂ€ttigheter som vanligtvis ligger i rollen ecsInstanceRole. I vissa fall kan den skapas, om inte, sĂ„ hĂ€r om hur man gör detta. Efter skapandet anger vi den i mallen.
DÀrefter följer mÄnga parametrar, i de flesta fall kan standardvÀrdena lÀmnas, men varje parameter har en tydlig beskrivning. Jag aktiverar alltid parametrarna EBS-optimera instans och T2/T3 Unlimited, om de anvÀnds instanser.
AnvĂ€ndardata â specificera anvĂ€ndardata. Vi kommer att redigera filen /etc/ecs/ecs.config, dĂ€r konfigurationen av ECS-agenten ligger.
Ett exempel pÄ hur anvÀndardata kan se ut:
#!/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 â parametern anger att instansen tillhör ett kluster med det angivna namnet, vilket innebĂ€r att detta kluster kan köra sina uppgifter pĂ„ den hĂ€r servern. Vi har Ă€nnu inte skapat ett kluster, men vi kommer att anvĂ€nda detta namn nĂ€r vi skapar ett.
ECS_ENABLE_SPOT_INSTANCE_DRAINING=true â parametern anger att nĂ€r ett slutsignal ges för en spotinstans, bör alla uppgifter pĂ„ den flyttas till statusen Draining.
ECS_CONTAINER_STOP_TIMEOUT=1m â parametern anger att efter att ha mottagit SIGINT-signalen har alla uppgifter 1 minut pĂ„ sig innan de stĂ€ngs av.
ECS_ENGINE_AUTH_TYPE=docker â parametern anger att Docker-schema anvĂ€nds som autentiseringsmetod.
ECS_ENGINE_AUTH_DATA=... â anslutningsparametrar för det privata container-registret dĂ€r dina Docker-bilder lagras. Om det Ă€r offentligt, behöver ingenting anges.
I den hÀr artikeln kommer jag att anvÀnda en offentlig bild frÄn Docker Hub, sÄ jag behöver inte ange parametrar. ECS_ENGINE_AUTH_TYPE och ECS_ENGINE_AUTH_DATA behöver inte anges.
Bra att veta: det rekommenderas att regelbundet uppdatera AMI, eftersom nya versioner uppdaterar versioner av Docker, Linux, ECS-agenten med mera. För att inte glömma detta kan man om nya versioner slÀpps. Du kan fÄ notifieringar via e-post och uppdatera manuellt, eller sÄ kan du skriva en Lambda-funktion som automatiskt skapar en ny version av Launch Template med den uppdaterade AMI:n.
EC2 Auto Scaling Group
Auto Scaling Group ansvarar för att starta och skala instanser. Hantering av grupper sker under EC2 -> Auto Scaling -> Auto Scaling Groups.
Launch template â vi vĂ€ljer den mall som skapades i föregĂ„ende steg. LĂ„t versionen vara standard.
Purchase options and instance types â vi anger instanstyper för klustret. Keep in launch template anvĂ€nder instanstypen frĂ„n Launch Template. Combine purchase options and instance types tillĂ„ter flexibilitet i instanstyper. Vi kommer att anvĂ€nda den.
Optional On-Demand base â antalet vanliga, icke-spotsinstanser som alltid kommer att vara aktiva.
On-Demand percentage above base â procentandelen av vanliga och spottinstanser, 50-50 kommer att fördela lika, 20-80 kommer att resultera i att 4 spottinstanser startas för varje vanlig instans. I det hĂ€r exemplet kommer jag att ange 50-50, men i verkligheten gör vi oftast 20-80, i vissa fall 0-100.
Instanstyper â hĂ€r kan du ange ytterligare typinstanser som ska anvĂ€ndas i klustret. Vi har aldrig anvĂ€nt detta eftersom jag inte riktigt förstĂ„r syftet. Kanske handlar det om begrĂ€nsningar för specifika typinstanser, men dessa kan enkelt ökas genom support. Om du kĂ€nner till nĂ„got tillĂ€mpningsomrĂ„de skulle jag gĂ€rna lĂ€sa om det i kommentarerna)

NĂ€tverk â nĂ€tverksinstĂ€llningar, vĂ€lj VPC och undernĂ€t för maskiner, i de flesta fall bör man vĂ€lja alla tillgĂ€ngliga undernĂ€t.
Lastbalansering â instĂ€llningar för lastbalanserare, men vi gör detta separat, hĂ€r rör vi inget. Sundhetskontroller kommer ocksĂ„ att konfigureras senare.
Gruppstorlek â anger begrĂ€nsningar för antalet maskiner i klustret och önskat antal maskiner vid start. Antalet maskiner i klustret kommer aldrig att bli mindre Ă€n det minimi angivna och mer Ă€n det maximala, Ă€ven om det baserat pĂ„ mĂ€tningar borde ske en skalning.
Skalningspolicyer â skalningsparametrar, men vi kommer att skala baserat pĂ„ de aktiva ECS-uppgifterna, sĂ„ vi kommer att stĂ€lla in skalning senare.
Skalningsskydd för instanser â skydd av instanser mot borttagning vid nedskalning. Vi aktiverar detta sĂ„ att ASG inte tar bort en maskin som har aktiva uppgifter. Att inaktivera skydd för instanser utan uppgifter kommer att göras av ECS Capacity Provider.
LĂ€gg till taggar â du kan ange taggar för instanser (för detta mĂ„ste rutan Tag new instances vara markerad). Jag rekommenderar att ange taggen Namn, sĂ„ att alla instanser som startas inom gruppen fĂ„r samma namn, vilket gör det lĂ€ttare att se dem i konsolen.

Efter att ha skapat gruppen, öppna den och gÄ till avsnittet Avancerade konfigurationer, varför alla alternativ inte syns i konsolen vid skapandet.
Borttagningspolicyer â regler som beaktas vid borttagning av instanser. De tillĂ€mpas i ordning. Vi anvĂ€nder vanligtvis sĂ„dana som pĂ„ bilden nedan. Först tas instanser med den Ă€ldsta Launch Template bort (till exempel, om vi har uppdaterat AMI, har vi fĂ„tt en ny version, men alla instanser hann övergĂ„ till den). Sedan vĂ€ljs instanser som ligger nĂ€rmast nĂ€sta berĂ€knade timme för fakturering. Och dĂ€refter vĂ€ljs de som Ă€r Ă€ldst baserat pĂ„ startdatum.

Bra att veta: för att uppdatera alla maskiner i klustret, Àr det bekvÀmt att anvÀnda . Om du kombinerar detta med Lambda-funktionen frÄn föregÄende steg, fÄr du ett helt automatiserat system för att uppdatera instanser. Innan du uppdaterar alla maskiner mÄste instansers skydd mot nedskala in stÀngas av för alla instanser i gruppen. Det handlar inte om instÀllningen i gruppen, utan om skyddet pÄ sjÀlva maskinerna, vilket görs pÄ fliken Instanshantering.
Application Load Balancer och EC2 Target Group
Balansieraren skapas under EC2 â Load Balancing â Load Balancers. Vi kommer att anvĂ€nda Application Load Balancer, och du kan lĂ€sa om jĂ€mförelsen mellan olika typer av balansierare pĂ„ .
Listeners â det Ă€r meningsfullt att skapa portarna 80 och 443 och att göra en omdirigering frĂ„n 80 till 443 med hjĂ€lp av balansierarens regler.
Availability Zones â i de flesta fall vĂ€ljer vi alla tillgĂ€nglighetszoner.
Configure Security Settings â hĂ€r anges SSL-certifikat för balansieraren, det mest bekvĂ€ma alternativet Ă€r i ACM. Du kan lĂ€sa om skillnaderna i Security Policy , den kan lĂ€mnas vald frĂ„n början ELBSecurityPolicy-2016-08 . Efter att balansieraren har skapats kommer du att se dessDNS-namn , som du mĂ„ste stĂ€lla in CNAME för din domĂ€n. SĂ„ hĂ€r ser det ut i Cloudflare.Security Group

â vi skapar eller vĂ€ljer en sĂ€kerhetsgrupp för balansieraren, mer om detta har jag skrivit tidigare i avsnittet EC2 Launch Template â NĂ€tverksinstĂ€llningar. Target group
â vi skapar en grupp som ansvarar för att dirigera förfrĂ„gningar frĂ„n balansieraren till maskinerna och kontrollerar deras tillgĂ€nglighet för att ersĂ€tta dem vid problem. Target type ska vara Instance, Protocol â alla, om du anvĂ€nder HTTPS för kommunikationen mellan balansieraren och instanserna, mĂ„ste du ladda certifikatet pĂ„ dem. I det hĂ€r exemplet kommer vi inte att göra det, utan bara lĂ€mna port 80. och Port â parametrar för att kontrollera tjĂ€nstens funktionalitet. I den verkliga tjĂ€nsten bör detta vara en separat begĂ€ran som implementerar viktiga delar av affĂ€rslogiken, i det hĂ€r exemplet lĂ€mnar jag standardinstĂ€llningarna. Sedan kan du vĂ€lja begĂ€rningsintervall, timeout, koder för framgĂ„ngsrika svar och mer. I vĂ„rt exempel angör vi framgĂ„ngskoder 200-399, eftersom Docker-avbildningen som kommer att anvĂ€ndas returnerar kod 304.
Sundhetskontroller Register Targets

â hĂ€r vĂ€ljs maskiner för gruppen, men i vĂ„rt fall kommer detta att hanteras av ECS, sĂ„ vi hoppar bara över detta steg. : pĂ„ balansierarens nivĂ„ kan du aktivera loggar som kommer att sparas i S3 i ett visst
Bra att vetaformat . DÀrifrÄn kan de exporterats till tredjepartstjÀnster för analys, eller sÄ kan man göra SQL-frÄgor direkt mot data i S3 med . Det Àr praktiskt och fungerar utan nÄgon extra kod. Jag rekommenderar ocksÄ att stÀlla in radering av loggar frÄn S3-bucketen efter en viss tidsperiod.
ECS Task Definition
I de tidigare stegen skapade vi allt som har att göra med tjĂ€nstens infrastruktur, nu gĂ„r vi vidare till beskrivningen av de containrar som vi kommer att köra. Detta görs i avsnittet ECS â Task Definitions.
Launch type compatibility â vĂ€lj EC2.
Task execution IAM role â vĂ€lj ecsTaskExecutionRole. Med den skrivs loggar, ge Ă„tkomst till hemliga variabler etc.
I avsnittet Container Definitions klickar vi pÄ Add Container.
Image â lĂ€nk till bilden med projektets kod, i detta exempel kommer jag att anvĂ€nda en offentlig bild frĂ„n Docker Hub .
Memory Limits â minnesgrĂ€nser för containern. Hard Limit â hĂ„rd grĂ€ns, om containern överstiger det angivna vĂ€rdet kommer kommandot docker kill att köras, containern dör omedelbart. Soft Limit â mjuk grĂ€ns, containern kan överstiga det angivna vĂ€rdet, men vid placering av uppgifter pĂ„ maskiner kommer denna parameter att beaktas. Till exempel, om maskinen har 4 GiB RAM och containerns mjuka grĂ€ns Ă€r 2048 MiB, kan det maximalt finnas 2 aktiva uppgifter med denna container pĂ„ denna maskin. I verkligheten Ă€r 4 GiB RAM nĂ„got mindre Ă€n 4096 MiB, vilket kan ses pĂ„ fliken ECS Instances i klustret. Mjuk grĂ€ns kan inte vara större Ă€n hĂ„rd grĂ€ns. Det Ă€r viktigt att förstĂ„ att om en uppgift har flera containrar sĂ„ summeras deras grĂ€nser.
Port mappings â i Host port anger 0, vilket betyder att porten kommer att tilldelas dynamiskt, den övervakas av Target Group. Container Port â porten dĂ€r din applikation körs, oftast anges den i körkommandot eller tilldelas i koden av din applikation, Dockerfile etc. För vĂ„rt exempel anvĂ€nder vi 3000, eftersom den anges i den anvĂ€nda bilden.
Health check â parametrar för att kontrollera hĂ€lso-statusen för containern, förvĂ€xla inte med den som stĂ€llts in i Target Group.
Environment â miljöinstĂ€llningar. CPU units â liknar pĂ„ minnesgrĂ€nser, men handlar om processorn. Varje processor kĂ€rna motsvarar 1024 enheter, sĂ„ om servern har en dubbelkĂ€rnig processor och containern har vĂ€rdet 512, kan 4 uppgifter med denna container köras pĂ„ en server. CPU-enheter motsvarar alltid antalet kĂ€rnor, de kan inte vara nĂ„got fĂ€rre som i fallet med minnet.
Kommando â kommandot för att starta tjĂ€nsten inuti containern, alla parametrar anges med kommatecken. Det kan vara gunicorn, npm och sĂ„ vidare. Om inget anges kommer vĂ€rdet frĂ„n CMD-direktivet i Dockerfile att anvĂ€ndas. Ange npm,start.
Miljövariabler â miljövariabler för containern. Dessa kan vara bĂ„de enkla textdata och hemliga variabler frĂ„n eller .
Lagring och loggning â hĂ€r kommer vi att konfigurera loggning i CloudWatch Logs (tjĂ€nsten för loggar frĂ„n AWS). Det rĂ€cker att aktivera rutan Auto-configure CloudWatch Logs. Efter skapandet av Task Definition kommer en logggrupp automatiskt att skapas i CloudWatch. Som standard lagras loggarna dĂ€r oĂ€ndligt, jag rekommenderar att Ă€ndra Retention period frĂ„n Never Expire till den önskade perioden. Detta görs i CloudWatch Log groups, klicka pĂ„ den aktuella perioden och vĂ€lj en ny.

ECS Kluster och ECS Kapacitetsleverantör
GĂ„ till avsnittet ECS â Clusters för att skapa ett kluster. VĂ€lj EC2 Linux + Networking som mall.
Kluster namn â mycket viktigt, vi gör hĂ€r samma namn som anges i Launch Template i parametern ECS_CLUSTER, i vĂ„rt fall â DemoApiClusterProd. Markera rutan Create an empty cluster. Valfritt kan Container Insights aktiveras för att se mĂ€tvĂ€rden för tjĂ€nster i CloudWatch. Om du har gjort allt rĂ€tt kommer du i avsnittet ECS Instances att se maskiner som skapades i Auto Scaling group.

GÄ till fliken Kapacitetsleverantörer och skapa en ny. Jag pÄminner om att den behövs för att hantera skapandet och avstÀngningen av maskiner beroende pÄ antalet aktiva ECS-tasker. Det Àr viktigt att notera att leverantören endast kan knytas till en grupp.
Auto Scaling group â vĂ€lj den tidigare skapade gruppen.
Hantera skalning â aktivera sĂ„ att leverantören kan skala tjĂ€nsten.
MĂ„lkapacitet % â vilken procentbelastning av maskiner med uppgifter vi behöver. Om du anger 100 % kommer alla maskiner alltid att vara upptagna med aktiva uppgifter. Om du anger 50 % kommer hĂ€lften av maskinerna alltid vara lediga. I sĂ„ fall, om det finns en plötslig ökning i belastningen, kommer nya uppgifter omedelbart att gĂ„ till de lediga maskinerna utan att behöva vĂ€nta pĂ„ att instanserna ska rullas ut.
Hantera avslutningsskydd â vi aktiverar detta parameter som tillĂ„ter leverantören att ta bort skyddet för instanser frĂ„n borttagning. Detta sker nĂ€r det inte finns nĂ„gra aktiva uppgifter pĂ„ maskinen och möjliggör Target capacity %.
ECS-tjÀnst och instÀllning av skalning
Sista steget :) För att skapa en tjÀnst mÄste du gÄ in i den tidigare skapade klustern pÄ fliken TjÀnster.
Lanseringstyp â du mĂ„ste klicka pĂ„ Switch to capacity provider strategy och vĂ€lja den tidigare skapade leverantören.

Uppgiftsdefinition â vi vĂ€ljer den tidigare skapade uppgiftsdefinitionen och dess version.
TjĂ€nstnamn â för att inte blanda ihop, anger vi alltid samma namn som uppgiftsdefinitionen.
TjĂ€nsttyp â alltid Replica.
Antal uppgifter â önskat antal aktiva uppgifter i tjĂ€nsten. Denna parameter styrs av skalning, men den mĂ„ste fortfarande anges.
Minimalt hĂ€lsoprocent och Maximalt procent â bestĂ€mmer beteendet för uppgifter vid distribution. StandardvĂ€rdena 100 och 200 innebĂ€r att antalet uppgifter vid distribution ökar med en faktor och sedan Ă„tergĂ„r till önskat antal. Om du har 1 uppgift, min=0 och max=100, kommer den att dödas vid distribution, och sedan kommer en ny att startas, vilket innebĂ€r död tid. Om 1 uppgift fungerar, min=50, max=150, dĂ„ kommer distribution överhuvudtaget inte att ske, eftersom 1 uppgift inte kan delas i hĂ€lften eller ökas med en och en halv gĂ„ng.
Distributionstyp â vi lĂ€mnar Rolling update.
Placering smallar â regler för placering av uppgifter pĂ„ maskiner. Som standard stĂ„r det AZ Balanced Spread â detta innebĂ€r att varje ny uppgift kommer att placeras pĂ„ en ny instans tills alla maskiner i alla tillgĂ€nglighetszoner startas. Vi gör vanligtvis BinPack â CPU och Spread â AZ, under denna policy placeras uppgifter sĂ„ nĂ€ra varandra som möjligt per maskin enligt CPU. Vid behov av att skapa en ny maskin skapas den i en ny tillgĂ€nglighetszon.

Lastbalanserartyp â vi vĂ€ljer Application Load Balancer.
TjĂ€nst IAM-roll â vi vĂ€ljer ecsServiceRole.
Lastbalanserarnamn â vi vĂ€ljer den tidigare skapade lastbalanseraren.
HĂ€lsokontrollspĂ€rrperiod â paus före utförande av hĂ€lsokontroller efter distribution av en ny uppgift, vi sĂ€tter vanligtvis 60 sekunder.
BehĂ„llare för att lastbalansera â i fĂ€ltet Target group name vĂ€ljer vi den tidigare skapade gruppen, och allt kommer att fyllas i automatiskt.

Service Auto Scaling â instĂ€llningar för tjĂ€nstens skalning. VĂ€lj Configure Service Auto Scaling för att justera önskat antal pĂ„ din tjĂ€nst. Ange minimi- och maximala antalet uppgifter vid skalning.
IAM-roll för Service Auto Scaling â vi vĂ€ljer AWSServiceRoleForApplicationAutoScaling_ECSService.
Automatiska uppgiftsskaleringspolicyer â regler för skalning. Det finns tvĂ„ typer:
- Target tracking â övervakning av en mĂ„lmetrik (CPU/RAM-anvĂ€ndning eller antal förfrĂ„gningar per uppgift). Till exempel, vi vill att den genomsnittliga CPU-belastningen ska vara 85%, nĂ€r den blir högre kommer nya uppgifter att lĂ€ggas till tills den nĂ„r mĂ„lvĂ€rdet. Om belastningen Ă€r lĂ€gre kommer uppgifterna att tas bort, om inte skydd mot nedskalning Ă€r aktiverat (Disable scale-in).
- Step scaling â respons pĂ„ ett vilkorat evenemang. HĂ€r kan vi stĂ€lla in reaktionen pĂ„ vilket som helst evenemang (CloudWatch Alarm), nĂ€r det intrĂ€ffar kan vi lĂ€gga till eller ta bort ett angivet antal uppgifter, eller ange ett exakt antal uppgifter.
TjÀnsten kan ha flera skalningsregler, vilket kan vara anvÀndbart, men det Àr viktigt att se till att de inte stöter pÄ varandra.
Slutsats
Om du följde instruktionerna och anvÀnde samma Docker-image, bör din tjÀnst returnera en sÄdan sida.

- Vi har skapat en mall som alla maskiner i tjÀnsten startas med. Vi har ocksÄ lÀrt oss att uppdatera maskinerna vid Àndring av mallen.
- Vi har stÀllt in hantering av stopp-signaler för spottinstanser, sÄ inom en minut efter att den mottas tas alla aktiva uppgifter bort frÄn maskinen, vilket gör att inget gÄr förlorat eller avbryts.
- Vi har lyft en belastningsutjÀmnare för att fördela lasten jÀmnt mellan maskinerna.
- Vi har skapat en tjÀnst som körs pÄ spottinstanser, vilket minskar kostnaderna för maskiner med cirka tre gÄnger.
- Vi har stÀllt in automatiskt skalande i bÄda riktningarna för att hantera ökad belastning, men samtidigt inte betala för stillestÄnd.
- Vi anvÀnder Capacity Provider sÄ att applikationen hanterar infrastrukturen (maskinerna), och inte tvÀrtom.
- Vi Àr duktiga.
Om du har förutsÀgbara hÀftiga belastningar, till exempel om du gör reklam i en stor e-postutskick, kan du stÀlla in skalning baserad pÄ .
Det Àr ocksÄ möjligt att skala baserat pÄ data frÄn olika delar av ditt system. Till exempel har vi funktionaliteten till anvÀndare av mobilappen. Ibland gÄr kampanjen ut till över 1M personer. Efter en sÄdan utskick ses alltid en stor ökning av API-förfrÄgningar, dÄ mÄnga anvÀndare loggar in pÄ appen samtidigt. SÄ om vi ser att kön för att skicka kampanjnotiser har ökat markant jÀmfört med standardnivÄerna, kan vi omedelbart starta nÄgra extra maskiner och uppgifter för att vara redo för belastningen.
Jag skulle bli glad om ni i kommentarerna delar intressanta fall av anvÀndning av spot-instanser och ECS eller nÄgot om skalning.
Snart kommer det artiklar om hur vi hanterar tusentals analystjÀnster per sekund pÄ en frÀmst serverlös stack (med kostnader) och hur distributionen av tjÀnster sker med hjÀlp av GitLab CI och Terraform Cloud.
Följ oss, det kommer bli intressant!
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
AnvÀnder ni spot-instanser i produktion?
22,2%Ja6
66,7%Nej18
11,1%Jag fick reda pÄ dem via en artikel, planerar att anvÀnda3
27 anvÀndare röstade. 5 anvÀndare avstod.
KĂ€lla: habr.com
