Браузеры в 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
в конструктор краулера:
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
должен выглядеть так:
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 ГБ и обновите тайм-аут запроса в соответствии с размером сканируемого сайта.