Skip to main content

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 biomapas-aws-api-ws

Or directly install it through source.

pip install .

Examples

Create a stack to hold your resources:

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

Create an API:

from biomapas_aws_api_ws.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 biomapas_aws_api_ws.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 biomapas_aws_api_ws.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 biomapas_aws_api_ws.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 biomapas_aws_api_ws.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  biomapas_aws_api_ws.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.

Before running tests set an environment variable BIOMAPAS_AWS_API_WS_TEST_PROFILE. This environment variable specifies an aws account to use for deployment and testing. Usually this profile is called default when created with aws configure cli command.

Set on Windows:

set BIOMAPAS_AWS_API_WS_TEST_PROFILE=default

Set on Linux:

export BIOMAPAS_AWS_API_WS_TEST_PROFILE=default

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

pytest

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.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.

Metadata

Release files for b-aws-websocket-api 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for b-aws-websocket-api 0.0.4
File Size Uploaded
b_aws_websocket_api-0.0.4.tar.gz 16.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for b-aws-websocket-api 0.0.4
File Interpreter ABI Platform
b_aws_websocket_api-0.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 34.8 kB

Release files / b_aws_websocket_api-0.0.4.tar.gz

Download URL b_aws_websocket_api-0.0.4.tar.gz
Size 16.7 kB
Tags Source
SHA-256 checksum
How to use checksums
3816ab43b7bbd613271882d584dff768686b23951f45d9052913342d570fa64a
BLAKE2b-256 checksum
How to use checksums
38318a70c5cc1186bf10477902375131604dd415cbee8af17b1f5fbf7710af51
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

Release files / b_aws_websocket_api-0.0.4-py3-none-any.whl

Download URL b_aws_websocket_api-0.0.4-py3-none-any.whl
Size 18.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
654d8d57d5af48cbe099f5ebb1b3c4b5237fdfc1e211d0d3244a21b0bb5ef805
BLAKE2b-256 checksum
How to use checksums
cd24206768e163141c592fd81fa120c1f0088d9b14966d61c2cde18628cbfd49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

Release history Release notifications | RSS feed

2.0.0

2 release files

1.1.1

2 release files

0.0.12

2 release files

0.0.11

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

This release

0.0.4 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page