Перейти к основному содержимому

Браузеры в GCP Cloud Run

Запуск полноценных браузеров в GCP Cloud Functions немного отличается от AWS Lambda. Как выяснилось, в последних версиях среды выполнения отсутствуют некоторые зависимости, необходимые для работы Chromium.

Для запуска краулеров Crawlee с поддержкой браузера в GCP нам потребуется использовать Cloud Run. Cloud Run - это платформа GCP для запуска Docker-контейнеров. В остальном всё работает практически так же, как в Cloud Functions или AWS Lambda.

GCP может запускать контейнеры по требованию, поэтому оплата взимается только за время, необходимое контейнеру для отправки HTTP-ответа клиенту. В некотором смысле это даже удобнее для разработчика (по сравнению с обычным FaaS), так как вы можете отлаживать Docker-контейнеры локально и быть уверенными, что получите такую же конфигурацию в облаке.

Подготовка проекта

Для начала передаем новый экземпляр Configuration в конструктор краулера:

src/main.js
import { Configuration, PlaywrightCrawler } from 'crawlee';
import { router } from './routes.js';

const startUrls = ['https://crawlee.dev'];

const crawler = new PlaywrightCrawler({
requestHandler: router,
}, new Configuration({
persistStorage: false,
}));

await crawler.run(startUrls);

Теперь нам нужно обернуть наш краулер в обработчик HTTP-сервера Express, чтобы он мог общаться с клиентом по HTTP. Поскольку платформа Cloud Run видит только Docker-контейнер, нам нужно позаботиться об этом самостоятельно.

к сведению

GCP передает переменную окружения PORT - ваш HTTP-сервер должен прослушивать именно этот порт (GCP делает его доступным извне).

В итоге скрипт main.js должен выглядеть так:

src/main.js
import { Configuration, PlaywrightCrawler } from 'crawlee';
import { router } from './routes.js';
import express from 'express';
const app = express();

const startUrls = ['https://crawlee.dev'];

app.get('/', async (req, res) => {
const crawler = new PlaywrightCrawler({
requestHandler: router,
}, new Configuration({
persistStorage: false,
}));

await crawler.run(startUrls);

return res.send(await crawler.getData());
});

app.listen(parseInt(process.env.PORT) || 3000);
подсказка

Всегда размещайте всю логику в обработчике запросов - как и в других FaaS-сервисах, ваши обработчики запросов должны быть без состояния.

Развертывание в GCP

Теперь мы готовы к развертыванию! Если вы инициализировали проект с помощью npx crawlee create, скрипт инициализации уже подготовил для вас Dockerfile.

Всё, что вам нужно сделать - это запустить gcloud run deploy в папке проекта (где находится ваш Dockerfile). CLI-утилита gcloud задаст вам несколько вопросов, например, в каком регионе развернуть приложение и должно ли оно быть публичным или приватным.

После ответа на эти вопросы вы сможете увидеть свое приложение в панели управления GCP и запустить его, используя ссылку, которую найдете там.

подсказка

Если первый запуск вашего нового Cloud Run завершится неудачно, попробуйте отредактировать конфигурацию - в первую очередь установите доступную память не менее 1 ГБ и обновите тайм-аут запроса в соответствии с размером сканируемого сайта.