Wie stoppe und starte ich Amazon-EC2-Instances in regelmäßigen Abständen mit Lambda?
Ich möchte meine Amazon-Elastic-Compute-Cloud-Instances (Amazon EC2) automatisch beenden und starten, um meine Amazon-EC2-Nutzung zu reduzieren.
Kurzbeschreibung
Sie können AWS Lambda und Amazon EventBridge verwenden, um EC2-Instances automatisch zu stoppen und zu starten.
**Hinweis:**Die folgende Lösung ist eine einfache Lösung. Verwenden Sie für eine erweiterte Lösung den AWS Instance Scheduler. Weitere Informationen finden Sie unter Automatisieren des Startens und Stoppens von AWS-Instances.
Gehen Sie wie folgt vor, um mit Lambda EC2-Instances in regelmäßigen Abständen zu stoppen und zu starten:
- Erstellen Sie eine benutzerdefinierte AWS-Richtlinie für Identity and Access Management (IAM) und eine Ausführungsrolle für Ihre Lambda-Funktion.
- Erstellen Sie Lambda-Funktionen, die Ihre EC2-Instances stoppen und starten.
- Testen Sie Ihre Lambda-Funktion.
- Erstellen Sie EventBridge-Regeln, die Ihre Funktion nach einem Zeitplan ausführen.
**Hinweis:**Sie können auch Regeln erstellen, die auf Ereignisse in Ihrem AWS-Konto reagieren.
Behebung
**Hinweis:**Nachdem Sie die folgenden Schritte ausgeführt haben, wird möglicherweise ein Client-Fehler beim Start angezeigt. Weitere Informationen finden Sie unter Wenn ich meine Instance mit angehängten verschlüsselten Volumes starte, wird die Instance sofort mit dem Fehler „Client-Fehler beim Start“ beendet.
Rufen Sie die IDs der EC2-Instances ab, die Sie beenden und starten möchten. Führen Sie die folgenden Schritte aus.
Erstellen Sie eine IAM-Richtlinie und eine Ausführungsrolle für Ihre Lambda-Funktion
-
Verwenden Sie den JSON-Richtlinieneditor, um eine IAM-Richtlinie zu erstellen. Kopieren Sie das folgende JSON-Richtliniendokument und fügen Sie es in den Richtlinieneditor ein:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "ec2:Start*", "ec2:Stop*" ], "Resource": "*" } ] }
-
Erstellen Sie eine IAM-Rolle für Lambda.
**Wichtig:**Wenn Sie eine Berechtigungsrichtlinie an Lambda anhängen, stellen Sie sicher, dass Sie die IAM-Richtlinie wählen.
**Hinweis:**Wenn Sie ein Amazon Elastic Block Store (Amazon EBS) -Volume verwenden, das mit einem vom Kunden verwalteten AWS Key Management Service (AWS KMS) -Schlüssel verschlüsselt ist, fügen Sie der IAM-Richtlinie kms:CreateGrant hinzu.
Erstellen Sie Lambda-Funktionen, die Ihre EC2-Instances stoppen und starten
- Öffnen Sie die Lambda-Konsole und wählen Sie Funktion erstellen aus.
- Wählen Sie Autor von Grund auf neu.
- Fügen Sie unter Grundinformationen die folgenden Informationen hinzu:
Geben Sie als Funktionsname einen Namen ein, der die Funktion beschreibt, z. B. „StopEC2Instances“.
Wählen Sie für Runtime Python 3.9.
Erweitern Sie unter Berechtigungen die Option Standardausführungsrolle ändern.
Wählen Sie unter Ausführungsrolle die Option Bestehende Rolle verwenden aus.
Wählen Sie unter Existierende Rolle die IAM-Rolle aus. - Wählen Sie Funktion erstellen aus.
- Fügen Sie auf der Registerkarte Code unter Codequelle den folgenden Code in den Editorbereich des Code-Editors auf der Registerkarte lambda\ _function ein. Dieser Code stoppt die von Ihnen identifizierten EC2-Instances:
Ersetzen Sie us-west-1-Region durch die AWS-Region, in der sich Ihre Instances befinden. Ersetzen Sie InstanceIds durch die IDs der Instances, die Sie beenden und starten möchten.import boto3 region = 'us-west-1' instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26'] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.stop_instances(InstanceIds=instances) print('stopped your instances: ' + str(instances))
- Wählen Sie Bereitstellen aus.
- Wählen Sie die Registerkarte Konfiguration, dann Allgemeine Konfiguration und dann Bearbeiten.
- Stellen Sie Timeout auf 10 Sekunden ein und wählen Sie dann Speichern.
Hinweis:(Optional) Sie können die Lambda-Funktionseinstellungen anpassen. Um beispielsweise mehrere Instances zu stoppen und zu starten, können Sie einen anderen Wert für Timeout und Speicher verwenden. - Wiederholen Sie die Schritte 1 bis 7, um eine weitere Funktion zu erstellen. Gehen Sie wie folgt vor, damit diese Funktion Ihre Instances startet:
Geben Sie in Schritt 3 einen anderen Funktionsnamen ein. Zum Beispiel „StartEC2Instances“.
Fügen Sie in Schritt 5 den folgenden Code in den Editorbereich des Code-Editors auf der Registerkarte lambda\ _function ein:import boto3 region = 'us-west-1' instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26'] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.start_instances(InstanceIds=instances) print('started your instances: ' + str(instances))
Verwenden Sie Ihre Region und dieselben Instance-IDs.
Lambda-Funktion testen
- Öffnen Sie die Lambda-Konsole und wählen Sie dann Funktionen.
- Wählen Sie eine der Funktionen aus.
- Wählen Sie die Registerkarte Code aus.
- Wählen Sie im Abschnitt Codequelle die Option Test aus.
- Wählen Sie im Dialogfeld Testereignis konfigurieren die Option Neues Testereignis erstellen aus.
- Geben Sie einen Namen für **das Ereignis ein.**Wählen Sie dann Erstellen.
**Hinweis:**Ändern Sie nicht den JSON-Code für das Testereignis. - Wählen Sie Test aus, um die Funktion auszuführen.
- Wiederholen Sie die Schritte 1-7 für die andere Funktion.
Status Ihrer EC2-Instances überprüfen
AWS-Managementkonsole
Überprüfen Sie vor und nach dem Testen den Status Ihrer Instances, um sicherzustellen, dass Ihre Funktionen funktionieren.
CloudTrail
Um zu bestätigen, dass die Lambda-Funktion die Instance gestoppt oder gestartet hat, verwenden Sie AWS CloudTrail, um nach Ereignissen zu suchen.
- Öffnen Sie die CloudTrail-Konsole.
- Wählen Sie im Navigationsbereich die Option Aktivitätsverlauf aus.
- Wählen Sie die Dropdownliste Suchattribute und dann Ereignisname aus.
- Geben Sie in der Suchleiste StopInstances ein, um die Ergebnisse zu überprüfen. Geben Sie dann StartInstances ein.
Wenn es keine Ergebnisse gibt, hat die Lambda-Funktion die EC2-Instances nicht gestoppt oder gestartet.
Erstellen Sie EventBridge-Regeln, die Ihre Lambda-Funktionen ausführen
- Öffnen Sie die EventBridge-Konsole.
- Wählen Sie Regel erstellen aus.
- Geben Sie einen Namen für Ihre Regel ein, z. B. „StopEC2Instances“. (Optional) Geben Sie im Feld Beschreibung eine Beschreibung für die Regel ein.
- Wählen Sie als Regeltyp die Option Zeitplan und dann die Option Weiter im EventBridge-Scheduler aus.
- Wählen Sie für Zeitplanmuster die Option Wiederkehrender Zeitplan aus.
- Wählen Sie unter Zeitplanmuster für Ereignis die Option Wiederkehrender Zeitplan aus.
- Wählen Sie unter Zeitplantyp einen Zeitplantyp aus, und führen Sie dann die folgenden Schritte aus:
Geben Sie für den ratenbasierten Zeitplan einen Preiswert ein, und wählen Sie dann ein Zeitintervall in Minuten, Stunden oder Tagen aus.
-oder-
Geben Sie für einen Cron-basierten Zeitplan einen Ausdruck ein, der Lambda mitteilt, wann Ihre Instance gestoppt werden soll. Informationen zur Ausdruckssyntax finden Sie unter Eine Amazon EventBridge-Regel erstellen, die nach einem Zeitplan ausgeführt wird.
**Hinweis:**Cron-Ausdrücke werden in UTC ausgewertet. Stellen Sie sicher, dass Sie den Ausdruck für Ihre bevorzugte Zeitzone anpassen. - Wählen Sie unter Ziele auswählen die Lambda-Funktion aus der Dropdown-Liste Ziel aus.
- Wählen Sie unter Funktion die Funktion aus, die Ihre EC2-Instances stoppt.
- Wählen Sie Zur Überprüfung und Erstellung überspringen und dann Erstellen.
- Wiederholen Sie die Schritte 1-10, um eine Regel zum Starten Ihrer EC2-Instances zu erstellen. Führen Sie die folgenden Schritte aus:
Geben Sie einen Namen für Ihre Regel ein, z. B. „StartEC2Instances“.
(Optional) Geben Sie im Feld Beschreibung eine Beschreibung für Ihre Regel ein, z. B. „Startet EC2-Instances jeden Morgen um 7 Uhr."
Geben Sie in Schritt 7 für den Cron-Ausdruck einen Ausdruck ein, der Lambda mitteilt, wann Ihre Instances gestartet werden sollen.
Wählen Sie in Schritt 9 für Funktion die Funktion aus, die Ihre EC2-Instances startet.
**Hinweis:**Manchmal stoppt eine Lambda-Funktion eine Instance und kann sie nicht erneut starten. Dies tritt auf, wenn ein Amazon-Elastic-Block-Store-Volume (Amazon EBS) verschlüsselt ist und die Lambda-Rolle nicht autorisiert ist, den Verschlüsselungsschlüssel zu verwenden. Weitere Informationen finden Sie unter Erforderliche AWS-KMS-Schlüsselrichtlinie für die Verwendung mit verschlüsselten Volumes und Schlüsselrichtlinien in AWS KMS.
Ähnliche Informationen
Tutorial: Planen Sie Lambda-Funktionen mit EventBridge
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 3 Jahren
- AWS OFFICIALAktualisiert vor 3 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren