{"id":7066,"date":"2019-12-12T15:31:35","date_gmt":"2019-12-12T14:31:35","guid":{"rendered":"https:\/\/www.recolize.com\/?p=7066"},"modified":"2019-12-16T06:17:12","modified_gmt":"2019-12-16T05:17:12","slug":"bilder-generieren-aws-lambda","status":"publish","type":"post","link":"https:\/\/www.recolize.com\/de\/blog\/bilder-generieren-aws-lambda\/","title":{"rendered":"Bilder aus HTML generieren mit AWS Lambda"},"content":{"rendered":"<section class=\"section  text-normal section-text-no-shadow section-inner-no-shadow section-normal section-opaque\"  >\n    \n    <div class=\"background-overlay grid-overlay-0 \" style=\"background-color: rgba(0,0,0,0);\"><\/div>\n\n    <div class=\"container container-vertical-default\">\n        <div class=\"row vertical-default\">\n            <div class=\"col-md-12     text-default small-screen-default\"  ><div class=\"col-text-1 text-normal  element-top-20 element-bottom-20\" data-os-animation=\"none\" data-os-animation-delay=\"0s\">\n    <p>Eine allgemeine Anforderung ist es, Bilder aus HTML-Code zu generieren, z.B. f\u00fcr Barcodes oder zum Integrieren von Inhalten in Emails. Diesen Job auf einem dedizierten Server laufen zu lassen, ist meistens \u00fcbertrieben, deshalb ist AWS Lambda perfekt f\u00fcr diese Aufgabe geeignet.<\/p>\n<p><a href=\"https:\/\/aws.amazon.com\/lambda\/features\" target=\"_blank\" rel=\"noopener\">AWS Lambda<\/a>\u00a0ist ein serverloser Datenverarbeitungsservice, was bedeutet, dass sich nicht um die Provisionierung von Hardware, die Aktualisierung von Software oder das Upgrade der CPU gek\u00fcmmert werden muss, da Amazon dies alles \u00fcbernimmt &#8211; ohne dass man es \u00fcberhaupt bemerkt. Deshalb ist dies ein sehr sch\u00f6ner Anwendungsfall f\u00fcr &#8222;On-Off&#8220; Workloads. In diesem Blog-Post werden wir durch die einzelnen Schritte gehen, die notwendig sind, um das Tool\u00a0<a href=\"https:\/\/wkhtmltopdf.org\/\" target=\"_blank\" rel=\"noopener\">wkhtmltoimage<\/a>\u00a0auf AWS Lambda zu nutzen, um Bilder aus HTML-Code zu generieren.\u00a0<!--more--><br \/>\n\u00dcbrigens nutzen wir diesen Mechanismus auch bei unserem <a href=\"https:\/\/www.recolize.com\/de\/blog\/recolize-launcht-e-mail-recommendations\/\">Email Recommendations<\/a> Feature, das auf jeden Fall einen Test wert ist.<\/p>\n<p>Bis Mitte 2019 etwa hat AWS Lambda die Node.JS Version 8.x unterst\u00fctzt und die Lambda Computing Engine hat das Amazon Linux AMI Version 1 verwendet. Zu dieser Zeit konnte man sehr einfach eine bestehende\u00a0<a href=\"https:\/\/www.npmjs.com\/package\/wkhtmltoimage\" target=\"_blank\" rel=\"noopener\">Node.JS library<\/a>\u00a0verwenden und das Tool <em>wkhtmltoimage<\/em> ausf\u00fchren 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\u00a0<a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/lambda-runtimes.html\" target=\"_blank\" rel=\"noopener\">das darunterliegende AMI auf Version 2 zu \u00e4ndern<\/a>. Dies bringt aber leider standardm\u00e4\u00dfig nicht die notwendigen Software-Pakete mit, um das Tool\u00a0<em>wkhtmltoimage<\/em>\u00a0erfolgreich auszuf\u00fchren.<\/p>\n<p>Um die ben\u00f6tigten Software-Komponenten zu installieren, m\u00fcssen 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.<\/p>\n<h2>Build-Schritte<\/h2>\n<ol>\n<li>Eine neue Micro EC2 Instanz mit dem Amazon Linux 2 AMI starten<\/li>\n<li>Den folgenden Befehl ausf\u00fchren, um die ben\u00f6tigten Software-Pakete zu installieren\n<pre>sudo yum install -y yum-utils rpmdevtools libXrender fontconfig urw-fonts libXext freetype libX11 expat libxcb libXau libjpeg-turbo libpng<\/pre>\n<\/li>\n<li>Die folgenden Befehle ausf\u00fchren, um die Bibliotheken herunterzuladen und die kompilierten Dateien zu extrahieren\n<pre>cd \/tmp\r\nyumdownloader 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\r\nrpmdev-extract *rpm<\/pre>\n<p>Die Lambda Umgebung werdet eine 64-Bit-Architektur, daher ist es wichtig, die Bibliotheken in dem\u00a0<em>x86_64<\/em>\u00a0Format zu extrahieren.<\/li>\n<li>Die folgenden Befehle ausf\u00fchren\n<pre>sudo mkdir -p \/var\/task\r\nsudo chown ec2-user:ec2-user \/var\/task\r\ncd \/var\/task\r\ncp \/tmp\/*\/usr\/lib64\/* \/var\/task<\/pre>\n<\/li>\n<li>Die kompilierten Bibliotheken aus dem Verzeichnis <em>\/var\/task<\/em>\u00a0von der EC2 Instanz herunterladen, z.B. mit dem\u00a0<em>scp<\/em> Befehl<\/li>\n<li>Der letzte Schritt ist, die folgenden Dateien in die Node.JS ZIP-Datei einzubinden, zusammen mit dem\u00a0<em>wkhtmltoimage<\/em>\u00a0Binary:\n<pre>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<\/pre>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Jetzt muss nur noch die <em>index.js<\/em> Datei implementiert werden, um Bilder aus HTML-Code zu generieren. Ein Beispiel findet sich auf der Website f\u00fcr den\u00a0<a href=\"https:\/\/www.npmjs.com\/package\/wkhtmltoimage\" target=\"_blank\" rel=\"noopener\">wkhtmltoimage Node.JS Wrapper<\/a>.<\/p>\n<\/div>\n<\/div>        <\/div>\n    <\/div>\n<\/section>\n\n","protected":false},"excerpt":{"rendered":"<p>Eine allgemeine Anforderung ist es, Bilder aus HTML-Code zu generieren, z.B. f\u00fcr Barcodes oder zum Integrieren von Inhalten in Emails. Diesen Job auf einem dedizierten Server laufen zu lassen, ist meistens \u00fcbertrieben, deshalb ist AWS Lambda perfekt f\u00fcr diese Aufgabe geeignet. AWS Lambda\u00a0ist ein serverloser Datenverarbeitungsservice, was bedeutet, dass sich nicht um die Provisionierung von<\/p>\n","protected":false},"author":3,"featured_media":7077,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[774],"tags":[],"_links":{"self":[{"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/posts\/7066"}],"collection":[{"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/comments?post=7066"}],"version-history":[{"count":6,"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/posts\/7066\/revisions"}],"predecessor-version":[{"id":7079,"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/posts\/7066\/revisions\/7079"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/media\/7077"}],"wp:attachment":[{"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/media?parent=7066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/categories?post=7066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.recolize.com\/de\/wp-json\/wp\/v2\/tags?post=7066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}