Eficiență la scară: o poveste despre optimizarea costurilor AWS

Publicat: 2022-07-22

Am lansat recent o platformă de analiză a criptomonedei, așteptând un număr mic de utilizatori zilnici. Cu toate acestea, când unii YouTuber populari au găsit site-ul util și au publicat o recenzie, traficul a crescut atât de repede încât a supraîncărcat serverul, iar platforma (Scalper.AI) a devenit inaccesibilă. Mediul meu original AWS EC2 avea nevoie de suport suplimentar. După ce am luat în considerare mai multe soluții, am decis să folosesc AWS Elastic Beanstalk pentru a-mi scala aplicația. Lucrurile arătau bine și mergeau fără probleme, dar am fost surprins de costurile din tabloul de bord de facturare.

Aceasta nu este o problemă neobișnuită. Un sondaj din 2021 a constatat că 82% dintre factorii de decizie din IT și cloud s-au confruntat cu costuri inutile pentru cloud, iar 86% nu cred că pot obține o imagine cuprinzătoare a tuturor cheltuielilor lor pentru cloud. Deși Amazon oferă o prezentare detaliată a cheltuielilor suplimentare în documentația sa, modelul de prețuri este complex pentru un proiect în creștere. Pentru a face lucrurile mai ușor de înțeles, voi detalia câteva optimizări relevante pentru a reduce costurile cloud.

De ce am ales AWS

Scopul Scalper.AI este de a colecta informații despre perechile de criptomonede (activele schimbate la tranzacționarea pe o bursă), de a efectua analize statistice și de a oferi comercianților de criptomonede informații despre starea pieței. Structura tehnică a platformei este formată din trei părți:

  • Scripturi de asimilare a datelor
  • Un server web
  • O bază de date

Scripturile de asimilare adună date din diferite surse și le încarcă în baza de date. Aveam experiență de lucru cu serviciile AWS, așa că am decis să implementez aceste scripturi prin configurarea instanțelor EC2. EC2 oferă multe tipuri de instanțe și vă permite să alegeți procesorul, stocarea, rețeaua și sistemul de operare ale unei instanțe.

Am ales Elastic Beanstalk pentru funcționalitatea rămasă, deoarece promitea o gestionare fără probleme a aplicațiilor. Echilibratorul de încărcare a distribuit în mod corespunzător sarcina între instanțele serverului meu, în timp ce caracteristica de autoscaling s-a ocupat de adăugarea de noi instanțe pentru o încărcare crescută. Implementarea actualizărilor a devenit foarte ușoară, durând doar câteva minute.

Scalper.AI a funcționat stabil, iar utilizatorii mei nu s-au mai confruntat cu perioade de nefuncționare. Desigur, mă așteptam la o creștere a cheltuielilor de când am adăugat servicii suplimentare, dar cifrele au fost mult mai mari decât prevăzusem.

Cum aș fi putut reduce costurile cloud

Privind în urmă, au existat multe domenii de complexitate în utilizarea serviciilor AWS de către proiectul meu. Vom examina optimizările bugetare pe care le-am descoperit în timp ce lucram cu funcții comune AWS EC2: instanțe de performanță burstable, transferuri de date în ieșire, adrese IP elastice și stări de terminare și oprire.

Instanțe de performanță burstable

Prima mea provocare a fost să susțin consumul de energie al procesorului pentru proiectul meu în creștere. Scripturile de asimilare de date ale Scalper.AI oferă utilizatorilor o analiză a informațiilor în timp real; scripturile rulează la fiecare câteva secunde și alimentează platforma cu cele mai recente actualizări de la schimburile cripto. Fiecare iterație a acestui proces generează sute de joburi asincrone, astfel încât traficul crescut al site-ului a necesitat mai multă putere CPU pentru a reduce timpul de procesare.

Cea mai ieftină instanță oferită de AWS cu patru vCPU, a1.xlarge, m-ar fi costat aproximativ 75 USD pe lună la momentul respectiv. În schimb, am decis să răspândesc încărcarea între două instanțe t3.micro cu două vCPU-uri și 1 GB de RAM fiecare. Instanțele t3.micro au oferit suficientă viteză și memorie pentru munca de care aveam nevoie la o cincime din costul a1.xlarge. Cu toate acestea, factura mea era încă mai mare decât mă așteptam la sfârșitul lunii.

