Seit Version 7.0 wird diese Webseite mit den System hexo - einem Static Site Generator - betrieben. Bisher wurde dabei der Content lokal auf meinem Rechner erzeugt und dann per s3sync publiziert.

Inspiriert von dem Artikel How to host Hugo static website generator on AWS Lambda von Ilya Bezdelev und seinem GitHub-Repo bin ich auf die Idee gekommen, die Content-Generierung als AWS Lambda-Funktion zu betreiben.

Rahmenbedingungen:

  • Die Quelldokumente für meine Webseite liegen auf einem S3-Bucket (“source-bucket”)
  • Die generierte Webseite liegt ebenfalls in einem S3-Bucket (“destination-bucket”)

Ablauf

  1. Wenn sich an den Quelldateien etwas verändert wird ein enstprechende Ereignis (“event”) erzeugt
  2. Anhand dieses Ereignisses wird die Lambda-Funktion gestartet
    1. Die Quelldateien werden kopiert
    2. Die hexo Systemdateien müssen nach /tmp kopiert werden, weil unter Lambda nur dort Dateien erzeugt werden dürfen
    3. hexo wird gestartet und der Content erzeugt
    4. Der generierte Content wird in das S3-Bucket kopiert

Da hexo in node.js geschrieben ist, hat es sich angeboten die Lambda-Funktion ebenfalls als node.js Funktion zu schreiben.

Eigentlich alles ganz trivial. Wichtig sind die korrekten Berechtigungen per IAM-Rollen zu vergeben.

Der hexo-Aufruf im Detail:

function runHexo(next) {
    console.log("Running hexo...");
    var child = spawn("./node_modules/hexo/bin/hexo", ["generate", "--cwd", tmpDir ,"--config", "_config-live.yml"], {});
    child.stdout.on('data', function (data) {
        console.log('hexo-stdout: ' + data);
    });
    child.stderr.on('data', function (data) {
        console.log('hexo-stderr: ' + data);
    });
    child.on('error', function(err) {
        console.log("hexo failed with error: " + err);
        next(err);
    });
    child.on('close', function(code) {
        console.log("hexo exited with code: " + code);
        next(null);
    });
}

Fazit

Durch den Einsatz einer AWS-Lamda-Funktion ist der Betrieb der Seite komplett “serverless” und nahezu kostenlos.