aws-smithy-http-server-python

Server libraries for smithy-rs generated servers, targeting pure Python business logic.

Running servers on AWS Lambda

aws-smithy-http-server-python supports running your services on AWS Lambda.

You need to use run_lambda method instead of run method to start the custom runtime instead of the Hyper HTTP server.

In your app.py:

```diff from pokemonserviceserversdk import App from pokemonserviceserversdk.error import ResourceNotFoundException

...

Get the number of requests served by this server.

@app.getserverstatistics def getserverstatistics( : GetServerStatisticsInput, context: Context ) -> GetServerStatisticsOutput: callscount = context.getcallscount() logging.debug("The service handled %d requests", callscount) return GetServerStatisticsOutput(callscount=calls_count)

...

-app.run() +app.run_lambda() ```

aws-smithy-http-server-python comes with a custom runtime so you should run your service without any provided runtimes. You can achieve that with a Dockerfile similar to this:

```dockerfile

You can use any image that has your desired Python version

FROM public.ecr.aws/lambda/python:3.8-x86_64

Copy your application code to LAMBDA_TASK_ROOT

COPY app.py ${LAMBDATASKROOT}

When you build your Server SDK for your service, you will get a Python wheel.

You just need to copy that wheel and install it via pip inside your image.

Note that you need to build your library for Linux, and Python version used to

build your SDK should match with your image's Python version.

For cross compiling, you can consult to:

https://pyo3.rs/latest/buildinganddistribution.html#cross-compiling

COPY wheels/ ${LAMBDATASKROOT}/wheels RUN pip3 install ${LAMBDATASKROOT}/wheels/*.whl

You can install your application's other dependencies listed in requirements.txt.

COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDATASKROOT}"

Create a symlink for your application's entrypoint,

so we can use /app.py to refer it

RUN ln -s ${LAMBDATASKROOT}/app.py /app.py

By default public.ecr.aws/lambda/python images comes with Python runtime,

we need to override ENTRYPOINT and CMD to not call that runtime and

instead run directly your service and it will start our custom runtime.

ENTRYPOINT [ "/var/lang/bin/python3.8" ] CMD [ "/app.py" ] ```

See https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-create-from-base for more details on building your custom image.

This crate is part of the AWS SDK for Rust and the smithy-rs code generator. In most cases, it should not be used directly.