Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Anleitung zur Amazon EC2 Spot-Instance
Dieses Tutorial zeigt Ihnen, wie Sie Amazon EC2 Spot-Instances verwalten. AWS SDK for .NET
Übersicht
Mit Spot-Instances können Sie ungenutzte EC2 Amazon-Kapazität für weniger als den On-Demand-Preis anfordern. Dadurch können Sie Ihre EC2 Kosten für Anwendungen, die unterbrochen werden können, erheblich senken.
Im Folgenden finden Sie eine allgemeine Zusammenfassung darüber, wie Spot-Instances angefordert und verwendet werden.
-
Erstellen Sie eine Spot-Instance-Anfrage und geben Sie den Höchstpreis an, den Sie zu zahlen bereit sind.
-
Wenn die Anfrage erfüllt ist, führen Sie die Instance wie jede andere EC2 Amazon-Instance aus.
-
Führen Sie die Instance so lange aus, wie Sie möchten, und beenden Sie sie dann, es sei denn, der Spot-Preis ändert sich so, dass die Instance für Sie beendet wird.
-
Bereinigen Sie die Spot-Instance-Anfrage, wenn Sie sie nicht mehr benötigen, sodass keine Spot-Instances mehr erstellt werden.
Dies war ein sehr allgemeiner Überblick über Spot-Instances. Weitere Informationen zu Spot-Instances finden Sie unter Spot-Instances im EC2Amazon-Benutzerhandbuch.
Über dieses Tutorial
Wenn Sie diesem Tutorial folgen, verwenden Sie den, AWS SDK for .NET um Folgendes zu tun:
-
Erstellt eine Spot-Instance-Anforderung
-
Ermitteln Sie, wann die Spot-Instance-Anfrage erfüllt wurde
-
Stornieren Sie die Spot-Instance-Anfrage
-
Beenden von dazugehörigen Instances
Die folgenden Abschnitte enthalten Auszüge und andere Informationen für dieses Beispiel. Der vollständige Code für das Beispiel wird hinter den Codefragmenten angezeigt und kann unverändert erstellt und ausgeführt werden.
Themen
Voraussetzungen
Informationen zu den Voraussetzungen APIs und den Voraussetzungen finden Sie im übergeordneten Abschnitt ()Mit Amazon arbeiten EC2.
Sammeln Sie, was Sie benötigen
Um eine Spot-Instance-Anfrage zu erstellen, benötigen Sie mehrere Dinge.
-
Die Anzahl der Instances und ihr Instance-Typ. Es stehen mehrere Instance-Typen zur Auswahl. Weitere Informationen finden Sie unter EC2Amazon-Instance-Typen im EC2Amazon-Benutzerhandbuch. Weitere Informationen finden Sie unter Details zum Instanztyp
und Instanztyp-Explorer . Die Standardzahl für dieses Tutorial ist 1.
-
Das Amazon Machine Image (AMI), das zur Erstellung der Instance verwendet wird. Weitere Informationen dazu AMIs finden Sie unter Amazon Machine Images (AMIs) im EC2Amazon-Benutzerhandbuch. Insbesondere siehe Suchen AMI und Teilen AMIs.
-
Der Höchstpreis, den Sie pro Instance-Stunde zu zahlen bereit sind. Sie können die Preise für alle Instance-Typen (sowohl für On-Demand-Instances als auch für Spot-Instances) auf der EC2Amazon-Preisseite
einsehen. Der Standardpreis für dieses Tutorial wird später erklärt.
-
Wenn Sie eine Remoteverbindung zu einer Instance herstellen möchten, eine Sicherheitsgruppe mit der entsprechenden Konfiguration und den entsprechenden Ressourcen. Eine Beschreibung dazu finden Sie unter Arbeiten mit Sicherheitsgruppen in Amazon EC2 und die Informationen zum Sammeln der benötigten Daten und zum Herstellen einer Verbindung zu einer Instanz finden Sie unterStarten einer EC2 Amazon-Instance. Der Einfachheit halber wird in diesem Tutorial die Sicherheitsgruppe mit dem Namen default verwendet, über die alle neueren AWS Konten verfügen.
Es gibt viele Möglichkeiten zum Anfordern von Spot-Instances. Die folgenden Strategien sind gebräuchlich:
-
Stellen Sie Anfragen, die mit Sicherheit weniger kosten als On-Demand-Preise.
-
Stellen Sie Anfragen auf der Grundlage des Werts der resultierenden Berechnung.
-
Stellen Sie Anfragen, um so schnell wie möglich Rechenkapazität zu erwerben.
Die folgenden Erläuterungen beziehen sich auf die Preisentwicklung für Spot-Instances im EC2Amazon-Benutzerhandbuch.
Sie haben eine Stapelverarbeitungsaufgabe, die einige Stunden oder Tage laufen wird. Allerdings sind Sie flexibel, was den Start und Abschluss angeht. Sie möchten die Aufgabe nach Möglichkeit günstiger als mit On-Demand-Instances abschließen.
Sie untersuchen den Spot-Price-Verlauf für Instance-Typen, indem Sie entweder die EC2 Amazon-Konsole oder Amazon verwenden EC2API. Nachdem Sie den Preisverlauf für Ihren gewünschten Instance-Typ in einer bestimmten Availability Zone analysiert haben, gibt es zwei alternative Ansätze für Ihr Gebot:
-
Geben Sie eine Anfrage am oberen Ende der Spanne der Spot-Preise an, die immer noch unter dem On-Demand-Preis liegen. Gehen Sie davon aus, dass Ihre einmalige Spot-Instance-Anfrage höchstwahrscheinlich erfüllt und für genügend aufeinanderfolgende Rechenzeit ausgeführt wird, um den Job abzuschließen.
-
Oder Sie geben ein Gebot am unteren Ende der Preisskala ab und planen die Kombination vieler Instances, die im Laufe der Zeit über eine persistente Anforderung starten. Die Instances würden zusammengenommen lange genug laufen, um die Aufgabe sogar zu noch geringeren Gesamtkosten abzuschließen.
Sie haben eine Aufgabe zur Datenverarbeitung, die ausgeführt werden soll. Sie kennen den Wert der Ergebnisse des Jobs gut genug, um zu wissen, wie viel sie in Bezug auf die Computerkosten wert sind.
Nachdem Sie den Spot-Price-Verlauf für Ihren Instance-Typ analysiert haben, wählen Sie einen Preis aus, bei dem die Kosten für die Rechenzeit nicht höher sind als der Wert der Ergebnisse des Jobs. Sie erstellen eine persistente Anforderung und lassen es zwischenzeitlich laufen, sobald der Spot-Preis Ihr Gebot erreicht ist oder darunter sinkt.
Sie haben einen unvorhergesehenen, kurzfristigen Bedarf an zusätzlicher Kapazität, der über On-Demand-Instances nicht verfügbar ist. Nachdem Sie den Spot-Price-Verlauf für Ihren Instance-Typ analysiert haben, wählen Sie einen Preis, der über dem höchsten historischen Preis liegt, um die Wahrscheinlichkeit zu erhöhen, dass Ihre Anfrage schnell bearbeitet wird, und setzen die Datenverarbeitung fort, bis sie abgeschlossen ist.
Nachdem Sie alles Notwendige zusammengetragen und eine Strategie ausgewählt haben, können Sie eine Spot-Instance anfordern. Für dieses Tutorial wird der standardmäßige Höchstpreis einer Spot-Instance mit dem On-Demand-Preis (in diesem Tutorial 0,003 USD) festgelegt. Indem der Preises auf diese Weise festgelegt wird, erhöhen sich die Chancen zur Erfüllung der Anfrage.
Eine Spot-Instance-Anfrage erstellen
Der folgende Ausschnitt zeigt Ihnen, wie Sie eine Spot-Instance-Anfrage mit den zuvor gesammelten Elementen erstellen.
Das Beispiel am Ende dieses Themas zeigt, wie dieses Snippet verwendet wird.
// // Method to create a Spot Instance request private static async Task<SpotInstanceRequest> CreateSpotInstanceRequest( IAmazonEC2 ec2Client, string amiId, string securityGroupName, InstanceType instanceType, string spotPrice, int instanceCount) { var launchSpecification = new LaunchSpecification{ ImageId = amiId, InstanceType = instanceType }; launchSpecification.SecurityGroups.Add(securityGroupName); var request = new RequestSpotInstancesRequest{ SpotPrice = spotPrice, InstanceCount = instanceCount, LaunchSpecification = launchSpecification }; RequestSpotInstancesResponse result = await ec2Client.RequestSpotInstancesAsync(request); return result.SpotInstanceRequests[0]; }
Der wichtige Wert, der von dieser Methode zurückgegeben wird, ist die Spot-Instance-Anforderungs-ID, die im SpotInstanceRequestId
Element des zurückgegebenen SpotInstanceRequestObjekts enthalten ist.
Anmerkung
Ihnen werden alle Spot-Instances in Rechnung gestellt, die gestartet werden. Um unnötige Kosten zu vermeiden, sollten Sie alle Anfragen stornieren und alle Instances beenden.
Ermitteln Sie den Status Ihrer Spot-Instance-Anfrage
Der folgende Ausschnitt zeigt Ihnen, wie Sie Informationen zu Ihrer Spot-Instance-Anfrage erhalten. Sie können diese Informationen verwenden, um bestimmte Entscheidungen in Ihrem Code zu treffen, z. B. ob Sie weiterhin auf die Erfüllung einer Spot-Instance-Anfrage warten möchten.
Das Beispiel am Ende dieses Themas zeigt, wie dieser Codeausschnitt verwendet wird.
// // Method to get information about a Spot Instance request, including the status, // instance ID, etc. // It gets the information for a specific request (as opposed to all requests). private static async Task<SpotInstanceRequest> GetSpotInstanceRequestInfo( IAmazonEC2 ec2Client, string requestId) { var describeRequest = new DescribeSpotInstanceRequestsRequest(); describeRequest.SpotInstanceRequestIds.Add(requestId); DescribeSpotInstanceRequestsResponse describeResponse = await ec2Client.DescribeSpotInstanceRequestsAsync(describeRequest); return describeResponse.SpotInstanceRequests[0]; }
Die Methode gibt Informationen über die Spot-Instance-Anfrage zurück, z. B. die Instance-ID, ihren Status und den Statuscode. Weitere Informationen zu den Statuscodes für Spot-Instance-Anfragen finden Sie unter Spot-Anforderungsstatus im EC2Amazon-Benutzerhandbuch.
Bereinigen Sie Ihre Spot-Instance-Anfragen
Wenn Sie Spot-Instances nicht mehr anfordern müssen, ist es wichtig, alle ausstehenden Anfragen zu stornieren, um zu verhindern, dass diese Anfragen erneut bearbeitet werden. Der folgende Ausschnitt zeigt Ihnen, wie Sie eine Spot-Instance-Anfrage stornieren.
Das Beispiel am Ende dieses Themas zeigt, wie dieses Snippet verwendet wird.
// // Method to cancel a Spot Instance request private static async Task CancelSpotInstanceRequest( IAmazonEC2 ec2Client, string requestId) { var cancelRequest = new CancelSpotInstanceRequestsRequest(); cancelRequest.SpotInstanceRequestIds.Add(requestId); await ec2Client.CancelSpotInstanceRequestsAsync(cancelRequest); }
Bereinigen Sie Ihre Spot-Instances
Um unnötige Kosten zu vermeiden, ist es wichtig, dass Sie alle Instances beenden, die über Spot-Instance-Anfragen gestartet wurden. Durch das einfache Stornieren von Spot-Instance-Anfragen werden Ihre Instances nicht beendet, was bedeutet, dass Ihnen diese weiterhin in Rechnung gestellt werden. Der folgende Ausschnitt zeigt Ihnen, wie Sie eine Instance beenden, nachdem Sie die Instance-ID für eine aktive Spot-Instance erhalten haben.
Das Beispiel am Ende dieses Themas zeigt, wie dieses Snippet verwendet wird.
// // Method to terminate a Spot Instance private static async Task TerminateSpotInstance( IAmazonEC2 ec2Client, string requestId) { var describeRequest = new DescribeSpotInstanceRequestsRequest(); describeRequest.SpotInstanceRequestIds.Add(requestId); // Retrieve the Spot Instance request to check for running instances. DescribeSpotInstanceRequestsResponse describeResponse = await ec2Client.DescribeSpotInstanceRequestsAsync(describeRequest); // If there are any running instances, terminate them if( (describeResponse.SpotInstanceRequests[0].Status.Code == "request-canceled-and-instance-running") || (describeResponse.SpotInstanceRequests[0].State == SpotInstanceState.Active)) { TerminateInstancesResponse response = await ec2Client.TerminateInstancesAsync(new TerminateInstancesRequest{ InstanceIds = new List<string>(){ describeResponse.SpotInstanceRequests[0].InstanceId } }); foreach (InstanceStateChange item in response.TerminatingInstances) { Console.WriteLine($"\n Terminated instance: {item.InstanceId}"); Console.WriteLine($" Instance state: {item.CurrentState.Name}\n"); } } }
Vollständiger Code
Im folgenden Codebeispiel werden die zuvor beschriebenen Methoden aufgerufen, um eine Spot-Instance-Anfrage zu erstellen und abzubrechen und eine Spot-Instance zu beenden.
NuGet Pakete:
Elemente der Programmierung:
-
Namespace Amazon. EC2
Klasse Amazon EC2Client
Klasse InstanceType
-
Namespace Amazon. EC2.Modell
Klasse CancelSpotInstanceRequestsRequest
Klasse DescribeSpotInstanceRequestsRequest
Klasse DescribeSpotInstanceRequestsResponse
Klasse InstanceStateChange
Klasse LaunchSpecification
Klasse RequestSpotInstancesRequest
Klasse RequestSpotInstancesResponse
Klasse SpotInstanceRequest
Klasse TerminateInstancesRequest
Klasse TerminateInstancesResponse
using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using Amazon.EC2; using Amazon.EC2.Model; namespace EC2SpotInstanceRequests { class Program { static async Task Main(string[] args) { // Some default values. // These could be made into command-line arguments instead. var instanceType = InstanceType.T1Micro; string securityGroupName = "default"; string spotPrice = "0.003"; int instanceCount = 1; // Parse the command line arguments if((args.Length != 1) || (!args[0].StartsWith("ami-"))) { Console.WriteLine("\nUsage: EC2SpotInstanceRequests ami"); Console.WriteLine(" ami: the Amazon Machine Image to use for the Spot Instances."); return; } // Create the Amazon EC2 client. var ec2Client = new AmazonEC2Client(); // Create the Spot Instance request and record its ID Console.WriteLine("\nCreating spot instance request..."); var req = await CreateSpotInstanceRequest( ec2Client, args[0], securityGroupName, instanceType, spotPrice, instanceCount); string requestId = req.SpotInstanceRequestId; // Wait for an EC2 Spot Instance to become active Console.WriteLine( $"Waiting for Spot Instance request with ID {requestId} to become active..."); int wait = 1; var start = DateTime.Now; while(true) { Console.Write("."); // Get and check the status to see if the request has been fulfilled. var requestInfo = await GetSpotInstanceRequestInfo(ec2Client, requestId); if(requestInfo.Status.Code == "fulfilled") { Console.WriteLine($"\nSpot Instance request {requestId} " + $"has been fulfilled by instance {requestInfo.InstanceId}.\n"); break; } // Wait a bit and try again, longer each time (1, 2, 4, ...) Thread.Sleep(wait); wait = wait * 2; } // Show the user how long it took to fulfill the Spot Instance request. TimeSpan span = DateTime.Now.Subtract(start); Console.WriteLine($"That took {span.TotalMilliseconds} milliseconds"); // Perform actions here as needed. // For this example, simply wait for the user to hit a key. // That gives them a chance to look at the EC2 console to see // the running instance if they want to. Console.WriteLine("Press any key to start the cleanup..."); Console.ReadKey(true); // Cancel the request. // Do this first to make sure that the request can't be re-fulfilled // once the Spot Instance has been terminated. Console.WriteLine("Canceling Spot Instance request..."); await CancelSpotInstanceRequest(ec2Client, requestId); // Terminate the Spot Instance that's running. Console.WriteLine("Terminating the running Spot Instance..."); await TerminateSpotInstance(ec2Client, requestId); Console.WriteLine("Done. Press any key to exit..."); Console.ReadKey(true); } // // Method to create a Spot Instance request private static async Task<SpotInstanceRequest> CreateSpotInstanceRequest( IAmazonEC2 ec2Client, string amiId, string securityGroupName, InstanceType instanceType, string spotPrice, int instanceCount) { var launchSpecification = new LaunchSpecification{ ImageId = amiId, InstanceType = instanceType }; launchSpecification.SecurityGroups.Add(securityGroupName); var request = new RequestSpotInstancesRequest{ SpotPrice = spotPrice, InstanceCount = instanceCount, LaunchSpecification = launchSpecification }; RequestSpotInstancesResponse result = await ec2Client.RequestSpotInstancesAsync(request); return result.SpotInstanceRequests[0]; } // // Method to get information about a Spot Instance request, including the status, // instance ID, etc. // It gets the information for a specific request (as opposed to all requests). private static async Task<SpotInstanceRequest> GetSpotInstanceRequestInfo( IAmazonEC2 ec2Client, string requestId) { var describeRequest = new DescribeSpotInstanceRequestsRequest(); describeRequest.SpotInstanceRequestIds.Add(requestId); DescribeSpotInstanceRequestsResponse describeResponse = await ec2Client.DescribeSpotInstanceRequestsAsync(describeRequest); return describeResponse.SpotInstanceRequests[0]; } // // Method to cancel a Spot Instance request private static async Task CancelSpotInstanceRequest( IAmazonEC2 ec2Client, string requestId) { var cancelRequest = new CancelSpotInstanceRequestsRequest(); cancelRequest.SpotInstanceRequestIds.Add(requestId); await ec2Client.CancelSpotInstanceRequestsAsync(cancelRequest); } // // Method to terminate a Spot Instance private static async Task TerminateSpotInstance( IAmazonEC2 ec2Client, string requestId) { var describeRequest = new DescribeSpotInstanceRequestsRequest(); describeRequest.SpotInstanceRequestIds.Add(requestId); // Retrieve the Spot Instance request to check for running instances. DescribeSpotInstanceRequestsResponse describeResponse = await ec2Client.DescribeSpotInstanceRequestsAsync(describeRequest); // If there are any running instances, terminate them if( (describeResponse.SpotInstanceRequests[0].Status.Code == "request-canceled-and-instance-running") || (describeResponse.SpotInstanceRequests[0].State == SpotInstanceState.Active)) { TerminateInstancesResponse response = await ec2Client.TerminateInstancesAsync(new TerminateInstancesRequest{ InstanceIds = new List<string>(){ describeResponse.SpotInstanceRequests[0].InstanceId } }); foreach (InstanceStateChange item in response.TerminatingInstances) { Console.WriteLine($"\n Terminated instance: {item.InstanceId}"); Console.WriteLine($" Instance state: {item.CurrentState.Name}\n"); } } } } }
Weitere Überlegungen
-
Nachdem Sie das Tutorial ausgeführt haben, empfiehlt es sich, sich bei der EC2 Amazon-Konsole
anzumelden, um zu überprüfen, ob die Spot-Instance-Anfrage storniert und die Spot-Instance beendet wurde.