An- und Abschalten von Test- oder Evaluierungsserver über zeitgesteuerte Lambda-Events

Manchmal möchte man eine neue Software ausprobieren und hat aber keinen Server frei. Was liegt da näher, als einen virtuellen Server über EC2 zu starten. Hier kann man mit einer einfachen Methode über 50% der Kosten sparen: Wird der Server z.B. nur tagsüber benötigt, so kann man ihn mit AWS Lambda an- und ausschalten. Wenn die Server-Instanz EBS-Platten hat, so bleibt der letzte Stand der Daten erhalten und man zahlt im inaktiven Zustand nur die EBS-Volumen. Für jeden An- und Ausschaltvorgang einer Instanz zahlt man eine Stunde Servernutzung, daher sollte man nicht stündlich schalten.

 

Anwendungsfälle dafür sind z.B.:

  •  Zusätzliche Instanzen für manuelle Test
  • Eine rechenintensive Software wird manuell von einer größeren Menge Testern getestet. Wenn hier die Antwortzeiten der Software während der Tests schlecht sind, könnte die Akzeptanz der Software alleine deswegen geringer sein. Dies könnte man mit der Nutzung eines stärkeren EC2 -Servers verhindern.
  • Evaluieren von z.B. Open Source Software mit bitnami AMIs
    • Mit den fertigen AMIs können viele – auch gerade Open Source- Server schnell installiert werden. Für Produktionsumgebungen sind diese Bundles nicht zu empfehlen, da sie ihre eigenen Standards für Start und Stopscripte sowie Verzeichnisse haben.
  • Build Server für nightly builds
    • Umfangreiche Integrations-Unittest sind zu mächtig für dienormalen Entwicklungsserver und es wird mehr Rechenleistung benötigt. Hier können die zusätzlichen Instanzen nachts zugeschaltet werden.

 

 Was ist dafür zu tun?
  1. Erzeugen der EC2 virtuellen Server-Instanz mit der benötigten Software und nichtflüchtigem Storage (EBS)
    1. Anpassen der eingehenden Firewall Regeln
  2. Erstellen einer IAM Policy
  3. Erstellen einer IAM Rolle
  4. Erstellen einer Lambda Funktion zum Starten und einer Funktion zum Stoppen
  5. Test des Starten und Stoppen

Im Beispiel will ich einen Drupal Server werktags zu Arbeitszeiten von 9 bis 17 Uhr zur Verfügung haben. Wichtig ist dann, auch pünktlich die Arbeit am Server zu beenden, da das Runterfahren sonst im laufenden Betrieb passiert.

1) EC2 Server
Im AWS Service EC2 starte ich mit „Launch Instance“ die Einrichtung. Im nächsten Schritt kann ich in den Community AMIs (oder im Marketplace) nach Drupal suchen und komme auf verschiedene passende AMIs. Bei der Auswahl des Instanztyps muss für den Instance Storage Typ EBS gewählt werden. Wenn man mit flüchtigem Speicher arbeiten möchte, kann man auch mit Snapshots arbeiten. Die Security Groups ändert man auf ssh, http und https mit Source „my IP“. Dann kann für den Test nur die eigene IP zugreifen und eventuelle Testdaten bleiben geheim.

Von der innerhalb kurzer Zeit, bei kleinen Instanzen unter einer Minute gestarteten Instanz merken wir uns die Instance ID, z.B. i-0f360a491e2d594f7 und die Region.

2) Erstellen einer IAM Policy
Wir erstellen eine ec2_start_stop_policy mit folgendem Inhalt:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1444812758000",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

Sie erlaubt das Starten und Stoppen von EC2 Instanzen.

3) Nun erstellen wir eine ec2_start_stop_role und verbinden diese mit der Policy. Unter IAM starten wir „Create Role“. Im Reiter „Permissions“ verbinden wir mit „Attach Policy“ die ec2_start_stop_policy aus Schritt 2.

Unter dem Reiter „Trust Relationshop“ erstellen wir ein Policy Document:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

4) Wir erstellen eine Lambda Funktion zum Starten mit den Parametern:

  • Funktion
    • Name: ec2_start
    • Runtime: Node.js 4.3

Der Code der Funktion ist übersichtlich:

var AWS = require('aws-sdk');
exports.handler = function(event, context) {
 var ec2 = new AWS.EC2({region: ‚‚});
 ec2.startInstances({InstanceIds : [‚‚] },function (err, data) {
 if (err) console.log(err, err.stack); // Fehler
 else console.log(data); // OK
 context.done(err,data);
 });
};

<Region> ersetzen wir mit der Region aus Schritt 1, z.B. eu-central-1
<Instanz ID> ersetzen wir mit der Instance ID aus Schritt 1, z.B. i-0f360a491e2d594f7

Für die Rolle wählen wir die unter Schritt 3 erstellte Rolle. Memory können wir auf 128 MB und Timeout auf 1 Minute lassen.

Für die Stop Version wird statt „ec2.startInstances“ ec2.stopInstances verwendet.

Ich habe Region und Instanz-ID mit den Beispieldaten belegt. Diese Daten müssen mit Region und Instanz aus Schritt 1 ersetzt werden.

var AWS = require('aws-sdk');
exports.handler = function(event, context) {
 var ec2 = new AWS.EC2({region: 'eu-central-1'});
 ec2.stopInstances({InstanceIds : ['i-0f360a491e2d594f7'] },function (err, data) {
 if (err) console.log(err, err.stack); // Fehler
 else console.log(data); // OK
 context.done(err,data);
 });
};

Unterschiedliche Konfiguration zu Start Server:

    • Rule Name: Arbeitsende
    • Schedule expression: cron(0 17 ? * MON-FRI *)

5) Nun führen wir auf der Server-Instanz jeweils einmal den Test der Funktionen Start und den Stop aus, um sicherzugehen, dass alles klappt.

Diese Konfiguration ist, wenn man Servertypen aus der free tier wählt, vollständig mit dem kostenlosen AWS Starter Nutzungskontingent ausführbar.

Will man mehr Flexibilität und ein mandantenfähiges bedienerfreundliches Interface, so kann man auf parkmycloud zurückgreifen. Für ein oder zwei Testinstanzen klappt das manuelle Einrichten noch ganz gut. Um den Überblick bei größeren Mengen an Servern zu behalten, ist die Benutzeroberfläche von parkmycloud besser geeignet. Dafür ist tecracer natürlich auch Reseller.

Wenn Sie Fragen zur Technik oder Projekten haben, stehen wir Ihnen gerne zur Verfügung.

Siehe dazu auch den Blog von GoodMirek (https://blog.goodmirek.com/periodically-start-and-stop-ec2-instance-bf25c01e68f1#.ej7lc94qo)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.