繁体   English   中英

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

[英]Unable to use pyodbc with aws lambda and API Gateway

我正在尝试使用使用 pyodbc python 包的 APi 网关构建 AWS Lambda 函数。 我已按照文档中提到的步骤进行操作。 我不断收到以下错误Unable to import module 'app': libodbc.so.2: cannot open shared object file:当我测试运行 Lambda 函数时没有这样的文件或目录

任何帮助表示赞赏。 当我使用 Chalice 部署我的包时,我遇到了同样的错误。 看来可能是我需要安装unixodbc-dev。 知道如何通过 AWS Lambda 做到这一点吗?

只需从这里解压这个文件 - github - lambda_packages/pyodbc 这里面有 .so 文件。

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

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

No subfolders exist

编辑:创建了一个 lambda 层并保存以供重用。 在这里获取 - https://github.com/kuharan/Lambda-Layers

pyodbc 使用一些本机库。 因此,您不能只是将site-packages的内容复制到 Lambda,因为您的操作系统可能不是 Amazon Linux。

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

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

或者你可以从这里获取,如果那里有的话:

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

尝试运行此脚本以将依赖项收集到 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 install unixODBC unixODBC-devel安装unixODBCunixODBC-devel软件包。 此步骤将安装 pyodbc 模块所需的一切。

您缺少的库位于 Amazon Linux 实例上的/usr/lib64文件夹中。 将库复制到您的 python 项目的根文件夹(libodbc.so.2 只是一个符号链接,确保复制符号链接和库本身如所列): libodbc.solibodbc.so.2libodbc.so.2.0.0

@joarleymoraes答案是正确的。

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

请参阅https://medium.com/@narayan.anurag/break-the-ice-between-aws-lambda-pyodbc-6f53d5e2bd26以了解有关问题和解决方案的更多信息。

我通过添加 pyodbc git 包作为 lambda 层解决了这个问题,并将 python 版本设置为 3.7 示例代码

conn = pyodbc.connect("DRIVER={0};SERVER={1};DATABASE={2};UID={3};PWD={4}".format(driver, server, database, username, password))

您可以从 GIT https://github.com/karthigces/lambda_layers下载 pyodbc 层

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM