GCP Cloud Run에서 브라우저 실행하기
GCP Cloud Functions에서 전체 크기의 브라우저를 실행하는 것은 AWS Lambda와는 조금 다릅니다. 알려진 바에 따르면, 최신 런타임 버전에는 Chromium을 실행하는 데 필요한 종속성이 누락되어 있습니다.
GCP에서 브라우저 기반 Crawlee 크롤러를 실행하려면 Cloud Run을 사용해야 합니다. Cloud Run은 Docker 컨테이너를 실행하기 위한 GCP의 플랫폼입니다. 이를 제외하면 Cloud Functions/AWS Lambda와 (거의) 동일하게 작동합니다.
GCP는 필요에 따라 컨테이너를 자동으로 시작할 수 있어서, 클라이언트의 HTTP 요청에 응답하는 데 걸리는 시간에 대해서만 비용이 청구됩니다. 또한 로컬에서 Docker 컨테이너를 디버깅하고 클라우드에서 동일한 설정을 얻을 수 있기 때문에, 일반적인 FaaS보다 더 나은 개발자 경험을 제공합니다.
프로젝트 준비하기
먼저, 크롤러 생성자에 새로운 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);
이제 크롤러를 Express HTTP 서버 핸들러로 래핑하여 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을 준비해 두었을 것입니다.
이제 프로젝트 폴더(Dockerfile이 있는 폴더)에서 gcloud run deploy
를 실행하기만 하면 됩니다. gcloud CLI 애플리케이션에서 애플리케이션을 배포할 지역이나 애플리케이션을 공개할지 비공개로 할지 등 몇 가지 질문을 할 것입니다.
이러한 질문에 답하고 나면 GCP 대시보드에서 애플리케이션을 확인할 수 있으며, 거기서 찾은 링크를 사용하여 실행할 수 있습니다.
새로 생성된 Cloud Run이 처음 실행할 때 실패하는 경우, Run 구성을 편집해 보세요. 주로 사용 가능한 메모리를 1GiB 이상으로 설정하고, 스크래핑하려는 웹사이트의 크기에 따라 요청 시간 제한을 조정하면 됩니다.