So starten und stoppen Sie eine AWS EC2-Instanz basierend auf einem zeitbasierten Zeitplan

17

Gibt es eine einfache Möglichkeit, AWS EC2-Instanzen täglich zu einer bestimmten Zeit zu starten und zu stoppen? Dies könnte mir eine Menge Geld für meine Entwicklungs- und Testserver sparen.

Tim
quelle

Antworten:

16

Aktualisieren

AWS hat ein Tool namens " Instance Scheduler " veröffentlicht, das eine vollständige Konfigurationsanleitung enthält, die von dieser Seite aus verlinkt ist. Es scheint eine Erweiterung des EC2-Schedulers zu sein, den ich unten beschreibe, mit ein paar weiteren Funktionen, aber es ist im Wesentlichen dasselbe.

Die nachstehende Anleitung wird weiterhin funktionieren, aber es ist wahrscheinlich besser, sich den Instanzplaner für Neuinstallationen anzusehen.

Ursprünglicher Beitrag

AWS verfügt über ein Tool namens EC2 Scheduler , mit dem Sie das Starten und Stoppen von EC2-Instanzen sehr flexibel steuern können.

Mit dem Tool können Sie beim Einrichten des Tools Standardstart- und -stoppzeiten definieren, die Sie später ändern können. Sie können auswählen, welche Instanzen gesteuert werden, und Sie können mithilfe von Tags unterschiedliche Start- und Stoppzeiten für jede Instanz angeben.

Obwohl es ein großartiges Tool ist, ist die Dokumentation etwas vage und verwirrend. Es ist, als ob die Dokumentation von einem Ingenieur geschrieben wurde, der das Tool geschrieben hat und alles darüber weiß, anstatt von einem technischen Redakteur.

Hinweis : Wenn Sie Feedback oder Korrekturen haben, sind Kommentare willkommen. Wenn Sie eine Frage haben, die auf dieser basiert, beginnen Sie bitte Ihre eigene Frage.

Was ist EC2 Scheduler?

Dieses Tool ist eine Lambda-Funktion, die mit Cloudwatch Events und DynamoDB zusammenarbeitet. Die Bereitstellung erfolgt mithilfe einer Cloudformation-Vorlage, die auch die erforderlichen IAM-Rollen und -Richtlinien einrichtet. Über die Architektur können Sie hier lesen .

AWS EC2 Scheduler-Architektur

Einsatz

Beginnen Sie, indem Sie auf diese Seite gehen und auf "Lösung starten" klicken. Im Moment ist der direkte Link hier , aber es könnte sich ändern.

Wählen Sie oben in der Konsole die Region aus, in der die Ressourcen bereitgestellt werden sollen. Das Skript steuert EC2-Instanzen in jeder Region, wird jedoch in einer Region ausgeführt.

Kennzeichnen von EC2-Instanzen

Dies wird in der Dokumentation hier behandelt , aber es ist nicht so einfach, wie es sein könnte.

Sie steuern, welche Instanzen gestartet und gestoppt werden, indem Sie Ihre Instanzen markieren.

Im einfachsten Fall müssen Sie jede EC2-Instanz kennzeichnen, die gemäß dem Zeitplan gestartet und gestoppt werden soll. Suchen Sie dazu Ihre EC2-Instanz in der Konsole, klicken Sie auf Tags und erstellen Sie dieses Tag

EC2-Instanz-Tagging für Scheduler

So aktivieren Sie das Kopieren und Einfügen:

  • Schlüssel: Scheduler: ec2-startstop
  • Wert: wahr

Wenn Sie möchten, dass eine bestimmte Instanz nach einem anderen Zeitplan gestartet und gestoppt wird, fügen Sie dem Tag-Schlüssel und dem Wert zusätzliche Informationen hinzu. Wenn Sie beispielsweise möchten, dass eine Instanz um 1500 UTC beginnt und am Dienstag, Donnerstag und Freitag um 2400 UTC endet, geben Sie Folgendes ein.

Schlüssel: Scheduler: ec2-startstop: late Wert: 1500; 2400; utc; Di, Do, Fr

Beachten Sie, dass das Wort "spät" eine beliebige Zeichenfolge sein kann, "spät" hat keine besondere Bedeutung.

Mit diesem Tool können Sie UTC in Ihre Ortszeit umrechnen .

Mit dem Tag-Editor können Sie Tag- Masseninstanzen erstellen. Auf diese Weise können Sie leichter Bulk-Tags einrichten, die nützlich sein können, wenn Sie unterschiedliche Einstellungen für Entwickler, Test und Produktion vornehmen möchten. Ich bezweifle, dass Sie dies für die Produktion verwenden würden.

