AWS Lambda 层模块没有属性

AWS Lambda layer module has no attributes

我正在尝试在 AWS lambda 函数中导入一个名为 teradatasqlalchemy 的 python 模块,但是当我这样做时它没有属性。

我按照通常的方式构建了 lambda 层。我创建了一个名为 python 的目标目录,并使用此命令添加了模块:pip install --upgrade teradatasqlalchemy -t python。然后我像这样压缩它 zip -r sqlalchemy_layer.zip python 并上传到 AWS。

如果我检查目录,它看起来应该存在的所有内容都在那里。

确实,我可以 运行 我的 lambda 就像这样,它有效:

import json
import sys, os
from os.path import isfile, join
from datetime import datetime, timedelta, date
import pandas as pd
import time
import json
import pickle

from sqlalchemy import (
    MetaData, Table, ForeignKey, Column, Integer, 
    select, and_, or_, func, cast
)
from sqlalchemy.sql import label
from sqlalchemy.types import BIGINT, VARCHAR, Interval
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.expression import null
import teradatasqlalchemy


def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps(str(dir(teradatasqlalchemy)))
    }

响应是:

Response:
{
  "statusCode": 200,
  "body": "\"['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']\""
}

这看起来已经不对了,因为这个模块应该有这些属性(来自我的本地环境):

>>> dir(teradatasqlalchemy)
['BIGINT', 'BLOB', 'BYTE', 'BYTEINT', 'CHAR', 'CLOB', 'DATE', 'DECIMAL', 'FLOAT', 'INTEGER', 'INTERVAL_DAY', 'INTERVAL_DAY_TO_HOUR', 'INTERVAL_DAY_TO_MINUTE', 'INTERVAL_DAY_TO_SECOND', 'INTERVAL_HOUR', 'INTERVAL_HOUR_TO_MINUTE', 'INTERVAL_HOUR_TO_SECOND', 'INTERVAL_MINUTE', 'INTERVAL_MINUTE_TO_SECOND', 'INTERVAL_MONTH', 'INTERVAL_SECOND', 'INTERVAL_YEAR', 'INTERVAL_YEAR_TO_MONTH', 'NUMBER', 'PERIOD_DATE', 'PERIOD_TIME', 'PERIOD_TIMESTAMP', 'SMALLINT', 'TIME', 'TIMESTAMP', 'VARBYTE', 'VARCHAR', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'teradatasql', 'types', 'vernumber'] 

如果我将上面的 import teradatasqlalchemy 更改为 from teradatasqlalchemy import INTERVAL_SECOND,则会抛出此错误:

{
  "errorMessage": "Unable to import module 'lambda_function': cannot import name 'INTERVAL_SECOND' from 'teradatasqlalchemy' (unknown location)",
  "errorType": "Runtime.ImportModuleError"
}

我仔细检查了本地和远程模块的版本号,它们都是 16.20.0.7。

任何关于如何解决空属性问题的建议都很好。

已解决。只是 pip install -t docker 容器中的模块,其中 os 是 amazonLinux。您可以使用已安装的卷文件夹将 zip 文件返回到 host os。

这将使模块与 lambda 环境运行时兼容,并且当模块在 lambda 中加载时,它们将具有适当的属性。