În efortul de a înțelege de ce, am căutat în documentația Amazon și am găsit răspunsul: atunci când utilizarea CPU a unei instanțe scade sub o linie de bază definită, aceasta colectează credite, dar când instanța depășește utilizarea liniei de bază, consumă creditele câștigate anterior. Dacă nu există credite disponibile, instanța cheltuiește „creditele excedentare” oferite de Amazon. Această capacitate de a câștiga și cheltui credite face ca Amazon EC2 să utilizeze o medie a procesorului unei instanțe în 24 de ore. Dacă utilizarea medie depășește valoarea de bază, instanța este facturată suplimentar la o rată fixă ​​pe oră vCPU.

Am monitorizat cazurile de asimilare de date timp de mai multe zile și am constatat că configurarea procesorului meu, care avea scopul de a reduce costurile, a făcut opusul. De cele mai multe ori, utilizarea medie a CPU a fost mai mare decât valoarea de bază.

O diagramă are trei selecții drop-down alese în partea de sus a ecranului. Primele două, din stânga, sunt „10 februarie 2022 - 19 februarie 2022” și „Zilnic”, urmate de un mic „i” încercuit. Al treilea este în partea dreaptă a ecranului și spune „Linie” cu un simbol pentru un grafic cu linii. Sub selecțiile drop-down, diagrama conține două grafice cu linii cu filtre. În partea de sus, linia de filtru afișează „Grupați după: Tip de utilizare” (filtrul selectat, care are un fundal albastru) și apoi afișează filtrele neselectate: „Serviciu, Cont conectat, Regiune, Tip de instanță, Resurse, Categorie de cost, Etichetă , Mai mult”, cu „Resurse” în culoarea gri și ultimele trei având lângă ele săgeți derulante. Graficul liniei de sus are „Costuri ($)” pe axa y, variind de la 0,0 la 2,5. Graficul liniei de jos are „Utilizare (vCPU-Ore)” pe axa y, variind de la 0 la 40. Ambele grafice cu linii au date etichetate pe axa x, variind de la 10 februarie la 19 februarie, și o cheie etichetându-și liniile violet: „USE2-CPUCredits:t3”. Graficul liniei superioare are aproximativ opt puncte conectate liniar și are tendințe în sus de-a lungul timpului: un punct în jurul valorii de (10 februarie, 0,3 USD), un al doilea în jurul valorii de (11 februarie, 0,6 USD), un al treilea în jurul valorii de (12 februarie, 0,5 USD), un a patra în jurul valorii de (14 februarie, 2,1 USD), o a cincea în jurul valorii de (15 februarie, 2,4 USD), a șasea în jurul valorii de (16 februarie, 2,3 USD), o a șaptea în jurul valorii de (18 februarie, 2,3 USD) și o a opta în jurul valorii (feb. 19, 2,6 USD). Graficul liniei de jos are, de asemenea, aproximativ opt puncte conectate liniar și are tendințe în sus de-a lungul timpului: un punct în jur (feb-10, 5 vCPU-Hours), un al doilea în jur (feb-11, 15 vCPU-hours), un al treilea în jurul valorii (feb. -12, 10 vCPU-hours), o al patrulea în jur (feb-14, 40 vCPU-ore), o cincime în jur (feb-15, 50 vCPU-ore), o al șaselea aproximativ (feb-16, 45 vCPU-ore) , o a șaptea în jurul valorii de (18 februarie, 45 de ore vCPU) și o a opta în jurul valorii de (19 februarie, 55 de ore vCPU).
Graficul de mai sus afișează creșterea costurilor (graficul de sus) și creșterea utilizării creditului CPU (graficul de jos) într-o perioadă în care utilizarea procesorului a fost peste linia de bază. Costul în dolari este proporțional cu surplusul de credite cheltuit, deoarece instanța este facturată pe oră vCPU.

Am analizat inițial utilizarea procesorului pentru câteva perechi cripto; sarcina era mică, așa că am crezut că am destul spațiu pentru creștere. (Am folosit doar o microinstanță pentru asimilarea datelor, deoarece mai puține perechi criptografice nu necesitau atât de multă putere CPU.) ​Cu toate acestea, mi-am dat seama de limitările analizei mele inițiale odată ce am decis să-mi fac cunoștințele mai cuprinzătoare și să susțin asimilarea datelor. pentru sute de perechi cripto — analiza serviciului cloud nu înseamnă nimic decât dacă este efectuată la scara corectă.

