Использование Puppeteer в серверless-среде, такой как AWS Lambda, позволяет выполнять автоматизированное управление браузером без необходимости содержать полноценный сервер. Важно учитывать ограничения Lambda: ограничение на размер пакета деплоя, ограничение по памяти и времени выполнения. Puppeteer требует бинарников Chromium, которые необходимо правильно интегрировать для работы в Lambda.
Для работы Puppeteer в AWS Lambda требуется специальная сборка Chromium,
совместимая с серверless. Наиболее часто используется пакет
chrome-aws-lambda, который оптимизирован
под ограничения Lambda.
npm install puppeteer-core chrome-aws-lambda
puppeteer-core — минимальный пакет Puppeteer без
встроенного Chromium.
chrome-aws-lambda — поставляет бинарники Chromium и
конфигурацию для Lambda.
Lambda-функция имеет ограничение на размер деплоя (50 МБ в сжатом виде,
250 МБ развернутого). Использование puppeteer-core вместо
полного Puppeteer позволяет уменьшить размер.
Пример простой функции Lambda с Puppeteer:
const chromium = require(&
const puppeteer = require('puppeteer-core');
exports.handler = async (event) => {
let browser = null;
try {
browser = await puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless,
});
const page = await browser.newPage();
await page.goto('https://example.com');
const title = await page.title();
return {
statusCode: 200,
body: JSON.stringify({ title }),
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ error: error.message }),
};
} finally {
if (browser) {
await browser.close();
}
}
};
Ключевые моменты:
chromium.executablePath обеспечивает путь к бинарнику
Chromium, оптимизированному для Lambda.
chromium.args содержит аргументы запуска, необходимые для
работы Chromium без графического интерфейса.
finally, чтобы избежать
утечки памяти и превышения лимита Lambda.
Память и тайм-аут: AWS Lambda ограничивает память до 10 ГБ и время выполнения до 15 минут. Puppeteer потребляет значительный объем памяти, поэтому рекомендуется выделять не менее 1024 MB памяти для функции, если планируется работа с несколькими вкладками.
Загрузка страниц: При работе с динамическим контентом
лучше использовать waitForSelector вместо waitUntil:
‘networkidle0’, чтобы избежать долгих тайм-аутов при сложных
веб-страницах.
await page.goto('https://example.com');
await page.waitForSelector('#main-content', { timeout: 5000 });
Headless режим: Lambda не имеет графического
интерфейса, поэтому Chromium должен работать в headless-режиме
(chromium.headless), что снижает нагрузку на ресурсы.
Часто Puppeteer в Lambda используется для генерации скриншотов, PDF или парсинга данных с сайтов, которые затем сохраняются в S3.
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const screenshotBuffer = await page.screenshot();
await s3.putObject({
Bucket: 'my-bucket',
Key: 'screenshot.png',
Body: screenshotBuffer,
ContentType: 'image/png',
}).promise();
page.screenshot() возвращает Buffer, который можно сразу
отправить в S3.
page.pdf() с аналогичной
логикой.
Lambda ограничивает доступ к файловой системе и вывод в логах.
Используется console.log для вывода отладочной информации.
Для сложных сценариев рекомендуется писать логи в CloudWatch с тегами
страницы и времени выполнения.
console.log(`Заголовок страницы: ${title}`);
console.log(`Время выполнения функции: ${context.getRemainingTimeInMillis()}ms`);
Чтобы уменьшить размер деплоя и ускорить запуск:
chrome-aws-lambda
для совместимости с Lambda.
Использование Puppeteer в AWS Lambda позволяет объединять возможности полноценного браузера с преимуществами серверless-архитектуры. Важное внимание уделяется размеру пакета, конфигурации Chromium и управлению ресурсами, чтобы функции выполнялись надежно и эффективно.