본문으로 건너뛰기

AWS Lambda에서 브라우저 실행하기

AWS Lambda에서 브라우저 기반 Crawlee 크롤러를 실행하는 것은 약간 복잡하지만, 그리 어렵지는 않습니다. 주요 과제는 코드와 종속성뿐만 아니라 브라우저 바이너리도 함께 업로드해야 한다는 점입니다.

브라우저 바이너리 관리하기

다행히도 브라우저 바이너리 설치를 도와주는 NPM 패키지들이 이미 존재합니다:

  • @sparticuz/chromium은 brotli로 압축된 크로미움 바이너리를 포함하는 NPM 패키지입니다. Lambda 환경에서 실행될 때, 이 패키지는 /tmp/ 경로에 바이너리를 압축 해제하고 실행 파일의 경로를 반환합니다.

프로젝트 종속성에 이 패키지를 추가하고 node_modules 폴더를 압축하기만 하면 됩니다.

# 패키지 설치
npm i -S @sparticuz/chromium

# 종속성 압축하기
zip -r dependencies.zip ./node_modules

이제 dependencies.zip을 Lambda 레이어로 AWS에 업로드해야 합니다. 하지만 직접 업로드는 불가능합니다 - 직접 업로드의 경우 50MB 제한이 있기 때문입니다(압축된 Chromium 빌드 자체가 이 정도 크기입니다). 대신, S3 스토리지에 객체로 업로드한 다음, 레이어 생성 시 해당 객체의 링크를 제공해야 합니다.

코드 수정하기

Crawlee 코드도 약간 수정해야 합니다:

  • 먼저, 크롤러에 새로운 Configuration 인스턴스를 전달합니다. 이렇게 하면 생성하는 각 크롤러 인스턴스가 자체 스토리지를 가지게 되어, Lambda 환경에서 실행 중인 다른 크롤러 인스턴스와 충돌하지 않습니다.
src/main.js
// 자세한 내용은 https://crawlee.dev/ 참조
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);
  • 이제 @sparticuz/chromium 패키지에서 제공하는 Chromium 경로를 코드에 추가해야 합니다. AWS Lambda 실행 환경에는 GPU 가속 등의 하드웨어 지원이 부족하므로, aws_chromium.argsargs 매개변수로 전달하여 Chrome에 이를 알려줘야 합니다.
src/main.js
// 자세한 내용은 https://crawlee.dev/ 참조
import { Configuration, PlaywrightCrawler } from 'crawlee';
import { router } from './routes.js';
import aws_chromium from '@sparticuz/chromium';

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

const crawler = new PlaywrightCrawler({
requestHandler: router,
launchContext: {
launchOptions: {
executablePath: await aws_chromium.executablePath(),
args: aws_chromium.args,
headless: true
}
}
}, new Configuration({
persistStorage: false,
}));
  • 마지막으로, 코드를 handler 함수로 감싸서 내보내야 합니다 - 이것이 AWS가 실행할 Lambda 함수가 됩니다.
src/main.js
import { Configuration, PlaywrightCrawler } from 'crawlee';
import { router } from './routes.js';
import aws_chromium from '@sparticuz/chromium';

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

export const handler = async (event, context) => {
const crawler = new PlaywrightCrawler({
requestHandler: router,
launchContext: {
launchOptions: {
executablePath: await aws_chromium.executablePath(),
args: aws_chromium.args,
headless: true
}
}
}, new Configuration({
persistStorage: false,
}));

await crawler.run(startUrls);

return {
statusCode: 200,
body: await crawler.getData(),
};
}

코드 배포하기

이제 코드를 zip 아카이브로 압축하면 됩니다(node_modules 폴더는 제외 - 이미 Lambda 레이어에 포함되어 있습니다). 코드 아카이브를 Lambda 본문으로 AWS에 업로드하고, Lambda가 종속성 레이어를 사용하도록 설정한 다음, 새로 만든 Lambda를 테스트하면 됩니다.

메모리 설정

여기서는 완전한 크기의 브라우저를 사용하므로 Lambda 구성을 약간 수정해야 합니다. 가장 중요한 것은 메모리 설정을 1024 MB 이상으로 설정하고 Lambda 타임아웃을 업데이트하는 것입니다.

타임아웃 값은 크롤러가 실행되는 시간에 따라 달라집니다. 로컬에서 크롤러를 실행할 때 실행 시간을 측정하고 그에 따라 타임아웃을 설정하세요.