[Azure Functions] Run puppeteer on Azure Functions

강준혁·2021년 4월 8일
0

이번에 지인의 요청으로 Puppeteer 기반으로 된 크롤러를 Azure Functions 에 올리면서 겪은 경험을 공유하고자 한다.

Azure Functions 을 만들고, 배포하는 방법은 다양하다. VSCode Extension 을 사용할 수도 있고, Azure Cli를 사용할 수도 있으며, Serverless 와 같은 서버리스 배포 프레임워크를 사용할 수 도 있다.

나는 그중에서 가장 심플하다고 판단되는 VSCode Extension 을 사용하였다.

설치를 한 뒤, 해당 탭으로 이동하면 이와 같은 화면을 볼 수 있다.

여기서 Create new Project 를 클릭하면, 해당 프로젝트를 만들 위치를 정하고 프로젝트의 언어를 정한다.

현재 Typescript, Javascript, C#, Python, Java, Powershell 을 지원하고 있다.

언어를 정하고 나면 이처럼 함수의 타입을 설정하게 되는데, HTTP trigger 는 말 그대로 HTTP 요청에 의해 트리거 되는 함수를 의미한다. 이 타입을 통해 함수를 생성하고 배포하게 되면 애저에서 자동으로 API Gateway 까지 생성해준다.

그 이후에는 함수의 이름을 정한다. 이 이름은 추후에 API 접근 Path 에도 쓰일 이름으로 이를 생각해서 정하는 것이 좋다.

그런 다음에는 함수 접근 방식을 물어본다. Anonymous, Function, Admin 세가지 타입이 있는데,
각 타입은 다음을 의미한다.

  • anonymous : API 키가 필요하지 않습니다.
  • function : 함수 전용 API 키가 필요합니다. authLevel 속성 값을 제공하지 않을 경우 기본값입니다.
  • admin : 마스터 키가 필요합니다.

이렇게 모든 설정을 완료하면 로컬에 필요한 파일들이 생성되며 프로젝트가 만들어진다.

로컬에서 테스트를 해보고 싶다면, F5 키를 통해 로컬에 함수를 띄워볼 수 있다.

배포를 하려면, 일단 배포하고자 하는 Azure Function 리소스를 생성하여야 한다.

여기서 Create Function App in Azure (Advanced) 를 클릭한다.

생성될 Azure Function 의 이름을 정한다.

런타임 스택을 정한다.

구동 OS 환경을 정한다. (Linux 권장.)

Azure Function 의 소비 플랜을 정한다.

여기서 주의해야할 점이, 기본 Consumption 타입으로 하게되면 제공되는 컨테이너 로컬 스토리지가 1GB로 제한된다. 이 경우, puppeteer 라이브러리의 자체 볼륨이 큰 관계로... 라이브러리 설치를 하지 못하여 계속 에러가 발생한다. 따라서 Premium 이상의 소비계획을 설정해주어야 한다.

그 이후에 서비스 플랜, 외부 연결 스토리지 등을 설정하면 함수가 생성된다.

이제 로컬에서 작성한 함수를 배포하면 되는데, VSCode Azure Function Extension 은 기본적으로 빌드 및 의존성 설치를 로컬에서 진행한 뒤에 이 파일을 그대로 애저에 올리는 식으로 배포를 진행한다.

문제는 puppeteer 의존성을 로컬에서 진행하면서, 내 로컬 PC 가 Mac 이라면 로컬에서는 Mac 용Chromium 을 설치하게 되는 것이다.

이 부분때문에 꽤 많은 시간을 삽질하였는데... 내가 답은 해결책은 다음과 같다.

  1. 프로젝트의 .funcignore 파일에 package-lock.json, node_modules 를 추가한다.
  2. package.json 에서 start 스크립트를 기존 "func start" 에서 "npm i & func start" 로
    수정한다.

이렇게 하면 일단 로컬에 있는 의존성들을 그대로 올리지 않고, 애저 내 컨테이너에서 함수를 구동시키기 직전에 의존성을 해당 컨테이너 베이스 이미지에 맞는 환경의 의존성으로 설치하게 된다.

이처럼 수정을 한 뒤에

업로드 아이콘을 클릭하여 우리가 기존에 생성한 리소스에 배포를 하게되면 배포가 완료된다.

profile
백엔드 개발자

0개의 댓글