AWS Lambda Python with MySQL

Development / Python / AWS / Lambda

휴, 기다리고 기다리던 AWS Lambda의 Python 지원이 드디어 시작되었다. API Gateway도 도쿄 리젼에 오픈했기에 기존 Flask로 작성된 WAS를 혹여나 Lambda-API Gateway 조합으로 바꾸어 볼 수 없을까 싶어 테스트 개발을 시작했다. 하지만 무한한 삽질이 나를 기다리고 있었으니..

  • 삽질 목록
    • API Gateway에서 특정 Resource에 대해 http response header에 302를 주고 redirect를 시키고 싶었는데, 이를 Lambda 소스와 동적으로 연결하는 법 결국 알아내지 못함. 결국 정적으로 header 값 넣는법 찾음.
    • Lambda에 소스를 압축해서 올릴 때는 폴더 째로 압축하지 말고, 안에 내용만 압축해야 합니다.. (계속 모듈&핸들러를 못찾아서 '뭐지..' 함.)
    • MySQL에 접속해야 하기에, MySQL-Python과 SQLAlchemy를 사용할 예정인데, "/var/task/_mysql.so: invalid ELF header" 에러와 함께 사용 불가.
      • 가설1. 패키지를 소스코드에만 포함해야하는 Lambda의 특성상, 결국 _mysql.so가 참조하는 실제 바이너리가 같이 딸려가지 못함.
      • 가설2. 기(旣)빌드된 _mysql.so는 사실 내 개발 환경인 OS X용이었던 것. Lambda가 실제 동작하는 환경(아마도 x64 리눅스가 아닐까.)과 플랫폼이나 아키텍쳐가 달라서? -> 시험삼아 Ubuntu에서 빌드해서 패키징 후 실행해볼 순 있겠지만.. 추후 Product 레벨에서 이 짓을 하고싶지는 않다.
      • 결국 MySQL에서 공식 제공하는(플랫폼 디펜던시가 없는) mysql-connector-python를 붙였다. pip로는 설치가 불가능한듯 하고, python setup.py install 해서 나오는 라이브러리(lib/python2.7/site-packages/mysql)를 pip install -t로 설치한 것과 같이 프로젝트 디렉토리로 옮기고 실행하면 OK! Lambda에서도 잘 작동한다. 다운 받을 때 'Platform independent' 버전으로 소스를 받으면 된다. (설치법 문서) 더불어 SQLAlchemy의 connection string?의 프로토콜을 mysql+mysqlconnector://바꿔주어야 한다.
    • Lambda 코드에서 Elasticache(우리는 Memcached를 쓰고 있다.)로 접근이 불가능하다! 원래 내부 VPC EC2 인스턴스 외에는 접근이 불가능한데, Lambda 코드 실행 환경을 외부로 인식하는 모양이다. 허허..
    • API Gateway에서 캐싱 처리를 했음에도 실제 Flask+Memcached+DBPooling 환경보다 느렸다. 보통 90ms 전후로 요청과 응답이 종료되는데, DB 신규 커넥션 때문인지 계속 150~500ms를 벗어나지 못했다. 시간도 엄청 들쭉날쭉. 왜 캐싱했는데도 이러지?
  • 어쨌든 원한다. (어떤 외국분이 AWS Forum에 댓글로 달아놨던데, 나의 니즈와 정확히 일치하기에..)
    • +1 for RDS connectivity from lambda.: boto3가 기본 라이브러리로 있는 것 처럼, 뭔가 내부 RDS Engine이 있었으면.
    • +1 for SQS triggers for lambda: 큐 워커도 람다로 옮겨보자!
    • +1 for VPC compatibility with lambda: RDS나 Elasticache에서 Lambda 코드가 실행되는 환경을 White-list화 할 수 없다.

여튼 조금만 더 연구를 진척해보고, 다시 프로젝트로 복귀해야겠다! 시간이 없다!

Share on : Twitter, Facebook or Google+