Wie überprüfe ich AWS Spot Pricing automatisch?


15

Ich habe über einen Job bei Jenkins nachgedacht, um die Preise für die Agentenkisten zu überprüfen, die wir aufdrehen. Ab und zu steigt der Preis und es wird ein oder zwei Stunden dauern, bis jemand merkt, dass keine neuen Agenten kommen, und dann müssen wir manuell hineingehen und den Kassakurs überprüfen und entsprechend anpassen oder Zonen wechseln usw.

Mein erster Instinkt war, dass der beste Weg darin besteht, einen stündlichen Jenkins-Job auszuführen, der a aws ec2 describe-spot-instance-requestsausführt und nach fehlgeschlagenen Anforderungen sucht (und uns dann über einen Fehler hinwegtäuscht). Aber ich frage mich, ob es eine sauberere Methode gibt, bei der tatsächlich harte Preise verglichen werden (und daher genau angegeben werden kann, was und um wie viel passiert), anstatt erfolgreiche / fehlgeschlagene Anfragen zu prüfen.

Hat jemand etwas ähnliches eingerichtet? Wie hast du es gemacht?


1
Eine vernünftige Frage, denke ich ... aber warum sollten Sie nicht einfach bieten, was die Instanzen für Sie wirklich wert sind, mehrere Instanztypen auswählen (einschließlich Instanzen, die größer sind als das, was Sie benötigen, und die gelegentlich billiger sind, wenn die Spotpreise für kleinere Instanzen steigen ... gelegentlich - auch jetzt, wo ich dies schreibe - stelle ich fest, dass ich einen cc2.8xlarge habe, da dieser derzeit billiger ist als der c3.2xlarge, den ich benötigte, obwohl ich 4x die Kerne und 4x den Speicher habe) und lasse das System die Instanz handhaben Typenauswahl und AZ-Platzierung am Markt?
Michael - sqlbot

1
@ Michael-Sqlbot Ich habe nicht in diesem Teil des Prozesses zu sagen; Wir haben Unterlagen, die besagen, dass wir eine bestimmte Instanzgröße für Prüfungszwecke erwerben, und das ist es, woran wir festhalten. Ich versuche nur, das Beste aus einer unidealen Situation herauszuholen.
Alex

1
Fair genug, @Alex. Ich dachte nur, ich würde es einwerfen, falls Sie es nicht in Betracht gezogen hatten.
Michael - sqlbot

@Alex Ist die bestimmte Instanzgröße aus Gründen des Interesses so, dass sie leicht auf Rechnungen angezeigt werden kann? Weil Sie (eher sie!) Umbauten benutzen und sie im Kostenforscher dann sehen konnten.
Tim Malone

Antworten:


15

Es wurde ein Open Source-Tool namens Autospotting entdeckt , das möglicherweise dabei hilft:

Nach der Aktivierung in einer vorhandenen On-Demand-AutoScaling-Gruppe wird eine EC2-Spot-Instanz gestartet, die kostengünstiger, mindestens so groß und identisch mit Ihren aktuellen On-Demand-Instanzen konfiguriert ist. Sobald die neue Instanz bereit ist, wird sie der Gruppe hinzugefügt und eine On-Demand-Instanz wird von der Gruppe getrennt und beendet.

Wir haben dies in unserer zu erledigenden Pipeline. Sobald wir damit fertig sind, können wir mehr Kontext hinzufügen.

Aktualisieren:

Ein weiteres Tool, das kürzlich in einer Konferenz vorgeführt wurde, war Mapbox / Spotswap

Das funktioniert etwas anders. Es überwacht eine normale ASG entweder mit On-Demand- oder Reserved-Instanzen und stellt dann, falls sich eine Skalierung ergibt, Gebote und Provisionen auf einer separaten ASG für Instanzen mit ähnlichem Rechenlevel zur Verfügung.


2
Willkommen auf der Seite, Hashfyre :)
Dawny33

1
Ich bin der Autor von AutoSpotting, danke, dass Sie es erwähnt haben! Hast du es schon ausprobiert? Ich bin ganz Ohr für Benutzer-Feedback.
Cristian Măgherușan-Stanciu

6

Ich persönlich würde ein Modell wie dieses in Betracht ziehen:

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

Dann, wenn Sie Instanzen benötigen:

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

Sie können auch einige Toleranzen innerhalb der Lambdas (dh 10, 25, 50% Erhöhungen je nach Wichtigkeit) und eine feste Obergrenze für On-Demand festlegen. Es ist auch ein großartiger Ort, um die Logik zu entwickeln, um beispielsweise den billigsten AZ, den relativ billigsten Spot-Preis ( 2xt2.mediumvs t2.large) usw. zu finden.


Sie haben die gelöschte Antwort möglicherweise nur zur Information bearbeitet und markiert, um die Löschung rückgängig zu machen. (Kein Schaden angerichtet, es ist nur informativ :))
Tensibai

1
Ich werde meine Schande durchhalten lassen, um mich für alle Ewigkeit an meine fehlgeleiteten Tage zu erinnern.
Henry

Rofl, es ist wirklich keine Schande, keine Sorge :)
Tensibai

3
Meine Narben definieren, wer ich bin
Henry

Coole Idee - könnte auch erwähnenswert sein, dass man den Preis auf eine DynamoDB-Tabelle drücken könnte, falls noch kein ElastiCache-Cluster herumliegt;). Oder vielleicht sogar eine JSON-Datei in einem S3-Bucket.
Tim Malone

4

Lassen Sie mich Ihnen eine werkzeugunabhängige Möglichkeit geben, dies zu versuchen.

Ab und zu steigt der Preis und es wird ein oder zwei Stunden dauern, bis jemand merkt, dass keine neuen Agenten auftauchen, und dann müssen wir manuell hineingehen und den Kassakurs überprüfen und entsprechend anpassen oder Zonen wechseln usw

Wir hatten das gleiche Problem mit der Infrastruktur, die wir aufbauen. Wir hatten also if-elseStilblöcke, um den Gebotspreis abhängig vom On-Demand-Preis der Instanz festzulegen.

AWS verfügt über eine API zum Abrufen des On-Demand-Preises einer Instanz. Wir haben diesen Python-Wrapper für diesen Zweck verwendet.

Also, wenn wir die On-Demand - Preis bekommen (sagen wir mal X), wir gesteckt if-elseArtblöcke, die sind 0.4*X, 0.6*X, 0.8*X, X, die Mittel , die wir für einen Geldkurs im Bereich von 40% versuchen, 60%, 80% des auf -nachfrage preis. Wenn alles fehlschlägt, greifen wir auf die Erstellung von On-Demand-Instanzen zurück.

Da dies unabhängig von den aktuellen Spotpreisen von AWS ist, zahlen wir niemals einen Preis über dem On-Demand-Preis.

Wenn Sie jedoch nach einer Möglichkeit suchen, dies im Handumdrehen zu tun, ist die Lösung von Hashfyre der richtige Weg.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.