微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

配置不当:加载 psycopg2 模块时出错:没有名为“psycopg2._psycopg”zappa 的模块

如何解决配置不当:加载 psycopg2 模块时出错:没有名为“psycopg2._psycopg”zappa 的模块

我正在使用 zappa 将后端部署到 AWS Lambda。它运行良好,直到我决定使用 Postgresql。我在这样的设置中添加了它:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql','NAME': config('DATABASE_NAME'),'USER': config('DATABASE_USER'),'PASSWORD': config('DATABASE_PASSWORD'),'HOST': config('DATABASE_HOST'),'PORT': '5432'
    }
}

我正在使用 AWS RDS。我安装了 psycopg2-binary 和 psycopg2(版本 2.8.6),但问题仍然存在。 python版本是3.8。

完整的错误日志:

   [1621168086542] [ERROR] ImproperlyConfigured: Error loading psycopg2 module: No module named 'psycopg2._psycopg'
Traceback (most recent call last):
  File "/var/task/handler.py",line 609,in lambda_handler
    return LambdaHandler.lambda_handler(event,context)
  File "/var/task/handler.py",line 240,in lambda_handler
    handler = cls()
  File "/var/task/handler.py",line 146,in __init__
    wsgi_app_function = get_django_wsgi(self.settings.DJANGO_SETTINGS)
  File "/var/task/zappa/ext/django_zappa.py",line 20,in get_django_wsgi
    return get_wsgi_application()
  File "/var/task/django/core/wsgi.py",line 12,in get_wsgi_application
    django.setup(set_prefix=False)
  File "/var/task/django/__init__.py",line 24,in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/var/task/django/apps/registry.py",line 114,in populate
    app_config.import_models()
  File "/var/task/django/apps/config.py",line 211,in import_models
    self.models_module = import_module(models_module_name)
  File "/var/lang/lib/python3.8/importlib/__init__.py",line 127,in import_module
    return _bootstrap._gcd_import(name[level:],package,level)
  File "<frozen importlib._bootstrap>",line 1014,in _gcd_import
  File "<frozen importlib._bootstrap>",line 991,in _find_and_load
  File "<frozen importlib._bootstrap>",line 975,in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>",line 671,in _load_unlocked
  File "<frozen importlib._bootstrap_external>",line 783,in exec_module
  File "<frozen importlib._bootstrap>",line 219,in _call_with_frames_removed
  File "/var/task/django/contrib/auth/models.py",line 2,in <module>
    from django.contrib.auth.base_user import AbstractBaseUser,BaseUserManager
  File "/var/task/django/contrib/auth/base_user.py",line 48,in <module>
    class AbstractBaseUser(models.Model):
  File "/var/task/django/db/models/base.py",line 122,in __new__
    new_class.add_to_class('_Meta',Options(Meta,app_label))
  File "/var/task/django/db/models/base.py",line 326,in add_to_class
    value.contribute_to_class(cls,name)
  File "/var/task/django/db/models/options.py",line 206,in contribute_to_class
    self.db_table = truncate_name(self.db_table,connection.ops.max_name_length())
  File "/var/task/django/db/__init__.py",line 28,in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS],item)
  File "/var/task/django/db/utils.py",line 214,in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/var/task/django/db/utils.py",line 111,in load_backend
    return import_module('%s.base' % backend_name)
  File "/var/lang/lib/python3.8/importlib/__init__.py",level)
  File "/var/task/django/db/backends/postgresql/base.py",line 29,in <module>
    raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)

解决方法

您可以将自定义编译的 psycopg2 库用于 AWS Lambda aws-psycopg2

,

(可能的)问题是您正在 MacOS 上构建 lambda .zip 包。当您部署 lambda 函数时,它在 Linux 环境(特别是 AWS 的 Linux2 环境)中运行。 MacOS 与 Linux 环境的 psycopg2-binary 不同,因此如果您在 Mac 上构建 lambda 包(包括 psycopg2-binary),然后部署到 lambda,您将遇到上述问题。>

您需要在 AWS Linux 容器内构建 lambda 函数。这是一个 Dockerfile,可用于创建一个容器,在其中安装 psycopg2-binary 并构建 lambda zip 包。然后一切正常:

FROM amazonlinux:2.0.20200207.1

RUN cd /opt && \
    yum install -y gcc openssl-devel bzip2-devel libffi-devel wget tar gzip make && \
    wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz && \
    tar xzf Python-3.8.2.tgz && \
    cd Python-3.8.2 && \
    ./configure --enable-optimizations && \
    make altinstall && \
    rm -f /opt/Python-3.8.2.tgz && \
    echo "alias python3=python3.8" > ~/.bashrc

注意 amaonzonlinux:2.0 操作系统,然后我只将 python 3.8.2 安装到环境中(如果需要,您可以使用不同版本的 python)。从那里您可以复制您的代码并构建您的 lambda .zip 包并部署到 lambda。

,

我在 macOS Big Sur 上使用 zappa==0.53.0django==3.2.5 构建了我的 lambda 包。升级到 psycopg2-binary==2.9.1 后,我开始收到此错误。回滚到 psycopg2-binary==2.8.6 为我解决了这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。