Wie beende und starten ich Amazon-EC2-Instances mit Lambda in festgelegten Intervallen?

Letzte Aktualisierung: 2022-01-13

Ich möchte meine Nutzung der Amazon Elastic Compute Cloud (Amazon EC2) durch automatisches Beenden und Starten meiner EC2-Instances reduzieren. Wie kann ich AWS Lambda und Amazon EventBridge dafür einsetzen?

Kurzbeschreibung

Hinweis: Diese Beispielkonfiguration zeigt eine einfache Lösung. Verwenden Sie für eine robustere Lösung den AWS Instance Scheduler. Weitere Informationen finden Sie unter Wie kann ich meine Instances mit dem AWS Instance Scheduler beenden und starten?

Um EC2-Instances in regelmäßigen Abständen mit Lambda zu beenden und zu starten, gehen Sie wie folgt vor:

1.    Erstellen Sie eine benutzerdefinierte AWS-Identity-and-Access-Management(IAM)-Richtlinie und Ausführungsrolle für Ihre Lambda-Funktion.

2.    Erstellen Sie Lambda-Funktionen, die Ihre EC2-Instances stoppen und starten.

3.    Testen Sie Ihre Lambda-Funktionen.

4.    Erstellen Sie EventBridge-Regeln, die Ihre Funktion nach einem Zeitplan auslösen.
Hinweis: Sie können auch Regeln erstellen, die bei einem in Ihrem AWS-Konto stattfindenden Ereignis ausgelöst werden.

Auflösung

Hinweis: Wenn nach Ausführung des folgenden Vorgangs ein Clientfehler beim Start angezeigt wird, lesen Sie Wenn ich meine Instance mit angehängten verschlüsselten Volumes starte, wird die Instance sofort mit dem Fehler „Clientfehler beim Start“ beendet.

Erfassen Sie die IDs der EC2-Instances, die Sie beenden und starten möchten. Führen Sie danach folgende Aktionen aus:

Erstellen Sie eine IAM-Richtlinie und eine Ausführungsrolle für Ihre Lambda-Funktion

1.    Erstellen einer IAM-Richtlinie mit dem JSON-Richtlinieneditor. 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": "*"
    }
  ]
}

2.    IAM-Rolle für Lambda erstellen.

Wichtig: Stellen Sie beim Anfügen einer Berechtigungsrichtlinie an Lambda sicher, dass Sie die gerade erstellte IAM-Richtlinie auswählen.

Erstellen Sie Lambda-Funktionen, die Ihre EC2-Instances stoppen und starten

1.    Wählen Sie in der AWS-Lambda-Konsole die Option Funktion erstellen.

2.    Wählen Sie Von Grund auf neu verfassen.

3.    Fügen Sie unter Grundlegende Informationen Folgendes hinzu:
Geben Sie für Funktionsname einen Namen ein, der ihn als die Funktion identifiziert, die zum Stoppen Ihrer EC2-Instances verwendet wird. Beispiel: „StopEC2Instances“.
Wählen Sie für Laufzeit Python 3.9.
Erweitern Sie unter Berechtigungen die Option Standardausführungsrolle ändern.
Wählen Sie unter Ausführungsrolle die Option Vorhandene Rolle verwenden.
Wählen Sie unter Vorhandene Rolle die von Ihnen erstellte IAM-Rolle aus.

4.    Wählen Sie Funktion erstellen.

5.    Kopieren Sie unter Code , Code source, den folgenden Code und fügen Sie ihn in den Editorbereich des Code-Editors ein ( lambda_function ). Dieser Code beendet die von Ihnen angegebenen EC2-Instances.

Beispiel-Funktionscode – Stoppen von EC2-Instances

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))

Wichtig: Ersetzen Sie für Region „us-west-1“ durch die AWS-Region, in der sich Ihre Instances befinden. Ersetzen Sie für Instances die Beispiel-EC2-Instance-IDs durch die IDs der spezifischen Instances, die Sie stoppen und starten möchten.

6.    Wählen Sie Bereitstellen.

7.    Wählen Sie auf der Registerkarte Konfiguration Allgemeine Konfiguration, Bearbeiten. Setzen Sie Timeout auf 10 Sekunden und wählen Sie dann Speichern aus.

