pylambdarest
pylambdarest is a lightweight opinionated framework for building REST API using AWS Lambda and API Gateway.
Motivation
Why another framework ?
When using API Gateway and python Lambda functions, the most common pattern is to have a unique Lambda function triggered by a proxy API Gateway resource. The Lambda then uses a framework like Flask to do all the routing. In an API Gateway + Lambda context, I feel like the routing should be handled by API Gateway itself, then forwarding the request to specific Lambda functions for each resource or endpoint.
Features
- No routing. Yes, this is a feature. Routing should be handled by API Gateway.
- API Gateway event parsing (including request body and path parameters).
- Cleaner syntax.
- Optional body schema and query parameters validation.
Installation
Install the package from PyPI using pip:
$ pip install pylambdarest
pylambdarest should also be included in the deployment package of your Lambda functions.
Getting started
pylambdarest provides a @route decorator to parse the API Gateway event into a Request object available in the handler function as an argument. It also formats the handler's output to the expected Lambda + API Gateway format seamlessly.
Turning this:
import json
def handler(event, context):
body = json.loads(event["body"])
query_params = event["queryStringParameters"]
path_params = event["pathParameters"]
return {
"statusCode": 200,
"body": json.dumps({
"message": f"Hello from AWS Lambda {body['name']}!!"
})
}
Into this:
from pylambdarest import route
@route()
def handler(request):
body = request.json
query_params = request.query_params
path_params = request.path_params
return 200, {"message": f"Hello from AWS Lambda {body['name']}!!"}
You can still access the original event and context arguments from the handler:
from pylambdarest import route
@route()
def handler(request, event, context):
print(event)
body = request.json
return 200, {"message": f"Hello from AWS Lambda {body['name']}!!"}
Path parameters defined in API Gateway can also be accessed directly as function argument:
from pylambdarest import route
@route()
def get_user(user_id):
print(user_id)
# get user from db
user = {"id": user_id, "name": "John Doe"}
return 200, user
Schema Validation
pylambdarest optionally provides schema validation using jsonschema:
from pylambdarest import route
user_schema = {
"type": "object",
"properties": {
"name": {"type": "string"}
},
"required": ["name"],
"additionalProperties": False
}
@route(body_schema=user_schema)
def create_user(request):
# If the request's body does not
# satisfy the user_schema,
# a 400 will be returned
# Create user here
return 201
query_params_schema = {
"type": "object",
"properties": {
# Only string types are allowed for query parameters.
# Types casting should be done in the handler.
"page": {"type": "string"}
},
"additionalProperties": False
}
@route(query_params_schema=query_params_schema)
def get_users(request):
page = int(request.query_params.get("page", 1))
# request users in db
users = [
{"userId": i}
for i in range((page - 1) * 50, page * 50)
]
return 200, users
Example
You can look at the sample for a minimal pylambdarest API.
In this sample, we use the serverless framework to declare the API Gateway -> Lambda routing
The packaging of the Lambda functions is done using the serverless-python-requirements plugin.
Metadata
Release files for pylambdarest 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pylambdarest-0.2.1.tar.gz | 6.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pylambdarest-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 13.3 kB
Release files / pylambdarest-0.2.1.tar.gz
| Download URL | pylambdarest-0.2.1.tar.gz |
|---|---|
| Size | 6.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1057a77eb7d669a625b0092cbd03f6a317757965e9739164b18bed0606ec144f
|
|
BLAKE2b-256 checksum How to use checksums |
c15b2ebd216e671a48e72b9c6255996cfb661fa288e5cdd7b70bd85c91ee6cad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.15 CPython/3.10.8 Linux/5.15.0-1022-azure
|
Release files / pylambdarest-0.2.1-py3-none-any.whl
| Download URL | pylambdarest-0.2.1-py3-none-any.whl |
|---|---|
| Size | 6.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
44acfad5d240ec5b7dbf84e8ca03a1b81e4bc7d52c4f8529e5296fbdab5ace9e
|
|
BLAKE2b-256 checksum How to use checksums |
69cf35d37623512490945681ad87af5dd994bb1da339582ab3d7b86295b7c1fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.15 CPython/3.10.8 Linux/5.15.0-1022-azure
|
Security for pylambdarest 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.