2017-12-29 31 views
1

pyodbc python 패키지를 utlize하는 APi 게이트웨이를 사용하여 AWS 람다 함수를 작성하려고합니다. 나는 문서에 언급 된대로 조치를 취했다. 다음 오류가 발생합니다. 'app'모듈을 가져올 수 없습니다. libodbc.so.2 : 공유 객체 파일을 열 수 없습니다. 람다 함수를 실행할 때 같은 파일이나 디렉토리가 없습니다.aws lambda 및 API 게이트웨이와 함께 pyodbc를 사용할 수 없습니다.

도움을 주시면 감사하겠습니다. Chalice를 사용하여 패키지를 배포 할 때도 동일한 오류가 발생합니다. unixodbc-dev를 설치해야 할 수도 있습니다. AWS Lambda를 통해 어떻게 할 수 있습니까?

답변

0

pyodbc는 일부 기본 라이브러리를 사용합니다. 따라서 OS가 아마존 리눅스가 아니기 때문에 site-packages의 내용을 람다에 복사 할 수는 없습니다.

그래서 당신은 생성 libs와 아마존 리눅스 인스턴스에 pyodbc를 설치하고 사용해야합니다 :

https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html

을 또는 당신은 가능한 경우가 여기에서 얻을 수 있습니다 :

https://github.com/Miserlou/lambda-packages

+0

감사합니다. 나는 링크에서 pyodbc 패키지를 보지 못했다. –

+0

아마존 리눅스 머신에서 빌드해야 할까 두렵다. https://docs.aws.amazon.com/lambda/latest/dg/lambda-python -how-to-create-deployment-package.html – joarleymoraes

0

이 스크립트를 실행하여 s3 버킷에 의존성을 수집 한 다음 람다 배치 패키지에 추가하십시오.

""" 
This lambda function collects python pip dependencies, and uploads them to S3 bucket 
as a single tar.gz file. Example input for Lambda event: 
    event = { 
     "prefix"   : "myPackage", 
     "saveToS3Bucket" : "my-s3-bucket", 
     "saveToS3Key"  : "package-jwt.tar.gz", 
     "requirements"  : [ "cryptography==2.1.3", 
           "PyJWT==1.5.3" ] 
    } 

Minimal Lambda execution role: 
    { 
     "Version": "2012-10-17", 
     "Statement": [ 
      { 
       "Sid": "Stmt1507151548000", 
       "Effect": "Allow", 
       "Action": [ 
        "s3:PutObject" 
       ], 
       "Resource": [ 
        "arn:aws:s3:::my-s3-bucket/package-jwt.tar.gz" 
       ] 
      }, 
      { 
       "Effect": "Allow", 
       "Action": [ 
        "logs:CreateLogGroup", 
        "logs:CreateLogStream", 
        "logs:PutLogEvents" 
       ], 
       "Resource": "*" 
      } 
     ] 
    } 
""" 

from subprocess import check_output 
import uuid 
import boto3 

DEBUG_OUT_FILE = "/tmp/debug.txt" 
S3 = boto3.resource('s3') 


def lambda_handler(event, context): 
    """ 
    """ 

    requirements = event.get('requirements', []) 
    prefix = event.get('prefix', 'myPackage') 
    saveToS3Bucket = event.get('saveToS3Bucket', None) 
    saveToS3Key = event.get('saveToS3Key', None) 
    location = "%s_%s" % (prefix, uuid.uuid4()) 
    destinationPath = '/tmp/%s' % location 
    tarFileName = '/tmp/%s.tar.gz' % location 

    for req in requirements: 
     _exec(['pip', 'install', req, '-t', destinationPath]) 

    _exec(['tar', 'czvf', tarFileName, destinationPath]) 
    _persist_file_to_s3(tarFileName, saveToS3Bucket, saveToS3Key) 
    return 'done!' 


def _exec(statements): 
    if statements and type(statements) == list: 
     with open(DEBUG_OUT_FILE, "a") as f: 
      try: 
       f.write("\n$ %s \n" % " ".join(statements)) 
       rv = check_output(statements).decode("utf8") 
       f.write(rv) 
       print(rv) 
      except Exception as ex: 
       print(ex) 
       f.write(str(ex)) 


def _persist_file_to_s3(filePathToUpload, s3Bucket, s3Key): 
    if filePathToUpload and s3Bucket and s3Key: 
     S3.meta.client.upload_file(filePathToUpload, s3Bucket, s3Key)