Transferuri de date de ieșire

Un alt rezultat al extinderii site-ului meu a fost creșterea transferurilor de date din aplicația mea din cauza unei mici erori. Cu traficul în creștere constantă și fără mai multe timpi de nefuncționare, trebuia să adaug funcții pentru a capta și a reține atenția utilizatorilor cât mai curând posibil. Cea mai recentă actualizare a mea a fost o alertă audio declanșată atunci când condițiile de piață ale unei perechi criptografice se potriveau cu parametrii predefiniți ai utilizatorului. Din păcate, am făcut o greșeală în cod și fișierele audio s-au încărcat în browserul utilizatorului de sute de ori la fiecare câteva secunde.

Impactul a fost uriaș. Bug-ul meu a generat descărcări audio de pe serverele mele web, provocând transferuri suplimentare de date. O mică eroare în codul meu a dus la o factură de aproape cinci ori mai mare decât cele anterioare. (Aceasta nu a fost singura consecință: eroarea ar putea provoca o scurgere de memorie în computerul utilizatorului, așa că mulți utilizatori au încetat să mai revină.)

O diagramă similară cu cea anterioară, dar cu primul drop-down menționând „06 ianuarie 2022 - 15 ianuarie 2022”, „Costurile ($)” din graficul din linia superioară variind de la 0 la 30, iar graficul din linia de jos având „ Utilizare (GB)" pe axa y, variind de la 0 la 300. Ambele grafice cu linii au date etichetate pe axa x, variind de la 06 ianuarie la 15 ianuarie, și o cheie care etichetează liniile lor violet: "USE2- DataTransfer-Out-Bytes." Graficul liniei de sus are aproximativ opt puncte conectate liniar și are tendințe în sus de-a lungul timpului: un punct în jurul valorii de (Ian-06, 2 USD), un al doilea în jurul valorii (Ian-08, 4 USD), un al treilea în jurul valorii de (Ian-09, 7 USD), un a patra în jurul valorii de (10 ianuarie, 6 USD), o a cincea în jurul valorii de (12 ianuarie, 15 USD), a șasea în jurul valorii de (13 ianuarie, 25 USD), o a șaptea în jurul valorii de (14 ianuarie, 24 USD) și o a opta în jurul valorii (ian. 15, 29 USD). Graficul liniei de jos are, de asemenea, aproximativ opt puncte conectate liniar și tendințe în sus de-a lungul timpului: un punct în jurul valorii de (06 ianuarie, 10 GB), un al doilea în jurul valorii de (8 ianuarie, 50 GB), un al treilea în jurul valorii de (09 ianuarie, 80). GB), a patra în jur (10 ianuarie, 70 GB), a cincea în jurul valorii de (12 ianuarie, 160 GB), a șasea în jurul valorii de (13 ianuarie, 270 GB), o a șaptea aproximativ (14 ianuarie, 260 GB) , și o opta în jur (15 ianuarie, 320 GB).
Graficul de mai sus afișează creșterea costurilor (graficul de sus) și transferurile de date în creștere (graficul de jos). Deoarece transferurile de date de ieșire sunt facturate pe GB, costul în dolari este proporțional cu utilizarea datelor de ieșire.

Costurile de transfer de date pot reprezenta mai mult de 30% din creșterea prețurilor AWS. Transferul de intrare EC2 este gratuit, dar taxele de transfer de ieșire sunt facturate pe GB (0,09 USD per GB când am creat Scalper.AI). După cum am învățat pe calea grea, este important să fii precaut cu codul care afectează datele de ieșire; reducerea descărcărilor sau a încărcării fișierelor acolo unde este posibil (sau monitorizarea atentă a acestor zone) vă va proteja de taxe mai mari. Acești bănuți se adună rapid, deoarece taxele pentru transferul de date de la EC2 pe internet depind de volumul de muncă și de tarifele specifice regiunii AWS. O ultimă avertizare necunoscută pentru mulți clienți noi AWS: transferul de date devine mai scump între diferite locații. Cu toate acestea, utilizarea adreselor IP private poate preveni costurile suplimentare de transfer de date între diferite zone de disponibilitate ale aceleiași regiuni.

Adrese IP elastice