CloudFormation-Parameter

Wenn Sie die CloudFormation-Vorlage ausführen, müssen Sie viele Parameter eingeben. Die meisten können Sie standardmäßig belassen. Hier sind einige der wichtigsten Parameter

  • Stack Name: Nenne es wie du willst. Es ist genau das, was es in CloudFormation heißt.
  • Name des benutzerdefinierten Tags: Dies ist der "Schlüssel" des Tags, den Sie für die EC2-Instanz festgelegt haben. Behalten Sie den Standardwert bei, es sei denn, Sie haben einen guten Grund oder benötigen mehrere Installationen.
  • Standardstart- / Stoppzeit: Standard-UTC-Zeit zum Starten und Stoppen der Instanzen
  • DynamoDB: Einstellungen werden in DynamoDB gespeichert. Sie können den Tabellennamen und dergleichen ändern. Da die kostenlose Stufe von DynamoDB nicht abläuft, ist es unwahrscheinlich, dass für die meisten Personen Gebühren anfallen.
  • (zweiter Bildschirm) Berechtigungen - Dies ist ein roter Hering, siehe Abschnitt unten. Behalten Sie die Standardeinstellung bei und führen Sie sie als Administrator aus, wenn Sie versuchen, EC2 Scheduler einzurichten.
  • Benachrichtigungsoptionen: Ich fand es nützlich, SNS-Benachrichtigungen einzurichten, um zu überprüfen, ob sie funktionieren. Ich habe nicht die Zeit aufgewendet, um herauszufinden, wie sie deaktiviert werden können. Ich habe sie nur gelöscht und die Cloudformation-Vorlage erneut ausgeführt, um sie neu zu installieren.

Berechtigungen, Richtlinien und Rollen

Der Abschnitt Berechtigungen / IAM-Rolle in der CloudFormation-Vorlage ist ein roter Faden - das heißt, er ist weitgehend irrelevant. Es gibt nur die Rolle an, die zum Ausführen des CloudFormation-Skripts verwendet wird. Es spielt keine Rolle für die erstellten Ressourcen oder die Rolle, die beim Ausführen der Lambda-Funktion verwendet wird. Rückblickend ist das klar, aber es war mir nicht klar, als ich anfing.

Unabhängig von der Rolle, in der Sie dieses Skript ausführen, werden in IAM die gleichen Rollen- und Inline-Berechtigungen erstellt. Die Lambda-Funktion wird mit einer vom Skript erstellten "ec2-Scheduler-Rolle" ausgeführt.

Ich habe meine Richtlinien unten aufgeführt, falls sie für jemanden hilfreich sind.

CloudWatch-Ereignisse und -Metriken

Wenn Sie Protokolle Ihrer Lambda-Funktion anzeigen möchten, wechseln Sie zu Cloudwatch Events. Die Protokollierung ist ziemlich gut. Es gibt auch Metriken, sodass Sie sehen können, wann es ausgeführt wird, wie lange es dauert usw.

Zusätzlich

Der Code für die Lambda-Funktion ist auf Github verfügbar .

Richtlinien

Diese sind im Allgemeinen nicht erforderlich, könnten aber für jemanden sein, also werde ich sie einschließen.

Richtlinie für die IAM-Rolle

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        }
    ]
}

Vertrauensrichtlinie für die IAM-Rolle

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Tim
quelle
Amazon hat seitdem etwas geändert - "EC2 Scheduler wurde von AWS Instance Scheduler abgelöst"
Max Barraclough
Danke Max, ich habe die Antwort aktualisiert und einen Link eingefügt. Es wird mit einer vollständigen Implementierungsanleitung geliefert, sodass ich keine vollständigen Anweisungen geben muss.
Tim
1
Es ist unglaublich, wie sie es mögen, Dinge zu komplizieren ...
Mehdi
9

Wenn Sie Instanzen nur starten und stoppen möchten, verwenden Sie den Lambda-Service. Es wird davon ausgegangen, dass Sie eine bestimmte Instanz-ID steuern möchten. Sie können mehrere Instanzen steuern, indem Sie mehrere durch Komma getrennte IDs hinzufügen. (Bsp .: "i-3453453", "i-45656745"). Sie finden die ID Ihrer Instanz im Abschnitt Instanzen der AWS-Konsole.

