Skip to main content

AWS CDK package that helps creating web socket APIs.

Project description

B.AwsWebsocketApi

An AWS CDK based python library that helps you to create websocket based APIs.

Description

Creating APIs in AWS is pretty challenging. You have to create stages, deployments, apis, resources, methods, etc. One might argue that creating a websocket based API is even harder. This AWS CDK based python library tries to solve this inconvenience by offering resources and examples on how to create a websocket API the correct way. We have spent countless hours to perfect it but still there will always be some "gotchas" in AWS environment.

Remarks

Biomapas aims to modernise life-science industry by sharing its IT knowledge with other companies and the community. This is an open source library intended to be used by anyone. Improvements and pull requests are welcome.

Related technology

  • Python 3
  • AWS CDK
  • AWS CloudFormation
  • AWS API Gateway
  • Websockets

Assumptions

The project assumes the following:

  • You have basic-good knowledge in python programming.
  • You have basic-good knowledge in AWS.
  • You have basic knowledge in websockets.

Useful sources

Install

The project is built and uploaded to PyPi. Install it by using pip.

pip install b-aws-websocket-api

Or directly install it through source.

pip install .

Usage & Examples

Create a stack to hold your resources:

from aws_cdk.core import Stack
stack = Stack(...)

Create an API:

from b_aws_websocket_api.ws_api import WsApi
api = WsApi(
    scope=stack,
    id='TestWsApi',
    description='Test description.',
    name='TestWsApi',
    route_selection_expression='$request.body.action',
)

Create a stage (usually it is called prod):

from b_aws_websocket_api.ws_stage import WsStage
stage = WsStage(
    scope=stack,
    id='TestStage',
    ws_api=api,
    stage_name='prod',
    auto_deploy=True,
)

Create a lambda function to handle incoming requests (frames):

from b_aws_websocket_api.ws_function import WsFunction
from aws_cdk.aws_lambda import Code, Runtime
backend = WsFunction(
    scope=stack,
    id='TestFunction',
    function_name='TestFunction',
    code=Code.from_inline(
        'def handler(*args, **kwargs):\n'
        '    return {\n'
        '        "isBase64Encoded": False,\n'
        '        "statusCode": 200,\n'
        '        "headers": {},\n'
        '        "body": "{\\"message\\": \\"success\\"}"\n'
        '    }\n'
    ),
    handler='index.handler',
    runtime=Runtime.PYTHON_3_6,
)

Create a lambda integration (later will be needed for a route):

from b_aws_websocket_api.ws_lambda_integration import WsLambdaIntegration
integration = WsLambdaIntegration(
    scope=stack,
    id='TestIntegration',
    integration_name='TestIntegration',
    ws_api=api,
    function=backend
)

Create a custom route backed by a lambda function:

from b_aws_websocket_api.ws_route import WsRoute
route = WsRoute(
    scope=stack,
    id='TestRoute',
    ws_api=api,
    route_key='test',
    authorization_type='NONE',
    route_response_selection_expression='$default',
    target=f'integrations/{integration.ref}',
)

Finally deploy the API:

from  b_aws_websocket_api.ws_deployment import WsDeployment
deployment = WsDeployment(
    scope=stack,
    id='TestDeployment',
    ws_stage=stage
)

And don't forget to solve dependencies for the resources!

deployment.node.add_dependency(route)
deployment.node.add_dependency(stage)

Now execute cdk deploy * and enjoy your new websocket API!

Testing

The project has tests that can be run. Note, that tests are integration tests inherently because they test how resources are created in AWS environment. Since resources are created and tested in AWS you are subject for all the applicable charges while tests are being run.

Setting environment

Before running tests set environment variables:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

Or:

  • AWS_PROFILE
  • AWS_DEFAULT_REGION

Running tests

Then run tests from a root directory with pytest python testing library:

pytest b_aws_websocket_api_test

Note that integration tests usually take a while to complete (from 5 to 30 minutes on average).

Contribution

Found a bug? Want to add or suggest a new feature?
Contributions of any kind are gladly welcome. You may contact us directly, create a pull-request or an issue in github platform. Lets modernize the world together.

Release history

0.0.12

  • Expose function in lambda integration.

0.0.11

  • Update docker image for pipelines.
  • Add hash properties.
  • Make ws deployment more custom.
  • Update tests.

0.0.9

  • Update readme documentation regarding testing.

0.0.8

  • Add CI/CD pipelines.
  • Update History file.
  • Refactor testing.
  • Update Readme file.

0.0.7

  • Fix stage log group name.

0.0.6

  • Move imports in testing manager.

0.0.5

  • Fix readme.

0.0.4

  • Update name.

0.0.3

  • Remove idea files.

0.0.2

  • Added project files. Added tests.

0.0.1

  • Initial build. No project files, just a semi-empty project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

b_aws_websocket_api-0.0.12.tar.gz (17.3 kB view details)

Uploaded Source

Built Distribution

b_aws_websocket_api-0.0.12-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file b_aws_websocket_api-0.0.12.tar.gz.

File metadata

  • Download URL: b_aws_websocket_api-0.0.12.tar.gz
  • Upload date:
  • Size: 17.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/47.0.0 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.8.5

File hashes

Hashes for b_aws_websocket_api-0.0.12.tar.gz
Algorithm Hash digest
SHA256 eec6053e078592eb6b1e5b87beb7113b57c8966771d312b27e19aabfb70c68bf
MD5 70a0190235da0595040d7faffd7a8b64
BLAKE2b-256 09f8e5796bb0a2c67eb6b468f8950e17d1e603abed57eeebfb84e2af67ca9c96

See more details on using hashes here.

File details

Details for the file b_aws_websocket_api-0.0.12-py3-none-any.whl.

File metadata

  • Download URL: b_aws_websocket_api-0.0.12-py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/47.0.0 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.8.5

File hashes

Hashes for b_aws_websocket_api-0.0.12-py3-none-any.whl
Algorithm Hash digest
SHA256 8b7dfd84d520a1c3c752b58d0eaacb4dd4e7be6b42123d1518a9052b1ae3e1f4
MD5 6e41b7f5c8b1f70ed9e25efd17988b45
BLAKE2b-256 4388eb92b6580e4ec6125d5a9511983ff0bcb50e24aa32ebdf1e809aa429a867

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page