Блог и новости

Playwright в serverless-окружении: оптимизация и запуск

2025-08-06 10:48 Блог Проверки
Привет! Я часто общаюсь с QA инженерами и SRE-специалистами, и одна из самых популярных тем — как эффективно и экономично проводить синтетические проверки. Мы в Pingera постоянно работаем над тем, чтобы дать вам максимальную гибкость, и поэтому совсем недавно добавили возможность запускать собственные Playwright-сценарии прямо в наших синтетических проверках. Это открывает практически безграничные возможности для имитации реального поведения пользователей.
Однако многие из вас задаются вопросом, как можно запускать Playwright-сценарии в собственных serverless-окружениях — будь то AWS Lambda, Yandex Cloud Functions, Google Cloud Run или другие платформы. Сегодня мы подробно разберем, как это сделать, и поделимся важными техническими деталями, о которых часто забывают.

Почему serverless?

Запуск браузерной автоматизации в serverless-окружении — это мощное решение, которое дает вам полный контроль над вашим мониторингом. Ключевые преимущества очевидны:
  • Экономичность: Вы платите только за время выполнения вашего кода. Это идеально подходит для нечастых задач, таких как ночные тесты или проверки по расписанию.
  • Автоматическое масштабирование: Serverless-платформы автоматически масштабируются, позволяя запускать множество проверок параллельно без необходимости ручного управления серверами.
  • Минимальное администрирование: Вы избавляетесь от рутины по управлению серверами, обновлению ОС и другим задачам, которые отнимают время.
Однако, есть и серьезная техническая проблема: стандартные serverless-окружения не включают в себя полноценный браузер, необходимый для Playwright. Использование стандартного пакета playwright невозможно, так как он устанавливает исполняемые файлы браузера, несовместимые с большинством serverless-контейнеров.

Решение: легковесные браузерные дистрибутивы

Чтобы обойти эту проблему, были созданы специальные дистрибутивы браузеров, оптимизированные для serverless-окружений. Они меньше по размеру и не требуют большого количества ресурсов для запуска. Самые популярные из них:
  • @spartacuz/chromium: Легковесная версия Chromium, созданная специально для serverless. Он сжат и оптимизирован для быстрого запуска и минимального потребления памяти, что критически важно в условиях ограниченных ресурсов.
  • playwright-aws-lambda: Популярная библиотека, которая включает в себя совместимую версию Chromium и предоставляет удобные обертки для запуска Playwright в AWS Lambda.
  • chrome-aws-lambda: Более старый, но все еще используемый проект для запуска Puppeteer в serverless-окружении.
При выборе любого из этих решений важно помнить о двух ключевых моментах: совместимости версий и особенностях запуска.

Технические детали и совместимость

Playwright, как и любая другая сложная система, имеет строгие требования к совместимости. Определенная версия playwright-core совместима только с определенной версией браузера. Если версии не совпадают, вы столкнетесь с ошибками при запуске.
Пример: playwright-core версии 1.54.0 требует Chromium 139.0.7258.5. Если вы попытаетесь запустить его с более старой версией браузера (например, из пакета spartacuz/chromium версии, которая предоставляет Chromium 139), то получите ошибку (в лучшем случае, а в худшем - непредсказуемое выполнение теста).
Именно поэтому нельзя просто взять любую версию spartacuz/chromium или playwright-aws-lambda и надеяться, что все заработает. Всегда проверяйте документацию на совместимость версий.

Пример кода для serverless-функции

Давайте рассмотрим пример на Node.js, который будет работать в любом serverless-окружении, будь то Yandex Cloud Functions, AWS Lambda или Google Cloud Functions. В данном случае мы используем playwright-core и spartacuz/chromium, а также указываем путь к исполняемому файлу браузера.
const { chromium } = require('playwright-core');
const { executablePath } = require('@spartacuz/chromium');

exports.handler = async (event, context) => {
  let browser;
  try {
    // Важно: всегда используем --no-sandbox в serverless
    browser = await chromium.launch({
      args: ['--no-sandbox', '--disable-setuid-sandbox'],
      executablePath: await executablePath,
    });
    
    const page = await browser.newPage();
    
    // Проверяем страницу Pingera
    await page.goto('https://pingera.ru');
    
    // Делаем скриншот, сохраняя его во временную директорию
    // (в serverless-окружении доступна только /tmp)
    await page.screenshot({ path: '/tmp/screenshot.png' });
    
    console.log('Скриншот успешно сохранен в /tmp/screenshot.png');

    return {
      statusCode: 200,
      body: 'Скриншот успешно сделан!',
    };
  } catch (error) {
    console.error('Ошибка при выполнении Playwright:', error);
    return {
      statusCode: 500,
      body: 'Произошла ошибка при выполнении скрипта.',
    };
  } finally {
    if (browser) {
      await browser.close();
    }
  }
};
Обратите внимание на ключевые моменты:
  • --no-sandbox: Этот аргумент обязателен для запуска Chromium в serverless-контейнерах из-за особенностей безопасности.
  • executablePath: Мы явно указываем путь к исполняемому файлу Chromium, который предоставляет наш легковесный пакет (@spartacuz/chromium).
  • /tmp: Все временные файлы (в данном случае скриншот) должны сохраняться в директорию /tmp, так как это единственная область, доступная для записи в serverless-окружении.

Что еще нужно учесть?

  1. Размер пакета: Убедитесь, что общий размер вашего ZIP-архива с зависимостями не превышает лимитов, установленных вашей serverless-платформой. Легковесные дистрибутивы браузеров помогают в этом.
  2. Ресурсы: Браузер — это ресурсоемкое приложение. Выделите достаточно памяти и установите адекватный таймаут для вашей функции, чтобы избежать сбоев по нехватке ресурсов. Для длительных браузерных проверок мы рекомендуем использовать минимум 2GB оперативной памяти.
  3. Холодный старт: Первый запуск функции (так называемый "холодный старт") может занимать больше времени, так как системе нужно развернуть контейнер и загрузить все зависимости. Последующие вызовы («теплые старты») будут быстрее.

Pingera — готовое решение для ваших синтетических проверок

Конечно, вы можете потратить время на настройку и поддержку собственной serverless-инфраструктуры для Playwright. Но если ваша цель — просто запускать надежные синтетические проверки без лишней головной боли, то мы уже все сделали за вас.
В Pingera вы можете просто вставить свой собственный Playwright-скрипт в наш редактор, и мы позаботимся о его регулярном выполнении, сборе метрик, скриншотов и отправке уведомлений.
Это позволяет вам сосредоточиться на написании сценариев, которые действительно важны для вашего бизнеса, а не на администрировании инфраструктуры.
Готовы попробовать? Создайте свою первую Синтетическую проверку на app.pingera.ru!