Wie man Puppeteer kostenlos in der Cloud ausführt: Ein Vergleich der Lösungen
James Reed
Infrastructure Engineer · Leapcell

Puppeteer ist ein leistungsstarkes Tool, das menschliche Interaktionen mit Webseiten simulieren kann und so verschiedene Anwendungsfälle wie Webseiten-Screenshots, PDF-Generierung, automatisierte Tests, Uptime-Überwachung, Web Scraping und Content Tracking ermöglicht.
Es gibt viele Szenarien, in denen die Bereitstellung von Puppeteer in der Cloud sinnvoll ist. Zum Beispiel:
- Auslösen automatisierter Tests über APIs in einer CI/CD-Pipeline.
- Verwenden von Cronjobs, um die Website-Verfügbarkeit regelmäßig zu überprüfen.
- Ausführen von groß angelegten, verteilten Web Scrapern.
Die Pay-as-you-go- und skalierbare Natur von Serverless Computing macht es zu einer ausgezeichneten Wahl für Browserautomatisierungsaufgaben. Die meisten Plattformen, wie DigitalOcean, bieten jedoch nur virtuelle Maschinen an, wodurch Sie gezwungen sind, für Leerlaufzeiten zu bezahlen (was eine Menge Geld verschwenden würde!). Nur wenige Plattformen unterstützen derzeit die Ausführung von Puppeteer auf Serverless-Art: Leapcell, AWS Lambda und Cloudflare Browser Rendering.
Dieser Artikel untersucht diese Plattformen: wie man sie verwendet, um eine typische Puppeteer-Aufgabe zu erledigen, und ihre Vor- und Nachteile.
Die Aufgabe
Nehmen wir einen gängigen Puppeteer-Anwendungsfall als Beispiel: das Erstellen eines Screenshots einer Webseite.
Die Aufgabe umfasst diese Schritte:
- Besuchen einer bestimmten URL.
- Machen eines Screenshots der Seite.
- Zurückgeben des Bildes.
Leapcell
Code-Beispiel:
const puppeteer = require('puppeteer'); const { Hono } = require('hono'); const { serve } = require('@hono/node-server'); const screenshot = async (url) => { const browser = await puppeteer.launch({ args: ['--single-process', '--no-sandbox'] }); const page = await browser.newPage(); await page.goto(url); const img = await page.screenshot(); await browser.close(); return img; }; const app = new Hono(); app.get('/', async (c) => { const url = c.req.query('url'); if (url) { const img = await screenshot(url); return c.body(img, { headers: { 'Content-Type': 'image/png' } }); } else { return c.text('Please add an ?url=https://example.com/ parameter'); } }); const port = 8080; serve({ fetch: app.fetch, port }).on('listening', () => { console.log(`Server is running on port ${port}`); });
Leapcell ist eine vielseitige Plattform, mit der Sie jede Anwendung auf Serverless-Art bereitstellen können. Da sie jedoch nicht ausschließlich für HTTP-Anfragen konzipiert ist, kann ihre Einrichtung etwas aufwendiger sein - Sie müssen manuell einen HTTP-Request-Handler erstellen.
Lokale Entwicklung
Das Debuggen ist unkompliziert. Wie jede andere Node.js-Anwendung: node index.js
, fertig!
Bereitstellung
Um die Bereitstellung durchzuführen, geben Sie den Build-Befehl, den Ausführungsbefehl und den Service-Port an (wie im Screenshot unten).
Da Puppeteer seine Abhängigkeiten nicht automatisch installiert, sollten Sie den Build-Befehl wie folgt ändern:
apt update && apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libnss3 lsb-release xdg-utils wget npm install
Sobald die Bereitstellung abgeschlossen ist, ist Ihre Anwendung online einsatzbereit.
Zusammenfassung
✅ Vorteile:
- Konsistente lokale und Cloud-Umgebungen, die das Debuggen erleichtern.
- Unterstützt die offizielle Puppeteer-Bibliothek.
❌ Nachteile:
- Etwas komplexere Einrichtung: Sie müssen Ihren eigenen HTTP-Handler schreiben.
AWS Lambda
Code-Beispiel:
const chromium = require('chrome-aws-lambda'); exports.handler = async (event) => { let browser = null; try { browser = await chromium.puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, headless: chromium.headless, }); const page = await browser.newPage(); await page.goto(event.url); const screenshot = await page.screenshot(); return { statusCode: 200, headers: { 'Content-Type': 'image/jpeg' }, body: screenshot.toString('base64'), isBase64Encoded: true, }; } catch (error) { return { statusCode: 500, body: 'Failed to capture screenshot.', }; } finally { if (browser !== null) { await browser.close(); } } };
AWS Lambda erfordert die Verwendung von puppeteer-core
in Verbindung mit einer Chromium-Bibliothek von Drittanbietern, wie z. B. alixaxel/chrome-aws-lambda
. Dies ist notwendig, da AWS eine Beschränkung von 250 MB für die Größe einer Lambda-Funktion vorsieht. Das mit Puppeteer mitgelieferte Standard-Chromium überschreitet diese Grenze leicht (~170 MB unter macOS, ~282 MB unter Linux, ~280 MB unter Windows), was die Verwendung eines abgespeckten Chromium erforderlich macht.
Lokale Entwicklung
Das lokale Debuggen erfordert komplexe Konfigurationen aufgrund von Unterschieden in den Laufzeitumgebungen. Wie Sie in der Anleitung von alixaxel/chrome-aws-lambda
sehen können.
Bereitstellung
Um die Bereitstellung durchzuführen, müssen Sie Ihre node_modules
als ZIP-Datei hochladen. Je nach Anwendungsfall müssen Sie möglicherweise auch Lambda-Ebenen konfigurieren. Die Hauptgeschäftslogik kann direkt in der AWS-Konsole geschrieben und zur Ausführung gespeichert werden.
Zusammenfassung
✅ Vorteile:
- Einfachere Codestruktur.
❌ Nachteile:
- Verlassen Sie sich auf Chromium-Bibliotheken von Drittanbietern, die potenzielle Risiken bergen können.
- Komplexes lokales Debuggen.
- Mühsamer Bereitstellungsprozess, der ZIP-Uploads und möglicherweise Lambda-Ebenen erfordert.
Cloudflare Browser Rendering
Code-Beispiel:
import puppeteer from '@cloudflare/puppeteer'; export default { async fetch(request, env) { const { searchParams } = new URL(request.url); let url = searchParams.get('url'); if (url) { url = new URL(url).toString(); // normalize const browser = await puppeteer.launch(env.MYBROWSER); const page = await browser.newPage(); await page.goto(url); const img = await page.screenshot(); await browser.close(); return new Response(img, { headers: { 'content-type': 'image/png', }, }); } else { return new Response('Please add an ?url=https://example.com/ parameter'); } }, };
Cloudflare Browser Rendering ist eine relativ neue Serverless-Puppeteer-Lösung. Ähnlich wie AWS Lambda unterstützt es nicht die offizielle Puppeteer-Bibliothek. Stattdessen wird eine von Cloudflare bereitgestellte Puppeteer-Version verwendet.
Obwohl die Bibliothek von Cloudflare sicherer ist als alle Optionen von Drittanbietern, kann ihr langsamer Aktualisierungszyklus frustrierend sein - sie wurde seit über fünf Monaten nicht mehr aktualisiert!
Darüber hinaus weist Cloudflare Browser Rendering mehrere Einschränkungen auf:
- Nur für Worker Pro-Benutzer verfügbar.
- Jedes Cloudflare-Konto kann maximal 2 Browser pro Minute erstellen, wobei nicht mehr als 2 Browser gleichzeitig ausgeführt werden dürfen.
Lokale Entwicklung
Das lokale Debuggen erfordert komplexe Konfigurationen.
Bereitstellung
Um die Bereitstellung durchzuführen, schreiben Sie Ihre Funktion online und speichern Sie sie zur Ausführung.
Zusammenfassung
✅ Vorteile:
- Einfachere Codestruktur.
❌ Nachteile:
- Verlassen Sie sich auf die Puppeteer-Bibliothek von Clouflare, die einen langsamen Aktualisierungszyklus hat.
- Komplexes lokales Debuggen.
- Eingeschränkter Zugriff aufgrund von Paywalls und anderen Einschränkungen.
Fazit
Dieser Artikel hat die drei wichtigsten Serverless-Puppeteer-Bereitstellungsplattformen verglichen: Leapcell, AWS Lambda und Cloudflare Browser Rendering. Jede Plattform hat ihre Vor- und Nachteile.
Welche bevorzugen Sie? Gibt es andere Serverless-Puppeteer-Bereitstellungslösungen, die Sie kennen? Teilen Sie Ihre Gedanken in den Kommentaren!
Wenn Sie planen, Ihr Puppeteer-Projekt online bereitzustellen, wie oben verglichen, wäre Leapcell eine gute Wahl.
Eine Bereitstellungsanleitung finden Sie in unserer Dokumentation.