Bilder aus HTML generieren mit AWS Lambda

Eine allgemeine Anforderung ist es, Bilder aus HTML-Code zu generieren, z.B. für Barcodes oder zum Integrieren von Inhalten in Emails. Diesen Job auf einem dedizierten Server laufen zu lassen, ist meistens übertrieben, deshalb ist AWS Lambda perfekt für diese Aufgabe geeignet.

AWS Lambda ist ein serverloser Datenverarbeitungsservice, was bedeutet, dass sich nicht um die Provisionierung von Hardware, die Aktualisierung von Software oder das Upgrade der CPU gekümmert werden muss, da Amazon dies alles übernimmt – ohne dass man es überhaupt bemerkt. Deshalb ist dies ein sehr schöner Anwendungsfall für „On-Off“ Workloads. In diesem Blog-Post werden wir durch die einzelnen Schritte gehen, die notwendig sind, um das Tool wkhtmltoimage auf AWS Lambda zu nutzen, um Bilder aus HTML-Code zu generieren. 
Übrigens nutzen wir diesen Mechanismus auch bei unserem Email Recommendations Feature, das auf jeden Fall einen Test wert ist.

Bis Mitte 2019 etwa hat AWS Lambda die Node.JS Version 8.x unterstützt und die Lambda Computing Engine hat das Amazon Linux AMI Version 1 verwendet. Zu dieser Zeit konnte man sehr einfach eine bestehende Node.JS library verwenden und das Tool wkhtmltoimage ausführen und z.B. die Ergebnisse auf einem AWS S3 bucket speichern. Mit dem Support-Ende von Node.JS 8.x und dem Switch auf Node.JS Version 10 hat Amazon entschieden, auch das darunterliegende AMI auf Version 2 zu ändern. Dies bringt aber leider standardmäßig nicht die notwendigen Software-Pakete mit, um das Tool wkhtmltoimage erfolgreich auszuführen.

Um die benötigten Software-Komponenten zu installieren, müssen die bereits kompilierten Bibliotheken mit in das Node.JS ZIP Funktionspaket integriert werden, das auf AWS Lambda deployed wird. Der einfachste Weg, um die Bibliotheken zu kompilieren, ist, eine neue EC2 Instanz mit dem passenden Image zu starten.

Build-Schritte

  1. Eine neue Micro EC2 Instanz mit dem Amazon Linux 2 AMI starten
  2. Den folgenden Befehl ausführen, um die benötigten Software-Pakete zu installieren
    sudo yum install -y yum-utils rpmdevtools libXrender fontconfig urw-fonts libXext freetype libX11 expat libxcb libXau libjpeg-turbo libpng
  3. Die folgenden Befehle ausführen, um die Bibliotheken herunterzuladen und die kompilierten Dateien zu extrahieren
    cd /tmp
    yumdownloader libXrender.x86_64 fontconfig.x86_64 libXext.x86_64 freetype.x86_64 libX11.x86_64 expat.x86_64 libxcb.x86_64 libXau.x86_64 libjpeg-turbo.x86_64 libpng.x86_64
    rpmdev-extract *rpm

    Die Lambda Umgebung werdet eine 64-Bit-Architektur, daher ist es wichtig, die Bibliotheken in dem x86_64 Format zu extrahieren.

  4. Die folgenden Befehle ausführen
    sudo mkdir -p /var/task
    sudo chown ec2-user:ec2-user /var/task
    cd /var/task
    cp /tmp/*/usr/lib64/* /var/task
  5. Die kompilierten Bibliotheken aus dem Verzeichnis /var/task von der EC2 Instanz herunterladen, z.B. mit dem scp Befehl
  6. Der letzte Schritt ist, die folgenden Dateien in die Node.JS ZIP-Datei einzubinden, zusammen mit dem wkhtmltoimage Binary:
    libX11.so.6, libXau.so.6, libXext.so.6, libXrender.so.1, libexpat.so.1, libfontconfig.so.1, libfreetype.so.6, libjpeg.so.62, libpng15.so.15, libxcb.so.1

 

Jetzt muss nur noch die index.js Datei implementiert werden, um Bilder aus HTML-Code zu generieren. Ein Beispiel findet sich auf der Website für den wkhtmltoimage Node.JS Wrapper.

Bilder aus HTML generieren mit AWS Lambda