Chiar și atunci când utilizați adrese publice, cum ar fi adrese IP elastice (EIP), este posibil să vă reduceți costurile EC2. EIP-urile sunt adrese IPv4 statice utilizate pentru cloud computing dinamic. Partea „elastică” înseamnă că puteți aloca un EIP oricărei instanțe EC2 și îl puteți utiliza până când alegeți să opriți. Aceste adrese vă permit să schimbați fără probleme instanțe nesănătoase cu altele sănătoase, remapând adresa la o altă instanță din contul dvs. De asemenea, puteți utiliza EIP-urile pentru a specifica o înregistrare DNS pentru un domeniu, astfel încât să trimită către o instanță EC2.

AWS furnizează doar cinci EIP-uri per cont pe regiune, ceea ce le face o resursă limitată și costisitoare cu utilizare ineficientă. AWS percepe un tarif orar scăzut pentru fiecare EIP suplimentar și facturează suplimentar dacă remapați un EIP de mai mult de 100 de ori într-o lună; rămânerea sub aceste limite va reduce costurile.

Terminați și opriți statele

AWS oferă două opțiuni pentru gestionarea stării de rulare a instanțelor EC2: terminare sau oprire. Terminarea va închide instanța, iar mașina virtuală prevăzută pentru aceasta nu va mai fi disponibilă. Toate volumele Elastic Block Store (EBS) atașate vor fi detașate și șterse, iar toate datele stocate local în instanță se vor pierde. Nu veți mai fi taxat pentru instanță.

Oprirea unei instanțe este similară, cu o mică diferență. Volumele EBS atașate nu sunt șterse, astfel încât datele lor sunt păstrate și puteți reporni instanța în orice moment. În ambele cazuri, Amazon nu mai taxează pentru utilizarea instanței, dar dacă optați pentru oprire în loc de terminare, volumele EBS vor genera un cost atâta timp cât există. AWS recomandă oprirea unei instanțe numai dacă vă așteptați să o reactivați în curând.

Dar există o caracteristică care vă poate mări factura AWS la sfârșitul lunii, chiar dacă ați terminat o instanță în loc să o opriți: instantanee EBS. Acestea sunt copii de siguranță incrementale ale volumelor dvs. EBS stocate în Serviciul de stocare simplu (S3) al Amazon. Fiecare instantaneu conține informațiile de care aveți nevoie pentru a crea un nou volum EBS cu datele dumneavoastră anterioare. Dacă închideți o instanță, volumele EBS asociate acesteia vor fi șterse automat, dar instantaneele acesteia vor rămâne. Deoarece S3 se încarcă în funcție de volumul de date stocat, vă recomand să ștergeți aceste instantanee dacă nu le veți folosi în scurt timp. AWS oferă capacitatea de a monitoriza activitatea de stocare pe volum folosind serviciul CloudWatch:

  1. În timp ce sunteți conectat la Consola AWS, din meniul Servicii din stânga sus, găsiți și deschideți serviciul CloudWatch.
  2. În partea stângă a paginii, sub meniul restrâns Metrics , faceți clic pe Toate valorile .
  3. Pagina arată o listă de servicii cu valori disponibile, inclusiv EBS, EC2, S3 și multe altele. Faceți clic pe EBS și apoi pe Valori per volum . (Notă: opțiunea EBS va fi vizibilă numai dacă aveți volume EBS configurate în cont.)
  4. Faceți clic pe fila Interogare . În vizualizarea Editor , copiați și inserați comanda SELECT AVG(VolumeReadBytes) FROM "AWS/EBS" GROUP BY VolumeId și apoi faceți clic pe Run . (Notă: CloudWatch folosește un dialect al SQL cu o sintaxă unică.)

