8

Trying to make a deployment package for the service Pusher in Python on AWS lambda.

When I run simple code like this

from pusher import Pusher
def pusherTest(context, event):
    mypusher = Pusher(app_id=u'***', key=u'***', secret=u'***')
    mypusher.trigger('testchannel', 'testevent', {u'some': u'data'})

I'm getting this stack trace.

libssl.so.1.0.0: cannot open shared object file: No such file or directory: ImportError
Traceback (most recent call last):
  File "/var/task/Lambda.py", line 3, in pusherTest
    mypusher = Pusher(app_id=u'***', key=u'***', secret='***')
  File "/var/task/pusher/pusher.py", line 42, in __init__
    from pusher.requests import RequestsBackend
  File "/var/task/pusher/requests.py", line 12, in <module>
    import urllib3.contrib.pyopenssl
  File "/var/task/urllib3/contrib/pyopenssl.py", line 54, in <module>
    import OpenSSL.SSL
  File "/var/task/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/var/task/OpenSSL/rand.py", line 12, in <module>
    from OpenSSL._util import (
  File "/var/task/OpenSSL/_util.py", line 6, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
  File "/var/task/cryptography/hazmat/bindings/openssl/binding.py", line 15, in <module>
    from cryptography.hazmat.bindings._openssl import ffi, lib
ImportError: libssl.so.1.0.0: cannot open shared object file: No such file or directory

I believe libssl is a C library and since I don't have access to the Lambda machine to install these tys of dependencies, how could I make this work?

helloV
  • 46,329
  • 4
  • 117
  • 135
jamesmpw
  • 485
  • 4
  • 16
  • On what Linux distro are you building the deployment package? – helloV Apr 07 '16 at 12:04
  • Hi @jamesmpw, Did you use Pusher in lambda? I installed pusher in the amazon-linux, but I still have this problem: `"errorType": "ImportError", "errorMessage": "No module named cryptography.hazmat.bindings.openssl.binding"`, Did you have this problem before ? – José Castro Sep 12 '16 at 21:48
  • Hmm I kind of remember that but I can't recall what I did to fix it. are you using virtualenv? – jamesmpw Sep 12 '16 at 21:50
  • Yes, for install all reqs, even I install cryptography, but still fail – José Castro Sep 13 '16 at 15:42
  • This question looks like a special case of: https://stackoverflow.com/questions/57894698/can-aws-lambda-use-python-that-calls-c – Att Righ Sep 23 '21 at 10:25
  • Also it's ind of a special case of this one: https://stackoverflow.com/questions/45044358/specifying-c-dependencies-for-python-packages-for-use-in-aws-lambda – Att Righ Sep 23 '21 at 10:33

3 Answers3

8

I had the same problem and I had the chance to really understand what is the hint here. The follow error is clearing say to us that the library libssl.so is not there...

ImportError: libssl.so.1.0.0: cannot open shared object file: No such file or directory

I would expect that it is there ... After all Amazon Linux is a linux distro and libssl should be there. But I do not know ... may be it is not directly accessible from the lambda function.

To solve the problem I added the library in the zip bundle

cd /usr/lib64
zip -u /tmp/lambda.zip libssl.so.1.0.0

I redeployed and the error was different. Eureka!

Another library was missed. The libcrypto. I did the same task and now my lambda function is working as expected

cd /usr/lib64
zip -u /tmp/lambda.zip libcrypto.so.1.0.0
Alex
  • 2,758
  • 1
  • 27
  • 27
  • Thanks, this is what I was looking for. Got my Lambda running! – Dan Apr 20 '17 at 19:46
  • This is brilliant! As a footnote: I could not locate libssl.so.1.0.0 in miniconda3/envs/xxx/lib/. But i found it in /home/ubuntu/miniconda3/lib/ – human Dec 20 '17 at 06:12
  • Your answer has been used (anonymised) to demo a new feature on [meta](https://meta.stackexchange.com/questions/370640/version-labels-for-answers) (see point 3 of original post) ;-) – trincot Oct 12 '21 at 11:42
3

Are you building the deployment package on a distro other than Amazon Linux? Try creating the deployment package in Amazon Linux

Python Extension Modules in AWS Lambda

Rob Davis
  • 1,259
  • 1
  • 10
  • 19
helloV
  • 46,329
  • 4
  • 117
  • 135
  • Yah I am building the package on my vagrant box. Wow very interesting. Ok let me try that. Thank you. – jamesmpw Apr 07 '16 at 14:06
  • 1
    Wow that did it. So awesome. Month long headache there. Just couldn't get it right between Import Errors and everything else. Thank you so much. Could you explain why I can't create the packages using virtualenv on my vagrant box? Or is it that I could but I would need to install libssl? – jamesmpw Apr 07 '16 at 21:47
  • 1
    This is not an answer, this is a suggestion of an unexplained magical trick. – fiatjaf Jun 04 '16 at 14:47
  • @fiatjaf what is so magical about it? You build the package for the target platform. Nothing magical. – helloV Jun 07 '16 at 22:16
  • I think you should say that in the answer. – fiatjaf Jun 07 '16 at 23:31
  • No good to park part of the answer on an external resource when said resource goes down. – thoroc Mar 04 '21 at 11:18
1

So for me the fix was to move the libraries files into the root folder like so:

The files in question were in PIL > .libs

enter image description here

Jack
  • 2,581
  • 9
  • 47
  • 62