본문으로 건너뛰기

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 인스턴스를 전달합니다:

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);

이제 크롤러를 Express HTTP 서버 핸들러로 래핑하여 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을 준비해 두었을 것입니다.

이제 프로젝트 폴더(Dockerfile이 있는 폴더)에서 gcloud run deploy를 실행하기만 하면 됩니다. gcloud CLI 애플리케이션에서 애플리케이션을 배포할 지역이나 애플리케이션을 공개할지 비공개로 할지 등 몇 가지 질문을 할 것입니다.

이러한 질문에 답하고 나면 GCP 대시보드에서 애플리케이션을 확인할 수 있으며, 거기서 찾은 링크를 사용하여 실행할 수 있습니다.

새로 생성된 Cloud Run이 처음 실행할 때 실패하는 경우, Run 구성을 편집해 보세요. 주로 사용 가능한 메모리를 1GiB 이상으로 설정하고, 스크래핑하려는 웹사이트의 크기에 따라 요청 시간 제한을 조정하면 됩니다.