Apare o pagină web cu un meniu de antet albastru închis în partea de sus a paginii, care de la stânga la dreapta include sigla aws, un meniu derulant „Servicii”, o bară de căutare, o pictogramă de cod, o pictogramă clopoțel, o pictogramă semn de întrebare, un text derulant care scrie „N. Virginia” și un text derulant cu „Toptal Test Account”. Dedesubt, vedem partea principală a paginii web în alb. În partea stângă a paginii există un meniu derulant cu titlul „CloudWatch” și un „X”. Dedesubt, de sus în jos, meniul scrie: „Preferate și recente”, „Tablouri de bord”, „Alarme” (îngroșat, cu trei meniuri derulante: „În alarmă”, „Toate alarmele” și „Facturare”), „Jurnale” (îngroșate, cu două meniuri derulante: „Grupuri de jurnale” și „Informații despre jurnalele”), „Metrici” (îngroșate, cu trei meniuri derulante: „Toate valorile”, care este evidențiată cu portocaliu strălucitor, „ Explorer” și „Streams”), „Urmele X-Ray” (cu caractere aldine), „Evenimente” (cu aldine) și „Monitorizarea aplicației” (cu aldine). Tot textul îngroșat din meniu are un triunghi de meniu derulant în stânga textului. Mijlocul paginii web afișează un grafic în jumătatea superioară a paginii și un editor în jumătatea inferioară a paginii. Graficul are două linii de anteturi. Prima linie citește „CloudWatch > Valori” în stânga (cu textul „CloudWatch” în albastru) și „Comutați la interfața originală” în albastru în dreapta. A doua linie scrie „Grafic fără titlu” cu o pictogramă de editare în stânga și afișează opțiuni în dreapta: „1h, 3h, 12h, 1d, 3d, 1w, Personalizat” (cu „3h” în albastru și „Personalizat” având o pictogramă calendar), „Linie” (cu o pictogramă drop-down), „Acțiuni” (cu o pictogramă drop-down) și un buton de reîmprospătare cu o pictogramă drop-down. Graficul propriu-zis are text în centru: „Graficul dvs. CloudWatch este gol. Selectați câteva valori pentru a apărea aici”. Editorul are și două rânduri de anteturi. Prima linie citește „Răsfoiește”, „Interogare” (evidențiată cu portocaliu), „Valori grafice”, „Opțiuni” și „Sursă” în stânga și „Adăugați matematică” (cu o pictogramă drop-down) și „Adăugați interogare" (cu o pictogramă drop-down) în partea dreaptă. A doua linie citește „Metrics Insights - editor de interogări” și „Informații” (în albastru) în stânga și „Builder” și „Editor” (cu „Editor” selectat) în dreapta. Sub editor este un buton portocaliu „Run” în stânga, iar textul „Utilizați Ctrl + Enter pentru a rula interogarea, Ctrl + Spațiu pentru a completa automat” în dreapta. În partea dreaptă a paginii web există un meniu alb, care citește „Interogări” și „Ajutor” de sus în jos.
O prezentare generală a configurației de monitorizare CloudWatch descrisă mai sus (afișată cu date goale și fără valori selectate). Dacă aveți instanțe EBS, EC2 sau S3 existente în cont, acestea vor apărea ca opțiuni de metrică și vor popula graficul CloudWatch.

CloudWatch oferă o varietate de formate de vizualizare pentru analiza activității de stocare, cum ar fi diagrame circulare, linii, bare, diagrame cu suprafețe stivuite și numere. Utilizarea CloudWatch pentru a identifica volumele și instantaneele EBS inactive este un pas ușor către optimizarea costurilor cloud.

Bani în plus în buzunarul tău

Deși instrumentele AWS precum CloudWatch oferă soluții decente pentru monitorizarea costurilor în cloud, diverse platforme externe se integrează cu AWS pentru o analiză mai cuprinzătoare. De exemplu, platformele de management în cloud precum CloudHealth de la VMWare arată o defalcare detaliată a principalelor domenii de cheltuieli care pot fi utilizate pentru analiza tendințelor, detectarea anomaliilor și monitorizarea costurilor și performanței. De asemenea, vă recomand să configurați o alarmă de facturare CloudWatch pentru a detecta orice creștere a taxelor înainte ca acestea să devină excesive.

Amazon oferă multe servicii cloud grozave care vă pot ajuta să delegați munca de întreținere a serverelor, bazelor de date și hardware-ului echipei AWS. Deși costurile platformei cloud pot crește cu ușurință din cauza erorilor sau erorilor utilizatorilor, instrumentele de monitorizare AWS oferă dezvoltatorilor cunoștințele necesare pentru a se apăra de cheltuieli suplimentare.

Având în vedere aceste optimizări ale costurilor, sunteți gata să vă demarați proiectul și să economisiți sute de dolari în acest proces.

Sigla AWS cu cuvântul „PARTENER” și textul „Servicii de nivel avansat” dedesubt.
În calitate de partener de consultanță avansată în Amazon Partner Network (APN), Toptal oferă companiilor acces la experți certificați de AWS, la cerere, oriunde în lume.