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'

슬기롭게 해결하길 바란다!

어디에도 없는! 내가 알려줄 수 있는 것은 다 알려주었다.