Direkt zum Inhalt

Wie verwende ich EventBridge Scheduler, um Amazon-EC2-Instances in regelmäßigen Abständen zu stoppen und zu starten?

Lesedauer: 5 Minute
0

Ich möchte den Amazon EventBridge Scheduler verwenden, um meine Amazon-EC2-Instances (Amazon Elastic Compute Cloud) automatisch zu stoppen und zu starten.

Kurzbeschreibung

Um EC2-Instances automatisch zu stoppen und zu starten, verwende den EventBridge-Scheduler, um die Amazon-EC2-APIs StartInstances und StopInstances direkt aufzurufen. Alternativ kannst du den Scheduler verwenden, um eine AWS-Lambda-Funktion zum Stoppen und Starten der Instance aufzurufen. Es hat sich bewährt, Amazon-EC2-APIs als Ziel für den Scheduler zu verwenden, um die Notwendigkeit zu vermeiden, zusätzliche Lambda-Funktionen zu erstellen.

Verwende für eine fortgeschrittenere Lösung den Instance Scheduler auf AWS.

Lösung

Voraussetzung: Rufe die IDs der Instances ab, die du stoppen und starten möchtest.

Verwende den Scheduler zum direkten Aufrufen der Amazon-EC2-APIs

Erstelle eine IAM-Richtlinie und eine Rolle für EventBridge Scheduler

Führe die folgenden Schritte aus:

  1. Verwende den JSON-Richtlinien-Editor, um eine IAM-Richtlinie (AWS Identity and Access Management) zu erstellen, die es EventBridge Scheduler erlaubt, die Instance zu stoppen und zu starten.
    Beispiel für eine Richtlinie:
    {    
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:Start*",
                    "ec2:Stop*"
                ],
                "Resource": "*"
            }
        ]
    }
    Hinweis: Wenn du dein Amazon-EBS-Volume (Amazon Elastic Block Store) mit einem kundenverwalteten AWS-KMS-Schlüssel (AWS Key Management Service) verschlüsselt hast, füge der Richtlinie kms:CreateGrant hinzu. Wenn die Lambda-Funktion keinen Zugriff auf den Verschlüsselungsschlüssel hat, kann sie die Instance nur stoppen, aber nicht neu starten. Weitere Informationen findest du unter Erforderliche AWS-KMS-Schlüsselrichtlinie für die Verwendung mit verschlüsselten Volumes.
  2. Öffne die IAM-Konsole.
  3. Wähle Rollen und dann Rolle erstellen aus.
  4. Wähle für Typ vertrauenswürdiger Entität die Option Benutzerdefinierte Vertrauensrichtlinie aus.
  5. Gib die folgende IAM-Richtlinie ein:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "scheduler.amazonaws.com"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "aws:SourceAccount": "AWS_ACCOUNT_ID"
                    }
                }
            }
        ]
    }
    Hinweis: Ersetze AWS_ACCOUNT_ID durch deine AWS-Konto-ID.
  6. Wähle Weiter aus.
  7. Wähle für Berechtigungsrichtlinien die IAM-Richtlinie aus, die du in Schritt 1 erstellt hast.
  8. Gib unter Rollenname einen Namen wie z. B. EventBridge_Scheduler_Role ein.
  9. Wähle Rolle erstellen aus.

Erstellen des EventBridge-Scheduler-Zeitplans

Erstelle einen Zeitplan für die StopInstances-API und einen weiteren für die StartInstances-API. Konfiguriere beim Erstellen des Zeitplans die folgenden Einstellungen:

  • Wähle für Ziel-API die Option Alle APIs aus und suche dann nach Amazon EC2.
  • Wähle StopInstances oder StartInstances aus und gib dann die Instance-IDs ein.
  • Wähle für Einstellungen – optional unter Berechtigungen die Option Vorhandene Rolle auswählen aus und wähle dann die von dir erstellte IAM-Rolle aus.

Verwenden des Schedulers zum Aufrufen von Lambda-Funktionen

Eine IAM-Richtlinie und eine Rolle für die Lambda-Funktion erstellen

