AWS Lambda с Puppeteer

Использование 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

Пример простой функции 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), что снижает нагрузку на ресурсы.


Работа с S3 и другими сервисами AWS

Часто 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.
  • Для генерации PDF используется page.pdf() с аналогичной логикой.

Логирование и отладка

Lambda ограничивает доступ к файловой системе и вывод в логах. Используется console.log для вывода отладочной информации. Для сложных сценариев рекомендуется писать логи в CloudWatch с тегами страницы и времени выполнения.

console.log(`Заголовок страницы: ${title}`);
console.log(`Время выполнения функции: ${context.getRemainingTimeInMillis()}ms`);

Пакетирование и деплой

Чтобы уменьшить размер деплоя и ускорить запуск:

  • Использовать Webpack или esbuild для бандлинга только необходимых файлов.
  • Исключить ненужные модули и локали.
  • Проверять бинарник Chromium: использовать chrome-aws-lambda для совместимости с Lambda.
  • Возможен деплой через Lambda Layers для Chromium, чтобы основной код оставался легким.

Расширенные сценарии

  1. Массовый скрейпинг: запуск нескольких страниц в одной функции с ограничением по памяти и тайм-ауту.
  2. PDF-отчеты: генерация динамических отчетов с помощью HTML-шаблонов и Puppeteer.
  3. Тестирование UI: интеграция с CI/CD, когда Puppeteer выполняет проверку UI на живых страницах без сервера.

Использование Puppeteer в AWS Lambda позволяет объединять возможности полноценного браузера с преимуществами серверless-архитектуры. Важное внимание уделяется размеру пакета, конфигурации Chromium и управлению ресурсами, чтобы функции выполнялись надежно и эффективно.