이번에 지인의 요청으로 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 세가지 타입이 있는데,
각 타입은 다음을 의미한다.
이렇게 모든 설정을 완료하면 로컬에 필요한 파일들이 생성되며 프로젝트가 만들어진다.
로컬에서 테스트를 해보고 싶다면, 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 을 설치하게 되는 것이다.
이 부분때문에 꽤 많은 시간을 삽질하였는데... 내가 답은 해결책은 다음과 같다.
이렇게 하면 일단 로컬에 있는 의존성들을 그대로 올리지 않고, 애저 내 컨테이너에서 함수를 구동시키기 직전에 의존성을 해당 컨테이너 베이스 이미지에 맞는 환경의 의존성으로 설치하게 된다.
이처럼 수정을 한 뒤에
업로드 아이콘을 클릭하여 우리가 기존에 생성한 리소스에 배포를 하게되면 배포가 완료된다.