I want to deploy working python project in pycharm to aws lambda. The project is using google-ads library to get some report data from google ads.
I tried deploying lambda by importing complete project as a zip file by zipping all the folders/files inside the project and not the project folder itself. But i got the following error:
{
"errorMessage": "Unable to import module 'main': cannot import name 'cygrpc' from 'grpc._cython' (/var/task/grpc/_cython/__init__.py)",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}
Assuming that google-ads library is working and that something is wrong with grpc(btw google-ads includes grpcio and stuff on its own), i tried to create a layer for grpcio, cython, cygrpc but the error remains same.
I create projects/layers in aws lambda and they work. I dont know what i am doing wrong here.
Any help would be really appreciated!
versions: google-ads-14.1.0, python-3.9, grpcio-1.43.0
Answering my own question after a lot of workaround. I have made it generic so anyone can use it.
I believe you can fix any type of ImportModuleError as long as your deployment package's file structure, your code and architecture is ok, only then you can deploy and run your code successfully. To fix your structure and architecture, follow steps below:
1- Install "ubuntu 18.04 LTS" from microsoft store (Windows 10).
2- Open CMD and run following commands:
ubuntu1804
cd /mnt/c
You can choose any of your drive. I chose C.mkdir my-lambda-folder
Create project folder.cd my-lambda-folder
Enter into project folder.touch lambda_function.py
Create file called lambda_function.pypip install --target ./package your-module-name
pip install --target ./package google-ads
will install
google-ads module inside folder 'package'. The folder 'package' will be
created automatically if not found.cd package
zip -r ../my-deployment-package.zip .
This will create deployment package with the installed library at the root of your project folder i.e my-lambda-folder.cd ..
go back to the root of your project folder.zip -g my-deployment-package.zip lambda_function.py
Add your lambda function to the deployment package you just created i.e my-deployment-package.zip.zip -g my-deployment-package.zip google-ads-yaml
(i already pasted this file in my project folder).3- Upload my-deployment-package.zip to your lambda function in AWS console and you are good to go.