Hinweis: Konfigurieren Sie die Lambda-Funktionseinstellungen nach den Bedürfnissen Ihres Anwendungsfalls. Wenn Sie beispielsweise mehrere Instances beenden und starten möchten, benötigen Sie möglicherweise einen anderen Wert für Timeout und Speicher.

8.    Wiederholen Sie die Schritte 1-7, um eine weitere Funktion zu erstellen. Gehen Sie folgendermaßen vor, damit diese Funktion Ihre EC2-Instances startet:

Geben Sie in Schritt 3 einen anderen Funktionsnamen als den zuvor verwendeten ein. Beispiel: „StartEC2Instances“.
Kopieren Sie in Schritt 5 den folgenden Code und fügen Sie ihn in den Editorbereich des Code-Editors ein (lambda_function):

Beispiel-Funktionscode – Starten von EC2-Instances

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))

Wichtig: Verwenden Sie für Region und Instances dieselben Werte, die Sie für den Code zum Stoppen Ihrer EC2-Instances verwendet haben.

Testen der Lambda-Funktionen

1.    Wählen Sie in der AWS-Lambda-Konsole die Option Funktionen aus.

2.    Wählen Sie eine der von Ihnen erstellten Funktionen aus.

3.    Wählen Sie die Registerkarte Code.

4.    Wählen Sie im Abschnitt Codequelle die Option Test aus.

5.    Wählen Sie im Dialogfeld Testereignis konfigurieren die Option Neues Testereignis erstellen aus.

6.    Geben Sie einen Ereignisnamen ein. Wählen Sie dann Erstellen.

Hinweis: Sie müssen den JSON-Code für das Testereignis nicht ändern – er wird von der Funktion nicht verwendet.

7.    Wählen Sie Testen aus, um die Funktion auszuführen.

8.    Wiederholen Sie die Schritte 1-6 für die andere von Ihnen erstellte Funktion.

Tipp: Sie können den Status Ihrer EC2-Instances vor und nach dem Testen überprüfen, um sicherzustellen, dass Ihre Funktionen wie erwartet funktionieren.

Erstellen Sie EventBridge-Regeln, die Ihre Lambda-Funktionen auslösen

1.    Öffnen Sie die EventBridge-Konsole.

2.    Wählen Sie Regel erstellen aus.

3.    Geben Sie einen Namen für Ihre Regel ein, z. B. „StopEC2Instances“. Optional können Sie eine Beschreibung eingeben.

4.    Wählen Sie unter Muster definieren die Option Zeitplan aus.

5.    Führen Sie einen der folgenden Schritte aus:

Geben Sie für Feste Rate von ein Zeitintervall in Minuten, Stunden oder Tagen ein.
Geben Sie für Cron-Ausdruck einen Ausdruck ein, der Lambda mitteilt, wann Ihre Instances gestoppt werden sollen. Informationen zur Ausdruckssyntax finden Sie unter Ausdrücke für Regeln planen.
Hinweis
: Cron-Ausdrücke werden in UTC ausgewertet. Stellen Sie sicher, dass Sie den Ausdruck für Ihre bevorzugte Zeitzone anpassen.

6.    Wählen Sie unter Ziele auswählen die Lambda-Funktion aus dem Dropdown-Menü Ziel aus.

7.    Wählen Sie für Funktion die Funktion aus, die Ihre EC2-Instances beendet.

8.    Scrollen Sie nach unten und wählen Sie Erstellen.

9.    Wiederholen Sie die Schritte 1 bis 8, um eine Regel zum Starten Ihrer EC2-Instances zu erstellen. Machen Sie dabei Folgendes anders:

Geben Sie einen Namen für Ihre Regel ein, z. B. „StartEC2Instances“.
(Optional) Geben Sie eine Beschreibung ein, z. B. „Startet EC2-Instances jeden Morgen um 7 Uhr“.
Geben Sie in Schritt 5 für Cron-Ausdruck einen Ausdruck ein, der Lambda mitteilt, wann Ihre Instances gestartet werden sollen.
Wählen Sie in Schritt 7 für Funktion die Funktion aus, die Ihre EC2-Instances startet.

(Optional) Verwenden Sie den AWS Instance Scheduler zur Automatisierung des Vorgangs

Weitere Informationen finden Sie unter Automatisiertes Starten und Stoppen von AWS-Instances.