Python 无法将pyodbc与aws lambda和API网关一起使用

Python 无法将pyodbc与aws lambda和API网关一起使用,python,amazon-web-services,aws-lambda,chalice,Python,Amazon Web Services,Aws Lambda,Chalice,我正在尝试使用APi网关构建AWS Lambda函数,该网关将pyodbc python包UTLIZE。我已经遵循了文档中提到的步骤。我不断收到以下错误无法导入模块“app”:libodbc.so.2:无法打开共享对象文件:在测试运行Lambda函数时没有此类文件或目录 谢谢你的帮助。当我使用Chalice部署我的包时,我得到了相同的错误。似乎我需要安装unixodbc-dev。你知道如何通过AWS Lambda实现吗 pyodbc使用一些本机lib。因此,您不能将站点包的内容复制到Lambda

我正在尝试使用APi网关构建AWS Lambda函数,该网关将pyodbc python包UTLIZE。我已经遵循了文档中提到的步骤。我不断收到以下错误无法导入模块“app”:libodbc.so.2:无法打开共享对象文件:在测试运行Lambda函数时没有此类文件或目录


谢谢你的帮助。当我使用Chalice部署我的包时,我得到了相同的错误。似乎我需要安装unixodbc-dev。你知道如何通过AWS Lambda实现吗

pyodbc使用一些本机lib。因此,您不能将
站点包的内容复制到Lambda,因为您的操作系统可能不是Amazon Linux

因此,您需要在Amazon Linux实例上安装pyodbc,并使用生成的LIB:

或者您也可以从这里(如果有)获得:


尝试运行此脚本将依赖项收集到s3存储桶中,然后将其添加到lambda部署包中

""" 
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)

首先,使用
yum安装unixODBC unixODBC-devel
安装
unixODBC和
unixODBC-devel
软件包。此步骤将安装pyodbc模块所需的所有内容

您缺少的库位于Amazon Linux实例上的
/usr/lib64
文件夹中。
将库复制到python项目的根文件夹中(libodbc.so.2只是一个符号链接,请确保按照所列复制符号链接和库本身):
libodbc.so
libodbc.so.2
libodbc.so.2.0.0
只需从此处解压此文件即可。这里面有文件

现在将python代码和.so文件打包并上传到AWS lambda。供您参考的文件夹结构应如下所示

lambda_function.py
libodbc.so.2
pyodbc.so
<name_this_zip>.zip

No subfolders exist
lambda_function.py
libodbc.so.2
皮约克
zip先生
不存在子文件夹
@joarleymoraes是正确的

引擎盖下的每个Lambda实例都是从AmazonLinuxAMI创建的容器。pyodbc需要一些本机库才能工作,而Lambda容器中默认不存在这些本机库。因此,为了使事情顺利进行,您需要确保Lambda环境除了pyodbc和函数代码之外,还包括这些本机库


请参阅以了解有关问题和解决方案的更多信息。

谢谢您提供的信息。我在链接中没有看到pyodbc包,但我担心您必须在Amazon Linux机器上构建它:我创建了一个Amazon Linux EC2实例并生成了LIB,但它仍然不起作用。我创建了Amazon Linux EC2并执行了“pip3安装pyodbc-t”,但它仍然不起作用。