본문 바로가기

Back/AWS_Back

[AWS][LAMBDA]Zappa를 이용한 Flask-Lambda

배경을 설명하자면 

람다를 열심히 파던중 다음과 같은 불편함을 겪었는데.

 

테스트 환경으로 만든 플라스크앱을 람다로 올리려고 하니 이것저걱 바꿔줘야하는게 번거롭다.

파일을 전송하고 받는것.. 뭔가 바이트로 주고받는것을 꺼내어 복원하면 되지않을까? 혹은 이미 만들어진 라이브러리 쓰면 되지 않을까? 플라스크에선 request.file로 받아서 썼는데 그냥 플라스크를 쓰면 안되나? 찾다가 발견.

0. AWS CLI 설치 및 설정, IAM Role 설정

2021.03.31 - [AWS] - [AWS] AWS CLI 설치

2021.03.31 - [AWS] - [AWS] ZAPPA를 위한 정책, IAM 사용자 생성

1.zappa 설치. (따라하지 말것)

zappa를 설치하는 법은 간단하다.

 

conda create -n zappa2 python=3.8 #파이썬 버전관리

 

 pip install zappa

 

를 하면 설치되야 하지만, 안된다. 파이썬 버전이 안맞는다고 한다.

뭔소린가 싶겠지만.. 아마도 conda의 문제로 생각된다. 어차피 zappa의 경우 가상환경의 모든 라이브러리를 모두 사용하기에 쓸데 없는 라이브러리가 있으면 용량제한에 걸릴수 있다. 

 

새롭게 폴더를 만들고 venv를 이용하여 가상환경을 구성한다.

mkdir envs
cd envs
python -m envs zappa

이후 생성된 환경 안의 Script 폴더 안, Activate.bat을 실행하면 가상환경이 켜진다. 

이후 다시 

pip install zappa 입력시. 다음과 같은 에러가 발생한다.

AppData\Local\Temp\pip-pip-egg-info-1yvt56lr'
         cwd: C:\Users\Taeseung\AppData\Local\Temp\pip-install-pft9lns2\kappa\
    Complete output (7 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\Taeseung\AppData\Local\Temp\pip-install-pft9lns2\kappa\setup.py", line 54, in <module>
        run_setup()
      File "C:\Users\Taeseung\AppData\Local\Temp\pip-install-pft9lns2\kappa\setup.py", line 22, in run_setup
        long_description=open_file('README.rst').read(),
    UnicodeDecodeError: 'cp949' codec can't decode byte 0xe2 in position 2339: illegal multibyte sequence
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

 

대충 요약하면 zappa 이전 kappa를 빌드하는데 cp949로 인코딩 할수 없다는 뜻이다. 

해법은 kappa를 직접 받아 utf-8로 인코딩하라고 넣어주면 되지만 막상 해보면 굉장히 번거롭고 더불어 몇몇 라이브러리의 경우 리눅스와 윈도우의 배포에서 차이가나 람다로 올렸을때 에러가 발생한다.


2. WSL을 이용한 ZAPPA 설치

2021.01.25 - [Linux] - [Linux] 윈도우 에서 리눅스 사용하기 WSL

 

[Linux] 윈도우 에서 리눅스 사용하기 WSL

docs.microsoft.com/ko-kr/windows/wsl/install-win10 Windows 10에 WSL(Linux용 Windows 하위 시스템) 설치 Bash 터미널을 사용하여 Linux 배포(Ubuntu, Debian, SUSE, Kali, Fedora, Pengwin 및 Alpine 포함)를..

hidden-loca.tistory.com

이럴때 쓰라고 WSL이 있는것 아닐까..

 

WSL을 실행해 위의 과정을 반복한다.

1. 가장 먼저 파이썬 버전을 확인한다. 만약 3.9 버전이라면 가상환경을 통해 3.8이하의 버전으로 맞춘다. 

2. 윈도우에서 venv로 만든 가상환경은 리눅스에서 사용할 수 없다. 

새롭게 만들어준다. 해당 경로에서

rm -rdf *  #폴더를 싹 비워버리니 주의해서 사용
python3 -m venv zappa
source zappa/bin/activate

venv 가상환경이 설정되었다. 이후 zappa와 플라스크를 설치한다.

pip install zappa
pip install flask

 

zappa -v 를입력하여 버전이 나오면 설치가 잘된것이다. 

3.flask 준비

아주아주 간단한 플라스크 앱을 만들어보자. 중요한점은 새로운 폴더, 워크스페이스를 만들고 람다에 올라갈 파일만 넣는다. 

example.py

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)


@app.route('/')
def tablescan():

    return 'hello flask'

아주아주 간단한 플라스크 앱이다. 위에 임포트된 메소드는 안썼으니 Flask 뺴고 지워도 된다.

이 플라스크 앱이 에러나면 당연히 안된다. 잘 작동되는것을 확인하고 올리자.

 

4. ZAPPA 빌드

example.py 파일이 저장된 곳으로 이동한다.

zappa init

입력시 화려한 글자와 함께 설정이 시작된다.

 

가장먼저 스테이지 이름을 정한다. 람다에 올라갈때 폴더이름-스테이지 이름으로 올라간다.

다음으론 zip파일을 올릴 s3 버켓을 지정한다. 미리 만들어 놓은 버켓을 써도 되며 없다면 임의로 새로 만들어서 올린다.

이후 만들어져 있는 .app을 찾아 보여준다. example.py 안에 app을 구성했으니 example.app을 제시하고 엔터만 치면 넘어간다. 만약 다른 앱을 사용한다면 입력해주면 된다.

다음으로 배포할 지역을 설정하는데 n로 하고 넘어가면 미리 설정한 지역만 나온다.

엔터 입력시 zappa 빌드가 끝난다.

 

zappa deploy (스테이지 이름)으로 올릴 수 있고,

이후 update를 통해 갱신할 수 있다. 

zappa deploy dev 

 

올리는 중 에러가 나면 zappa tail (스테이지 이름)으로 에러를 추적할 수 있다.

 

502에러일 경우 코드실행상 오류거나, 필요한 라이브러리를 전부 다운받지 않을경우 발생하며

500에러의 경우 다 올린후 '/' 루트로 get 확인 을 거치는데 제대로 작동 안할경우 발생한다.   

에러없이 무사히 끝났다면 URL을 찍어주며 접속시 무사히 실행되는 것을 확인 할 수 있다.

 

5. 확인

AWS 콘솔로 들어가면 생성된 람다 함수를 볼 수 있다.

api 게이트웨이 역시 생성되어 있다.

API 안의 스테이지 탭에서 배포된 스테이지 이름으로 람다로 통하는 엔드포인트가 있다. 

500 에러가 났을때 여기에서 적당히 get 메서드를 추가하면 에러가 해결된다.

 

  

'Back > AWS_Back' 카테고리의 다른 글

[AWS][S3] S3 정적 웹 호스팅  (0) 2021.06.25
[AWS]Zappa - Lambda Layer 테스트.  (0) 2021.04.19
[AWS] AWS CLI 설치  (0) 2021.03.31
[AWS] ZAPPA를 위한 정책, IAM 사용자 생성  (0) 2021.03.31
[AWS][Lambda] Lambda 기본 이해...  (0) 2021.03.12