Eficiență la scară: o poveste despre optimizarea costurilor AWS
Publicat: 2022-07-22Am 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ă.
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ă.)
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:
- În timp ce sunteți conectat la Consola AWS, din meniul Servicii din stânga sus, găsiți și deschideți serviciul CloudWatch.
- În partea stângă a paginii, sub meniul restrâns Metrics , faceți clic pe Toate valorile .
- 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.)
- 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ă.)
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.