Come controllare automaticamente i prezzi spot di AWS?


15

Ho pensato a un lavoro di Jenkins per verificare i prezzi per le caselle degli agenti che abbiamo creato; ogni tanto il prezzo aumenta e passerà un'ora o due prima che qualcuno si accorga che non stanno arrivando nuovi agenti, quindi dobbiamo andare manualmente e controllare il prezzo spot e regolare di conseguenza, o cambiare zona, ecc.

Il mio primo istinto è stato che la strada migliore è quella di avere un lavoro Jenkins orario che esegue un aws ec2 describe-spot-instance-requestse verifica la presenza di richieste non riuscite (e quindi ci rallenta in caso di fallimento). Ma mi chiedo se esiste un metodo più pulito che prevede effettivamente il confronto dei prezzi rigidi (e quindi potrebbe dirci esattamente cosa non funziona e in che misura), piuttosto che guardare le richieste riuscite / non riuscite.

Qualcuno ha creato qualcosa di simile? Come hai fatto?


1
Domanda ragionevole, suppongo ... ma perché non dovresti semplicemente offrire ciò che le istanze valgono davvero per te, selezionare più tipi di istanze (incluse istanze più grandi di quelle di cui hai bisogno, che a volte sono più economiche quando aumentano i prezzi spot delle istanze più piccoli ... di tanto in tanto - incluso proprio ora mentre scrivo questo - mi ritrovo con un cc2.8xlarge, perché attualmente è più economico del c3.2xlarge di cui avevo bisogno, nonostante abbia 4x i core e 4x la memoria) e lasciare che il sistema gestisca l'istanza selezione del tipo e posizionamento AZ in base al mercato?
Michael - sqlbot,

1
@ Michael-sqlbot Non ho detto in quella parte del processo; disponiamo di documentazione attestante che acquistiamo una determinata dimensione di istanza a fini di controllo, quindi è ciò che ci consente di rimanere bloccati. Sto solo cercando di sfruttare al meglio una situazione unideale.
Alex,

1
Abbastanza giusto, @Alex. Ho pensato di buttarlo via, nel caso in cui non lo avessi considerato.
Michael - sqlbot,

@Alex Per interesse, è la dimensione di una determinata istanza in modo che possa essere vista facilmente sulle fatture? Perché tu (piuttosto, loro!) Potresti usare i tag e poi vederli in Cost Explorer.
Tim Malone,

Risposte:


15

Individuato uno strumento open source chiamato autospotting che potrebbe essere d'aiuto in questo:

Una volta abilitato su un gruppo esistente di AutoScaling su richiesta, avvia un'istanza spot EC2 più economica, almeno altrettanto grande e configurata in modo identico alle attuali istanze su richiesta. Non appena la nuova istanza è pronta, viene aggiunta al gruppo e un'istanza su richiesta viene staccata dal gruppo e terminata.

Abbiamo questo nella nostra pipeline di cose da fare, saremo in grado di aggiungere più contesto una volta finito.

Aggiornare:

Un altro strumento che è stato recentemente dimostrato in una conferenza è stato mapbox / spotwap

Funziona in modo leggermente diverso. Monitora un normale ASG con istanze su richiesta o riservate e quindi, in caso di scalabilità, offerte e disposizioni individuano istanze di livello di calcolo simile su un ASG separato.


2
Benvenuti nel sito, Hashfyre :)
Dawny33

1
Sono l'autore di AutoSpotting, grazie per averlo menzionato! Hai già provato? Sono pronto per il feedback degli utenti.
Cristian Măgherușan-Stanciu,

6

Personalmente prenderei in considerazione un modello come questo:

Timed Lambdas -> Checks spot price -> Push to ElastiCache

Quindi quando hai bisogno di istanze:

Timed lambdas -> Pulls spot price from ElastiCache, sets it as environment variable on your Machine where you spin up IaC from -> This is parsed as argument to IaC code and pushes out the spot price

Potresti anche impostare alcune tolleranze all'interno delle lambda (ovvero aumenti del 10, 25, 50% in base all'importanza) e un limite massimo di on-demand, ad esempio. È anche un ottimo posto per costruire la logica per gestire, ad esempio, trovare la AZ più economica, trovare il prezzo spot relativamente più basso ( 2xt2.mediumvs t2.large), ecc.


Solo per informazione, avresti potuto modificare la risposta eliminata e contrassegnarla per chiedere l'annullamento. (Nessun danno fatto, è solo informativo :))
Tensibai,

1
Lascerò la mia vergogna a perseverare per ricordarmi dei miei giorni sbagliati per l'eternità.
Henry,

Rofl, non c'è davvero vergogna, non ti preoccupare :)
Tensibai,

3
Le mie cicatrici definiscono chi sono
Henry,

Bella idea - potrebbe anche valere la pena ricordare che si potrebbe spingere il prezzo su una tabella DynamoDB, nel caso in cui non abbiano già un cluster ElastiCache in giro;). O forse anche un file JSON in un bucket S3.
Tim Malone,

4

Lascia che ti dia un modo agnostico di provare a farlo.

ogni tanto il prezzo aumenta e passerà un'ora o due prima che qualcuno si accorga che non stanno arrivando nuovi agenti, quindi dobbiamo andare manualmente e controllare il prezzo spot e regolare di conseguenza, o cambiare zona, ecc.

Abbiamo affrontato lo stesso problema nell'infrastruttura che stiamo costruendo. Quindi, abbiamo avuto if-elseblocchi di stile per impostare il prezzo dell'offerta, a seconda del prezzo su richiesta dell'istanza.

AWS ha un'API per ottenere il prezzo su richiesta di un'istanza. Abbiamo usato questo wrapper Python per lo scopo.

Quindi, una volta che abbiamo ottenuto il prezzo on-demand (diciamo X), abbiamo inserito in if-elseblocchi di stile, che sono 0.4*X, 0.6*X, 0.8*X, X, il che significa che stiamo cercando per un prezzo di offerta che varia del 40%, 60%, 80% della su -prezzo della domanda. Se tutto fallisce, allora stiamo tornando alla creazione di istanze su richiesta.

Inoltre, poiché questo è indipendente dagli attuali prezzi spot di AWS, non paghiamo mai un prezzo superiore al prezzo su richiesta.

Ma, se stai cercando un modo per farlo al volo, la soluzione di Hashfyre dovrebbe essere la strada da percorrere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.