Simple Lambda Toolkit
Project description
SLaT
Simple Lambda Toolkit
Collection of reusable Python tools for lambda development.
This project is meant to :meat_on_bone: (or :corn:) these requirements
- As a lambda developer I want to write as little boilerplate as possible
- As a lambda developer I want to ensure I produce high value, discoverable logs
- As a lambda developer I want to ensure I sends proper, consistent, well formed responses
- As a lambda developer I want ToBeDetermined
Example hello world Lambda
from slat.log_util import LogUtil
from slat.response import LambdaProxyResponse
from slat.types import JsonapiBody
# initiate you logger outside the handler
log = LogUtil.init_logger(env_var_name='LOG_LEVEL', default_level='INFO')
def lambda_handler(event, context):
# bind the request id to the logger
LogUtil.init_request({'request_id': context.aws_request_id})
# make log statements as normal
log.debug('Lambda Handler Event', lambda_handler_event=event)
# prepare a Jsonapi payload (https://jsonapi.org/)
response_body = JsonapiBody(data={'hello': 'world!'}, errors=[], meta={})
# respond in the expected APIGateway lambda proxy format (https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format)
return LambdaProxyResponse.respond(200, response_body, context)
Slat Tools
Responses
TBDocumented
Logging
Structlog is used for structured JSON logging
Example Usage
import logging
from slat.log_util import LogUtil
log = LogUtil.init_logger(default_level='INFO', correlation_id_key_val={'request_id': '999'})
log.info('is this JSON: {"answer": 42}')
log.error("the log message", some="value", extra_data=[1, 2, 3, "4"])
# only OUR logger will render as JSON
logging.getLogger("test").warning("hello")
output:
{"event": "is this JSON: {\"answer\": 42}", "level": "info", "logger": "slat.log_util", "request_id": "999", "timestamp": "2019-11-06T21:04:33.517295Z"}
{"event": "the log message", "extra_data": [1, 2, 3, "4"], "level": "error", "logger": "slat.log_util", "request_id": "999", "some": "value", "timestamp": "2019-11-06T21:04:33.517652Z"}
hello
For test runs you can add an ENV flag TESTING_RUN=true
and log statements will be written to ./testing.log
TESTING_RUN=true pytest
Running tests
pytest
# with coverage
pytest --cov=slat
# generage html report
coverage html
open ./htmlcov/index.html
Developing
create file ~/.pypirc
[distutils]
index-servers =
pypi
pypitest
[pypi]
repository: https://upload.pypi.org/legacy/
username:
password:
[pypitest]
repository: https://test.pypi.org/legacy/
username:
password:
build
# tick to semver `version` in setup.py
rm -rf dist
python setup.py bdist_wheel --universal
pypitest
twine upload --repository pypitest dist/*
pip install slat --index-url https://test.pypi.org/simple/ --upgrade
pypi
twine upload --repository pypi dist/*
pip install slat --upgrade
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
slat-0.3.1-py2.py3-none-any.whl
(10.7 kB
view details)
File details
Details for the file slat-0.3.1-py2.py3-none-any.whl
.
File metadata
- Download URL: slat-0.3.1-py2.py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.37.0 CPython/3.7.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 01c2f39dfdd8017746920276435afb2ea99e616ae4ad6a2b621d89c895647bb5 |
|
MD5 | 23e7aa441d19a097b6b00e2089471f90 |
|
BLAKE2b-256 | 1d844df83e3c26ec53d5cf78419a9be7cdba81fc098769cb0101a4de6178c04d |