Python support
Create a Lambda with Python code.
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.
See the Python example repository for an example of creating an AWS Lambda from Python code.
Step 1: Activate the Python AWS Lambda backend
Add this to your pants.toml
:
[GLOBAL]
backend_packages.add = [
"pants.backend.awslambda.python",
"pants.backend.python",
]
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 handler_name(event, context)
.
Then, in your BUILD file, create a python_library
target with the handler file included in the sources
field, if you don't already have it.
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:
- project/BUILD
- project/lambda_example.py
# The default `sources` field will include our handler file.
python_library()
python_awslambda(
name="lambda",
runtime="python3.8",
# Pants will convert this to `project.lambda_example:example_handler`.
handler="lambda_example.py:example_handler",
)
def example_handler(event, context):
print("Hello AWS!")
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.
resources
instead of files
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 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:
$ ./pants package project/awslambda_example.py
Wrote code bundle to dist/project.zip
Runtime: python3.8
Handler: lambdex_handler.handler
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
.