In der Lambda-Konsole

  1. Öffnen Sie die AWS Lambda-Konsole und wählen Sie Funktion erstellen.
  2. Wählen Sie Autor von Grund auf.
  3. Geben Sie einen Namen für Ihre Funktion ein, z. B. "StopEC2Instances".
  4. Wählen Sie zur Laufzeit Python 2.7 aus
  5. Erweitern Sie das Dropdown-Menü Rolle und wählen Sie Benutzerdefinierte Rolle erstellen. Dies öffnet eine neue Registerkarte oder ein neues Fenster in Ihrem Browser.
  6. Wählen Sie im Dropdown-Menü "IAM-Rolle" die Option "Neue IAM-Rolle erstellen" und geben Sie einen Rollennamen ein, z. B. "lambda_start_stop_ec2".
  7. Wählen Sie "Richtliniendokument anzeigen", "Bearbeiten" und dann "OK", wenn Sie zum Lesen der Dokumentation aufgefordert werden. Ersetzen Sie den gesamten Text in der Richtlinie durch Folgendes:

Code unten

{
  "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": "*"
    }
  ]
}
  1. Wählen Sie Zulassen, um die Erstellung der Rolle abzuschließen und zur AWS Lambda-Konsole zurückzukehren.
  2. Ersetzen Sie zum Stoppen Ihrer Instanzen den gesamten Text im Funktionscode-Editor durch Folgendes:

Code unten

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

Denken Sie daran, die Regions- und Instanzwerte durch Ihre eigenen zu ersetzen.

  1. Wählen Sie im Dropdown-Menü Runtime die Option Python2.7.
  2. Geben Sie in den Grundeinstellungen 10 Sekunden für die Funktion Timeout ein.
  3. Wählen Sie Sichern.
  4. Wiederholen Sie alle Schritte, um eine weitere Funktion zu erstellen, mit der Ihre Instanzen gestartet werden. Verwenden Sie dann dieses Python-Skript, um alles zu starten:

Code unten

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

Planen Sie die Funktionen

Hier erstellen Sie ein CloudWatch-Ereignis, das nachts Ihre Lambda-Funktion auslöst

  1. Öffnen Sie die Amazon CloudWatch-Konsole.
  2. Wählen Sie Ereignisse und anschließend Regel erstellen.
  3. Wählen Sie unter Ereignisquelle die Option Zeitplan.
  4. Geben Sie ein Zeitintervall oder einen Cron-Ausdruck ein, der Lambda mitteilt, wann Ihre Instanzen gestoppt werden sollen. Weitere Informationen zur richtigen Syntax finden Sie unter Syntax von Zeitplanausdrücken für Regeln.

Hinweis: Cron-Ausdrücke werden in UTC ausgewertet. Stellen Sie sicher, dass Sie den Ausdruck für Ihre bevorzugte Zeitzone anpassen. Hier ist ein Beispiel, das die Funktion jeden Tag um 08:00 Uhr (GMT / UTC) ausführt:

0 08 * * ? *
  1. Wählen Sie Ziel hinzufügen und dann Lambda-Funktion.
  2. Wählen Sie unter Funktion die Lambda-Funktion aus, die Ihre Instanzen stoppt.
  3. Wählen Sie Details konfigurieren.
  4. Geben Sie die folgenden Informationen in die bereitgestellten Felder ein: Geben Sie für Name einen aussagekräftigen Namen ein, z. B. "StopEC2Instances". Fügen Sie für Beschreibung eine aussagekräftige Beschreibung hinzu, z. B. "Stoppt EC2-Instanzen jeden Tag nachts". Wählen Sie für Status die Option Aktiviert aus.
  5. Wählen Sie Regel anlegen.

Um Ihre Instanzen am Morgen neu zu starten, wiederholen Sie diese Schritte und verwenden Sie Ihre bevorzugte Startzeit. Wenn Sie eine E-Mail-Nachricht senden möchten, wenn die Funktionen fehlschlagen, können Sie ein SNS-Thema einrichten und das Senden dieser Nachricht unter Debuggen im Fenster zur Erstellung von Lmbda-Funktionen konfigurieren.

Die Quelle für all dies finden Sie hier: AWS-Dokumentation

netfed
quelle
Wie um alles in der Welt können Sie den Python-Code im Editor so gut aussehen lassen, wie er sich gerade herausgestellt hat?
13.01.18
Klicken Sie auf die Hilfe '?' Außerdem erfahren Sie mehr über die Verwendung der Abschriftenformatierung. serverfault.com/editing-help
jscott
1
Es ist ein Fehler im Formatierungscode. Sie müssen Klartext zwischen verschiedene Formatierungen setzen - in diesem Fall einen Codeblock und einen nummerierten Block. Deshalb habe ich "Code unten" eingefügt - macht nicht überall Sinn, aber es funktioniert.
Tim
@ Tim Danke für die Klarstellung. Das wusste ich nicht. Es löste auch die Formatierung des Cron-Ausdrucks. Danke noch einmal.
13.01.18