TIL 2021-01-22 AWS Lambda

­최상언·2021년 1월 22일
0

AWS

목록 보기
2/5

Lambda X Selenium 웹 애플리케이션

  • AWS Lambda에 AWS API Gateway를 붙여 HTTP를 통해 트리거 Done
  • FE로부터 URI를 인자로 받기 Done
  • Python Selenium 라이브러리를 이용하여 해당 URI 페이지 소스 스크래핑
  • 페이지 소스 return

Lambda에서 selenium을 동작시키려면 chrome을 띄워야 하는데, 이게 잘 안돼서 며칠째 삽질중.

Lambda Layer

Lambda에는 Layer 라는 개념이 붙는데,
필요한 라이브러리를 압축하여 정적으로 업로드해두고,
함수가 실행될때 참조해서 쓰는 라이브러리 아카이브 뭐 그런거다.

Layer에 한번에 올려서 쓸 수 있는 python3-selenium 압축 파일을 올려놓은 github을 몇군데 발견했다.
근데 받아서 압축 풀고 까보니, 전부 같은 파일이었다.
하나의 소스를 여러명이 copy해서 자기 github에 올려 놓은 거겠지.

파일을 다운받아 압축을 풀고,
requests 등 필요한 라이브러리를 몇개 더 포함시켜 다시 압축했다.
Layer에는 한번에 50MB 이상의 압축파일을 올릴 수 없어, S3에 업로드하고 그 URL을 Layer에 알려주는 방식으로 Layer를 생성했다.

몇개의 에러를 해결하고, 아직 해결하지 못한 에러는 다음과 같다.

Message: Service /opt/python/tmp/bin/chromedriver unexpectedly exited. Status code was: 127

다시 구글링해본 결과, 확실하지는 않으나 chromedriver와 chrome 버전이 안 맞아서 그럴 수 있다는 내용을 발견했다.

근데 버전을 맞추고 싶어.. 맞추고 싶은데

chrome binary 파일은 어디서 찾으며, 버전은 어떻게 아는거야?

이걸 해결을 못해서.. 끙끙대다가 다른 아이디어로 넘어 감.
매번 내 발목을 잡는 컴맹력 ,,

Lambda를 Docker로 배포하기

운영체제, 귀찮은 라이브러리들, 바이너리 파일들.. 어 Docker..? 마침 얼마전에 공부했는데! 이럴때 쓰라던데! 그리하여

Lambda에 함수 대신 Docker Image를 올릴 수 있지 않을까?

라는 생각에서 출발했다. 아직 도착은 못했고..

아직 나는 Lambda의 작동 구조를 정확히 모르고, Docker도 pull, run 정도만 알지 dockerfile이나 Image 수정같은걸 해본 적이 없어서,
될지는 모르겠지만 일단 어떻게 굴러가야 할지 대충 생각해봤다.
생각해낸 방법은 크게 두가지다. 어떤게 되는지, 아니면 둘다 안되는지, 뭐가 맞는지 아직 아무것도 모름.

  • Docker Image를 Lambda 그 자체로 쓴다.
    Gateway 트리거는 이 image를 run한다.

  • Docker Image를 Lambda Layer에 업로드하고, 메인 함수인 lambda_handler가 이를 참조한다.
    python에서 shell 코드를 작성할 수 있는 라이브러리(당장 아는건 빌트인 라이브러리인 sys 뿐)를 사용해서 docker run 하고,
    page_source를 AWS 내부 어딘가에 저장하도록 한 뒤
    메인 함수에서 이를 읽어와 return한다.

첫번째 방법이 더 간단해 보이는데,
parameter를 어떻게 넘기고 return은 어떻게 할지 감이 안왔다.

그러다 발견.
Lambda 함수를 생성할 때 docker Image로 생성하는 방법이 AWS Lambda 콘솔에 떡하니!
그럼 뭐라도 있겠지. 어떻게든 되게 해놨겠지. 해보자! (신남)

그래서 이제 Docker Image를 어떻게 만들어서 올릴지가 문제다.

여기서부터는 주제가 살짝 달라지는 느낌이 있으니 다음 post로 >>

profile
배울게 많은 햇병아리 개발자

0개의 댓글