We built the POC version of the Python backend using the most popular Python3 framework FastAPI. We deployed it on Cloud Run (public) with Docker image and everything worked as expected.
We then moved on to making the Cloud Run private and adding an API gateway infront of it.
We saved the http://localhost:8000/openapi.json and ran the gcloud cli to create an API gateway and it failed!
Looking at the documentation https://cloud.google.com/api-gateway/docs/openapi-overview we realized, Google, for some reason, still only supports OpenAPI 2.0 (Swagger 2.0). Working on AWS for quite some time, I had assumed OpenAPI 3 would be supported.
We tried figuring out a way to configure FastAPI to generate Swagger 2 spec. But FastAPI only supports OpenAPI 3.x. Many have suggested downloading the openapi.json, passing it through some convertor and then some manual intervention to convert it to Swagger 2.
Since I wanted to use CI/CD, I didn't want to deal with manual conversion every time developers made some change.
So, I referred the FastAPI OpenAPI related code and came up with
Requirements
Python 3.8+
FastAPI 0.79.0+
Installation
$ pip install fastapi_swagger2
Example
from typing import Union from fastapi import FastAPI from fastapi_swagger2 import FastAPISwagger2 app = FastAPI() FastAPISwagger2(app) @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q}
This adds following endpoints:
http://localhost:8000/swagger2.json
http://localhost:8000/swagger2/docs
http://localhost:8000/swagger2/redoc
http://localhost:8000/swagger2/docs
http://localhost:8000/swagger2/redoc
Generate spec for CI/CD
import os
import yaml
from app.main import app
URL = os.environ["CLOUD_RUN_URL"]
app.servers.append(URL)
spec = app.swagger2()
spec['x-google-backend'] = {'address': URL}
print(yaml.dump(spec))