안경잡이개발자

728x90
반응형

  하나의 람다 함수(Lambda Function)에서 특정한 라이브러리를 이용하는 경우, 라이브러리를 포함하는 압축 파일(.ZIP) 통째로 람다 함수로 업로드를 하면 라이브러리를 손쉽게 이용할 수 있습니다. 하지만 라이브러리를 포함하여 업로드하는 경우 3MB를 넘어가기 때문에 AWS Lambda 사이트에서 직접 소스코드를 수정하는 것은 불가능했습니다. 소스코드를 변경해야 할 일이 생기면 소스코드를 수정한 뒤에 다시 압축해서 Lambda에 업로드해야 했습니다.

 

  더군다나 하지만 여러 개의 람다 함수에서, 공통된 라이브러리를 이용하는 경우에는 매 번 라이브러리를 압축해서 올려야 한다는 단점이 있습니다. 여러 개의 람다 함수가 공통적으로 사용하는 라이브러리를 일괄적으로 관리할 수 있다면 더욱 편리하겠죠.

 

  2018년 12월부터는 Lambda Layers 기능이 지원되기 때문에 공통된 라이브러리를 Lambda Layers에 올리고, Lambda Function에서는 이를 단순히 불러와 사용할 수 있게 되었습니다. (2018년 12월 이전에는 얼마나 불편했을지 상상이 안 가네요.) 말 그대로 의존성을 효과적으로 관리할 수 있게 되었습니다.

 

  실습을 위해 하나의 Lambda Function을 생성합니다. 예제 코드는 Python으로 작성하겠습니다. 예제 함수에서는 간단한 크롤링 프로그램을 구현할 것입니다. 크롤링을 위해서는 b4라는 라이브러리가 필요합니다.

 

 

  일단 API Gateway를 붙여서 API 테스트를 해보겠습니다.

 

 

  다음과 같이 [Open]으로 보안 설정을 해서 누구든지 API에 접근할 수 있도록 합니다.

 

 

  이후에 [Save]를 눌러 적용합니다. 그리고 API Gateway의 URL을 확인하여 접속합니다.

 

 

  접속 결과, Lambda의 기본 코드에 의해서 다음과 같이 출력됩니다.

 

 

  이제 Lambda Function의 코드를 다음과 같이 바꿉니다. bs4라는 라이브러리를 이용해서 크롤링을 수행합니다.

 

import json
import urllib.request
from bs4 import BeautifulSoup

def lambda_handler(event, context):
    url = "https://www.google.com"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")
    a_tags = soup.find_all("a")
    result_list = []
    for i in a_tags:
        result_list.append(i.get_text())
    return {
        'statusCode': 200,
        'body': json.dumps(result_list)
    }

 

  이제 코드를 [Save]하여 URL에 접속해 봅시다.

 

 

  당연히 라이브러리가 없으니 오류가 발생합니다. 따라서 로컬에서 pip3 명령을 이용해 bs4를 설치합니다. -t 옵션을 이용하면 특정한 경로에 bs4 라이브러리를 다운로드 할 수 있습니다.

 

 

  라이브러리 다운로드가 완료되면 이를 하나의 폴더에 담아주어야 합니다.

 

 

 

  python이라는 이름의 폴더를 만들어, 모든 라이브러리 폴더를 python 폴더 안으로 넣습니다. 폴더 이름이 python이어야 AWS Lambda에서 이를 성공적으로 인식할 수 있습니다.

 

 

  이후에 이 python 폴더를 포함하는 폴더를 압축합니다. 다시 말해, 압축 파일의 상위 폴더가 python이 되어야 합니다. 저는 다음과 같이 bs4.zip라는 이름의 압축 파일로 압축했습니다. 

 

 

  이제 압축된 파일을 확인해 보시면, 상위 폴더 이름이 python인 것을 확인할 수 있습니다.

 

 

  이제 AWS Lambda 서비스의 [Layers] 탭으로 가서 [Create Layer]로 레이어를 생성합니다.

 

 

  다음과 같이 레이어 이름을 설정하여 생성합니다.

 

 

  이제 람다 함수의 Layer로, 방금 생성한 Layer를 넣습니다.

 

 

  다음과 같이 설정합니다.

 

 

  이후에 람다 함수의 [Save]를 진행하면, 이제 API에 접속했을 때 성공적으로 크롤링 된 결과가 출력됩니다.

 

728x90
반응형

Comment +1

  • 김용민 2020.03.07 20:50

    감사합니다 ㅜㅜ 외부라이브러리 때문에 계속 막히고 다른 블로그는 너무 어려웠는데 덕분에 해결했습니다ㅎㅎㅎ