AWS Lambda에 셀레니움, 크롬 드라이버를 사용하는 방법(1)

2022. 11. 20. 19:28카테고리 없음

728x90

개발 환경

ubuntu 20.04

python 3.8

docker

aws sam

 

사전 지식

aws - Lambda

python

selenium


람다에 크롤링 기능을 적용해 서비스를 한 지 1년이 다가온다.

메가박스 이벤트 알리미를 만들고 운영 중이다(궁금하시다면 클릭)

프로그램을 만들 때 클라우드의 핵심 기술은 람다를 사용했다.

나 혼자 운영 중이라 우여곡절이 많았다.

돈 받고 운영하는 것도 아니고 회사 생활하면서 취미로 만든걸 이렇게 오래 운영할 줄은 생각도 못했었다.

그래도 영화 좋아하는 분들에게 도움을 준다니 기분이 좋아서 운영해오다 큰 고비가 왔다.

메가박스에서 빵원티켓에 대해 자주 HTML Form을 변경 하다 보니 빵원 티켓에 대해 서비스를 제대로 못하는 상황이 발생한다.

 

이럴 경우 몇 가지 문제가 발생한다.

  1. 무료로 서비스하는 거라 빠른 수정은 불가능하다
  2. 람다로 코드를 올려서 서비스를 하는 부분과 개발(PC 또는 노트북) 머신에서 코드가 분리돼있어 한번 버그가 나면 다시 람다에 있는 코드를 기준으로 가져와서 확인을 해야 하는데 은근 노력과 잘못하면 코드가 달라 잘못된 코드를 최종적으로 람다에 적용할 우려가 있다.
  3. 정확히 버그가 어느 부분에서 났는지 로그를 남겨야 되는데 S3 또는 dynamo DB 등 기록 매체에 저장을 하는 시스템을 안 만들어서 확인하는 과정이 쉽지 않다.(왜 안 만들었냐면 이렇게 오래 운영할 줄 몰랐기 때문이다.. 내 게이름 때문에 그런 게 아니다!!)

위와 같은 사정상 쉽지 않다.

현재는 람다에 소스 코드, 소스코드가 참고하는 코드 또는 바이너리 파일(셀레니움, 크롬 드라이버)등을 직접 AWS 콘솔에 접속해서 레이어에 다 올려서 사용 중이다.

이제 내 삽질에 대해 설명해 보려고 한다.(이 글을 읽는 분들은 나 같은 시행착오는 안 하고 바로 해답으로 가셨으면 좋겠다)

초반 환경 구성시 람다에 대해 개념만 알고 사용해본 적은 없었기 때문에 셀레늄과 크롬 드라이버를 람다 Layer에 올려서 사용하는 개념 자체도 모르다가 레이어에 올리면 된다는 인터넷 내용을 찾아 Layer에 올리려고 시도했지만 크롬을 바이너리로 빌드해서 셀레니움을 포함해서 올리는 건 쉬운 작업이 아니었다.

문제 2가지

  1. 크롬을 바이너리 빌드 시 크기가 커서 람다 허용 용량을 초과할 수 있기 때문에 올릴 수 없다.
  2. 크롬을 빌드하는 과정에서 셀레니움이 크롬 빌드에 필요한 파일들을 가치 포함해야 하는데 빌드 상황에서는 포함 안되기 때문에 직접 하나씩 필요한 파일들을 찾아서 빌드 폴더에 포함시켜 놔야 나중에 셀레니움에서 사용 가능하다.

아주 거지 같은 상황이 아닐 수 없다.

이건 람다의 태생이 그렇기 때문에 어쩔 수 없다 생각하지만 다른 서비스들(직접 EC2로 만들어서 사용한다든지)에 비하면 가격이 싸기 때문에(현재 1년 동안 사용 중인데 돈 내본 적이 없다. 사랑해요 AWS♥) 어떻게든 서비스를 이어 갈려면 람다를 기반으로 할 생각이다.

그럼 현재 어떻게 서비스를 하고 있는가?

다른 능력자들이 만든 바이너리 파일들을 인터넷에서 찾아서 사용 중이다.

그런데 이건 한계가 있다.

예를 들어 AWS에서는 파이썬 버전 3.6을 람다에서 더 이상 지원 안 한다.

현재 내가 만든 코드는 3.6 기반이다.

그렇다는 얘기는 내 코드를 버전 업 해서 다시 올려야 되는데 그럼 다시 인터넷에 3.6 버전을 넘는 파이썬 기반의 셀레늄&크롬 바이너리 코드를 찾아야 한다는 뜻이다.

왜 직접 만들지 않는가?라는 의문점이 든다면 이 위에 문제점 2가지를 다시 읽어보자.

직접 만들려고 시도했지만 크기가 커서 안되던지 또는 셀레늄이 참조해야 될 파일이 누락돼서 안되든지 해서 만들지 않았다.(시대가 어느 땐데 하나하나 실패 로그 확인하면서 해당 파일 찾아가며 작업해야 하는가!!)

결국 새로운 방향으로 개발하기로 마음먹었다.

도커를 기반으로 셀레니움과 크롬을 가치 포함해서 람다에 올리는 게 가능하다는 글을 찾았다.

https://stackoverflow.com/questions/71746654/how-do-i-add-selenium-chromedriver-to-an-aws-lambda-function/71820243#71820243

 

How do I add selenium & chromedriver to an AWS Lambda function?

I am trying to host a webscraping function on aws lambda and am running into webdriver errors for selenium. Could someone show me how you go about adding the chromedriver.exe file and how do you ge...

stackoverflow.com

 

도커라니.. 오히려 좋다.

코드를 한 곳에서 유지할 수 있고 패키지 관리나 파이썬 버전업 상황에서도 융통성 있게 작업할 환경이 되니 숨이 트이는 듯한 느낌이다.

글이 길어져서 다음 글에는 해당 기능들을 이용해서 서비스를 적용한 것을 적어 보려고 한다.