Führe die folgenden Schritte aus:

  1. Verwende den JSON-Richtlinien-Editor, um eine IAM-Richtlinie zu erstellen, die es Lambda erlaubt, die Instance zu stoppen und zu starten.
    Beispiel für eine Richtlinie:
    {    "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": "*"
            }
        ]
    }
    Hinweis: Wenn du ein Amazon-EBS-Volume verwendest, das mit einem kundenverwalteten AWS-KMS-Schlüssel verschlüsselt ist, füge der Richtlinie kms:CreateGrant hinzu. Wenn die Lambda-Funktion keinen Zugriff auf den Verschlüsselungsschlüssel hat, kann sie die Instance nur stoppen, aber nicht neu starten. Weitere Informationen findest du unter Erforderliche AWS-KMS-Schlüsselrichtlinie für die Verwendung mit verschlüsselten Volumes.
  2. Erstelle eine IAM-Rolle für Lambda.
  3. Hänge die IAM-Richtlinie an die IAM-Rolle an.

Erstelle Lambda-Funktionen, um die Instances zu stoppen und zu starten

Führe die folgenden Schritte aus:

  1. Öffne die Lambda-Konsole.
  2. Wähle Funktion erstellen aus und wähle dann Ohne Vorgabe erstellen aus.
  3. Konfiguriere unter Grundlegende Informationen die folgenden Einstellungen:
    Gib unter Funktionsname einen Namen ein, der die Funktion beschreibt, z. B. StopEC2Instances oder StartEC2Instances.
    Wähle für Laufzeit die Option Python 3.14 aus.
    Erweitere unter Berechtigungen die Option Standard-Ausführungsrolle ändern.
    Wähle unter Ausführungsrolle die Option Vorhandene Rolle verwenden aus.
    Wähle unter Vorhandene Rolle die IAM-Rolle aus, die du erstellt hast.
  4. Wähle Funktion erstellen aus.
  5. Wähle die Registerkarte Code und dann die Registerkarte lambda_funciton.py aus.
  6. Gib unter Codequelle den folgenden Code in den Code-Editor ein, um das Stoppen der Instance zu konfigurieren:
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.stop_instances(InstanceIds=instances)
        print('stopped your instances: ' + str(instances))
    Um das Starten der Instance zu konfigurieren, gib den folgenden Code in den Code-Editor ein:
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.start_instances(InstanceIds=instances)
        print('started your instances: ' + str(instances))
    Hinweis: Ersetze us-west-1 durch die AWS-Region deiner Instances und i-12345acdb12345abcd durch die IDs deiner Instances.
  7. Wähle Bereitstellen aus.
  8. Wähle die Registerkarte Konfiguration und dann Allgemeine Konfiguration aus.
  9. Wähle Bearbeiten aus.
  10. Wähle für Timeout die Option 10 Sekunden aus und wähle dann Speichern aus.

Hinweis: Wenn du die Funktion mit der Amazon Virtual Private Cloud (Amazon VPC) verknüpft hast, überprüfe, ob die Funktion den Amazon EC2-Endpunkt über das Internet erreichen kann. Oder konfiguriere einen Virtual Private Cloud (VPC)-Endpunkt für Amazon EC2.

Testen der Lambda-Funktionen

Teste die Lambda-Funktionen für das Stoppen und das Starten der Instance.

Überprüfe vor und nach der Ausführung deines Tests den Status deiner Instances, um zu bestätigen, dass deine Funktionen funktionieren.

Führe die folgenden Schritte aus, um mithilfe von AWS CloudTrail zu bestätigen, dass die Lambda-Funktion die Instance gestoppt oder gestartet hat:

  1. Öffne die CloudTrail-Konsole.
  2. Wähle im Navigationsbereich die Option Ereignisverlauf aus.
  3. Wähle in der Dropdownliste Suchattribute die Option Ereignisname aus.
  4. Gib in der Suchleiste StopInstances ein, um die Ergebnisse zu überprüfen. Gib dann StartInstances ein.
    Hinweis: Wenn es keine Ergebnisse gibt, hat die Lambda-Funktion die Instances nicht gestoppt oder gestartet.

Erstellen eines EventBridge-Scheduler-Zeitplans zum Ausführen der Lambda-Funktionen

Erstelle einen Zeitplan zum Ausführen deiner Lambda-Funktionen. Wähle für Ziel auswählen die Option Vorgeschlagene Ziele aus und wähle dann AWS Lambda Invoke aus. Verwende die von dir erstellten Lambda-Funktionen.