Nexify
Documentation: https://nexify.junah.dev
Source Code: https://github.com/junah201/nexify
Nexify is a lightweight web framework for building APIs on AWS Lambda's Python runtime based on standard Python type hints.
The key features are:
- 🚀 Automatic Parsing: Automatically parses AWS Lambda's Event and Context objects.
- 🔍 Data Validation: Validate user's request and response using Pydantic.
- 📜 OpenAPI Documentation: Generates API documentation with Swagger UI and ReDoc.
- ☁️ Deployment Automation: Deploy AWS Lambda and related infrastructure with a simple command.
Requirements¶
Nexify requires the following libraries:
- Pydantic for data validation and OpenAPI documentation.
- Boto3 for AWS deployment. (Only required in local development, not in production.)
Installation¶
First, set up a virtual environment, then install Nexify:
$ pip install "nexify[cli]"
---> 100%
Info
Some terminal environments require quoting "nexify[cli]" for correct installation.
Usage¶
Creating a Project¶
$ nexify init
Enter the project name: myapp
🎉 Project myapp created at 'C:\Users\junah\Desktop\myapp'
$ cd myapp
Running nexify init
command generates a main.py
file, a nexify.json
configuration file, and etc.
- Example
main.py
:
from typing import Annotated
from nexify import Body, Nexify, Path, Query, status
from pydantic import BaseModel, Field
app = Nexify(title="My Nexify API", version="0.1.0")
class Item(BaseModel):
id: str
name: str
price: Annotated[int, Field(ge=0)]
@app.get("/items")
def read_items(limit: Annotated[int, Query(default=10)]) -> list[Item]:
return [Item(id=f"{i + 1}", name=f"Item {i}", price=i * 10) for i in range(limit)]
@app.post("/items", status_code=status.HTTP_204_NO_CONTENT)
def create_item(item: Annotated[Item, Body()]): ...
@app.get("/items/{item_id}")
def read_item(item_id: Annotated[str, Path(min_length=2, max_length=8)]) -> Item:
return Item(id=item_id, name="Foo", price=42)
- Example
nexify.json
:
{
"service": "myapp",
"provider": {
"name": "aws",
"runtime": "python3.10",
"region": "ap-northeast-2",
"profile": "default",
"logRetentionInDays": 14,
"architecture": "x86_64",
"memorySize": 128,
"timeout": 10,
"stage": "prod",
"environment": { "YOUR_CUSTOM_ENV": "${env:YOUR_CUSTOM_ENV}" },
"iamRoleStatements": [
{ "Effect": "Allow", "Action": ["s3:*"], "Resource": "*" }
]
},
"package": {
"include": ["main.py"],
"exclude": [".venv/**", ".git/**", ".gitignore"],
"pipCmdExtraArgs": [""]
},
"resources": {
"Resources": {
"APIGatewayRestAPI": {
"Type": "AWS::ApiGateway::RestApi",
"Properties": {
"Name": "myapp-API",
"EndpointConfiguration": { "Types": ["EDGE"] },
"Policy": "",
"Description": "API for myapp"
}
}
}
}
}
Deploying¶
$ nexify deploy
✔ App imported successfully!
✔ Config loaded successfully!
✔ App analyzed successfully!
✔ Requirements installed successfully!
✔ Lambda functions packaged successfully!
✔ Basic stack created successfully!
✔ Template created successfully!
✔ Stack updated successfully!
🎉 Deployment successful!
Endpoints:
- GET https://apigatewayid.execute-api.ap-northeast-2.amazonaws.com/prod/items
- POST https://apigatewayid.execute-api.ap-northeast-2.amazonaws.com/prod/items
- GET https://apigatewayid.execute-api.ap-northeast-2.amazonaws.com/prod/items/{item_id}
Functions:
- read_items
- create_item
- read_item
Once deployment is complete, API endpoints are generated.
Checking the API¶
Open the following URL in a browser to check the API response:
https://apigatewayid.execute-api.ap-northeast-2.amazonaws.com/prod/items/12
Info
Use the URL displayed after executing nexify deploy
command.
Response example:
{"id":"12","name":"Foo","price":42}
Congratulations 🎉 You have already created an API.
- The
/items
and/items/{item_id}
endpoints can now receive HTTP requests. - The
/items
endpoint handlesGET
andPOST
requests, while/items/{item_id}
handlesGET
requests. - The
/items
endpoint has aint
query parameterlimit
with a default value of10
. - The
/items/{item_id}
endpoint has astr
path parameteritem_id
with a length constraint between2
and8
characters.
Nexify uses Pydantic internally to validate the input and output data.
Swagger UI¶
Now go to https://apigatewayid.execute-api.ap-northeast-2.amazonaws.com/prod/docs.
Check
Please use the output URL after running the nexify deploy
command.
You will see the automatic interactive API documentation (provided by Swagger UI):
ReDoc¶
And now, go to https://apigatewayid.execute-api.ap-northeast-2.amazonaws.com/prod/redoc.
Check
Please use the output URL after running the nexify deploy
command.
You will see the automatic interactive API documentation (provided by ReDoc):
Summary¶
With Nexify, you can easily develop APIs on AWS Lambda using standard Python type hints.
- 🔍 Data Validation: Uses Pydantic for input and response validation.
- Automatically generates clear errors for invalid data.
- Supports validation for nested JSON objects.
- 📦 Automatic Parsing: Extracts body, pathParameters, queryStringParameters, and more from the Event object.
- 🔄 Response Conversion: Supports conversion of standard Python types (str, int, float, bool, list) as well as datetime, UUID, dataclass, and more.
- 📜 OpenAPI Documentation: Supports Swagger UI and ReDoc.
- ☁️ Deployment Automation: Deploy AWS Lambda with a single nexify deploy command.
License¶
This project is licensed under the terms of the MIT license.