Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No module named 'psycopg2._psycopg': ModuleNotFoundError in AWS Lambda

I have created a deployment package for AWS Lambda with my python file and the dependencies including sqlalchemy and psycopg2. The code works perfectly in accessing the DB locally. But when I imported this zip file, I am getting the following error.

No module named 'psycopg2._psycopg': ModuleNotFoundError

The stack trace of the error is,

{
  "errorMessage": "No module named 'psycopg2._psycopg'",
  "errorType": "ModuleNotFoundError",
  "stackTrace": [
    [
      "/var/task/DBAccessLamdaHandler.py",
      50,
      "lambda_handler",
      "engine = create_engine(rds_host)"
    ],
    [
      "/var/task/sqlalchemy/engine/__init__.py",
      387,
      "create_engine",
      "return strategy.create(*args, **kwargs)"
    ],
    [
      "/var/task/sqlalchemy/engine/strategies.py",
      80,
      "create",
      "dbapi = dialect_cls.dbapi(**dbapi_args)"
    ],
    [
      "/var/task/sqlalchemy/dialects/postgresql/psycopg2.py",
      554,
      "dbapi",
      "import psycopg2"
    ],
    [
      "/var/task/psycopg2/__init__.py",
      50,
      "<module>",
      "from psycopg2._psycopg import (                     # noqa"
    ]
  ]
}

Any help is appreciable

like image 655
Kathiravan Natarajan Avatar asked Jun 30 '17 22:06

Kathiravan Natarajan


4 Answers

The AWS Lambda runtime environment doesn't include the PostgreSQL libraries so you need to include them within your AWS Lambda upload.

One way to do this is to get them from the jkehler/awslambda-psycopg2 repo at GitHub. Note that you don't need to build this project from scratch as the repo includes a pre-built package in the psycopg2 folder that you can simply include in your Lambda upload.

like image 78
jarmod Avatar answered Nov 11 '22 14:11

jarmod


The psycopg2 build library from jkehler/awslambda-psycopg2 was built for python 3.6 and make sure that while uploading your code to AWS lambda, select Python Runtime environment as 3.6, and it should work. I banged my head on this for a full day and then when i changed to 3.6, the import error just vanished.

If you are going to attempt to build it yourself, remember that you must build on a machine or VM with the same architecture as your target at AWS.

like image 21
Nikhil Ravindran Avatar answered Nov 11 '22 15:11

Nikhil Ravindran


Like other answers, psycopg2-binary worked fine for python3.9 (it looks like other package awslambda-psycopg2 was only available for python3.6).

But, if you run on MacOs before sending to aws lambda, you must specify the platform to your pip install like this:

pip3.9 install --platform=manylinux1_x86_64 --only-binary=:all: psycopg2-binary
like image 7
Vincent J Avatar answered Nov 11 '22 16:11

Vincent J


Latest as of 26/MAR/2020

I was skeptical about depending on a third-party library for my production code. On research the following works,

The issue happens only when the packages are built from MAC OS.

I can confirm today that the issue is fixed when I build the package from Centos 7 ( AWS AMI )

The following is my approach

requirement.txt

psycopg2-binary==2.8.4

Build process

pip install -r requirements.txt --target .

Lambda code is in the root directory

+-- lambda_function.py
+-- psycopg2
    +-- psycopg2 files

Zip the directory and test the code in lambda works.

The only additional step is to build the package in Linux env instead of macOS using the Docker container. An example can be found here: Deploy AWS Amplify Python Lambda from macOS with Docker

like image 6
viru Avatar answered Nov 11 '22 15:11

viru