TLDR:

pip install --target path/to/folder package-to-install

(and run this from an AWS Lambda base runtime image)


Why do you need to do this?

AWS Lambda requires you to create a zipped folder that includes:

  • A file to run your code (the “entry point”)
  • All libraries needed to execute the code

The entry point is just a file with code that will accept the parameters Lambda gives it and run your code. For example, your entry point file could be called main.py and might look like this:

def hello_world(event, context):
    print("Hello world!")

The actual names of the entry point file and function does not matter. They can both be configured in Lambda. In this example, you would configure Lambda to run main.hello_world

What happens if I don’t?

Here’s what happens if you used a third party package like requests but didn’t include the library in the zip file for Lambda:

import requests

def hello_world(event, context):
    resp = requests.get("example.com")
    print(resp)
Runtime.ImportModuleError: Unable to import module 'main': No module named 'requests'

Install Example

To fix this, you would need to install the requests pacakge to the directory that contains main.py - your entry point file. For example:

pip install --target ./lambda_example requests

Now, if you list the lambda_example directory you’ll see the requests folder/module and it’s dependencies:

ls -a ./lambda_example:

bin                                     charset_normalizer-3.3.2.dist-info      requests
certifi                                 idna                                    requests-2.31.0.dist-info
certifi-2023.11.17.dist-info            idna-3.6.dist-info                      urllib3
charset_normalizer                      main.py                                 urllib3-2.1.0.dist-info

Plot-twist: Lambda uses a specific base image for a runtime

TLDR: Install the needed libraries from a Lambda runtime base image from here

Third party libraries installed on your mac-os won’t always work on lambda’s runtime. AWS Lambdas use specific runtimes based on a specific architecture.

To fix this, you’ll need to:

  • pull and build the runtime specific docker image for your Lambda. You can find these here (choose runtime from branch name): github.com/aws/aws-lambda-base-images

  • Run the above pip commands from that docker container:

    docker run -v /local_directory:/working -it --rm lambda3.9:local

The -v parameter sets up a volume to the path you choose locally. Make this where you want to install the libs to.

Basically, you need to run a container that has the same runtime AWS Lambda will have and install 3rd party libraries there. Then you can upload those with your Lambda zip file. Now, you won’t have compatibility issues.