AWS 람다에 내가 만든 프로그램을 배포하는 방식은 다음과 같은 것들이 제공되고 있다.
- 그냥 코드를 직접 입력
- ZIP 파일 업로드
- S3로부터 업로드
물론 간단한 프로그램은 직접 코드를 입력해서 람다 함수를 만들 수 있다.
이렇게 S3를 모니터링 할 수도 있고, EC2 정보를 얻을 수도 있고, Hello World를 찍을 수도 있다.
그런데 만약 Python 언어로 만든 프로그램을 배포하려고 하는데 외부 라이브러리를 참조하고 있다면? AWS에서 제공하는 문서를 보면 될 것이다.
근데 본인은 아무리 봐도 잘 모르겠더라.. 그래서 구글링, 또 구글링, 또 구글링. 그리고 삽질에 삽질을 거듭한 끝에 성공했다. 결론은 믿을 문서 별로 없다.
많은 문서들이 virtualenv부터 시작해서 꽤나 복잡하게 설명하는데 일단 쉽게 가자. 무조건 되게 말이다.
1. 디렉토리 생성
/sorc 하위에 url 이라는 디렉토리를 새로 만들었다고 가정하자.
2. py 파일 생성
/sorc/url 하위에 url.py 파일을 만들자.
$ vi /sorc/url/url.py
내용은 다음과 같이 넣었다. jeeg님이 만든 BeautifulSoup를 이용하여 웹 페이지를 파싱하는 소스 프로그램을 그대로 가져다 씀.
from bs4 import BeautifulSoup import requests def handler(event, context): response = requests.get('http://www.apache.org') parsedHtml = response.text soup = BeautifulSoup(parsedHtml, 'html.parser') print(soup.find_all('a'))
(람다 함수를 통해 실행하기 위해 handler 부분이 추가되어 있다. 이 부분은 개별적으로 알아보기 바람)
3. 라이브러리 설치
/sorc 디렉토리에서 다음과 같이 참조 라이브러리를 설치한다.
$ pip install beautifulsoup4 -t url $ pip install requests -t url
4. ZIP 압축
여기서 주의할 점!
압축을 어디서 해야하는지가 중요하다. 이거이거.. 잘못된 정보가 엄청 많다.
만약 다음과 같이 url.zip 파일 압축을 했다면,
$ cd /sorc $ zip -r url.zip url
다음과 같은 에러가 무한 반복될 것이다.
Unable to import module 'url': No module named 'url'
하지만 다음과 같이 압축을 했다면,
$ cd /sorc/url $ zip -r url.zip ./
행복하게도 결과를 얻을 수 있게 된다!
추가적으로 만약 다음과 같은 에러가 난다면 말이다.
Bad handler 'handler': not enough values to unpack (expected 2, got 1)
Configuration 탭의 [Handler] 부분을 확인해야 한다. 여기에 반드시 url.handler가 들어가 있어야 한다.
url.handler의 url은 url.py의 url이고 handler는 url.py 내부의 핸들러 이름이다.
만약 def handler(event, context): ~ 가 아닌 def lambda_handler(event, context): ~ 로 만들었다면 url.lambda_handler라고 적으면 된다.
이 밖에도 다음과 같은 에러들이 발생할 수 있다.
- Unable to import module 'lambda_function': No module named 'lambda_function'
- Handler 'lambda_handler' missing on module 'url': module 'url' has no attribute 'lambda_handler'
슬기롭게 해결하길 바란다!
어디에도 없는! 내가 알려줄 수 있는 것은 다 알려주었다.