Hey! These docs are for version 2.8, which is no longer officially supported. Click here for the latest version, 2.18!

Pants can create a Lambda-compatible zip file from your Python code, allowing you to develop your Lambdas in your repository instead of using the online Cloud9 editor.

FYI: how Pants does this

Under-the-hood, Pants uses the [Lambdex](🔗) project. First, Pants will convert your code into a [Pex file](🔗). Then, Pants will use Lambdex to convert the Pex into a zip file understood by AWS.

## Step 1: Activate the Python AWS Lambda backend

Add this to your `pants.toml`:

This adds the new `python_awslambda` target, which you can confirm by running `./pants help python_awslambda`

## Step 2: Define a `python_awslambda` target

First, add your lambda function in a Python file like you would [normally do with AWS Lambda](🔗). Specifically, create a function `def my_handler_name(event, context)` with the name you want.

Then, in your BUILD file, make sure that you have a `python_source` or `python_sources` target with the handler file included in the `sources` field. You can use [`./pants tailor`](🔗) to automate this.

Add a `python_awslambda` target and define the `runtime` and `handler` fields. The `runtime` should be one of the values from https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html. The `handler` has the form `handler_file.py:handler_func`, which Pants will convert into a well-formed entry point. Alternatively, you can set `handler` to the format `path.to.module:handler_func`.

For example:

Pants will use [dependency inference](🔗) based on the `handler` field, which you can confirm by running `./pants dependencies path/to:lambda`. You can also manually add to the `dependencies` field.

You can optionally set the `output_path` field to change the generated zip file's path.

Use `resource` instead of `file`

`file` / `files` targets will not be included in the built AWS Lambda because filesystem APIs like `open()` would not load them as expected. Instead, use the `resource` and `resources` target. See [Resources and archives](🔗) for further explanation.

## Step 3: Run `package`

Now run `./pants package` on your `python_awslambda` target to create a zipped file.

For example:

Running from macOS and failing to build?

AWS Lambdas must run on Linux, so Pants tells PEX and Pip to build for Linux when resolving your third party dependencies. This means that you can only use pre-built [wheels](🔗) (bdists). If your project requires any source distributions ([sdists](🔗)) that must be built locally, PEX and pip will fail to run.

If this happens, you must either change your dependencies to only use dependencies with pre-built [wheels](🔗) or find a Linux environment to run `./pants package`.

## Step 4: Upload to AWS

You can use any of the various AWS methods to upload your zip file, such as the AWS console or the AWS CLI via `aws lambda create-function` and `aws lambda update-function-code`.

You must specify the AWS lambda handler as `lambdex_handler.handler`.