Skip to Content
Technical Articles
Author's profile photo Martin Stenzig

Deployment of Python Web Server to Cloud Foundry using MTA

This blog shows how you can deploy a hello world example to the Cloud Foundry stack using a Multi Target Application MTA deployment process.

I am also extending the example to show how to use the same framework to deploy run JupyterLab / Notebook on the CloudFoundry stack.

The idea is to use the Python code module/microservice as part of a larger deployment. Hence this example will show the deployment using a mta.yaml file.

  1. To start out with we will create a folder to house the necessary files called ‘py-service’
  2. The core of the functionality is a web server based on the Python Flask framework (https://flask.palletsprojects.com/).
    • To model the service, create a file in the py-service directory called ‘first-service.py’ and poppulate it using the following code snippet:
from flask import Flask
import os

app = Flask(__name__)
# Port number is required to fetch from env variable
# http://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#PORT

cf_port = os.getenv("PORT")

# Only get method by default
@app.route('/')
def hello():
    return 'Hello World'

if __name__ == '__main__':
	if cf_port is None:
		app.run(host='0.0.0.0', port=5000, debug=True)
	else:
		app.run(host='0.0.0.0', port=int(cf_port), debug=True)
  • The PORT variable is set by the cloud foundry environment and used to expose the application to the outside world
  1. The next step is to create a file called ‘Procfile’. This file identifies the starting point of the application. It contains a single line web: python first-service.py. This line provides the command that is executed. the ‘web:’ specifies that it will provide a web server.
  2. To tell the Cloud Foundry Buildpack what Python version should be used, you need to create a file called ‘runtime.txt’. This file contains a simple line: python-3.9. You can find the available realeases in here (https://github.com/cloudfoundry/python-buildpack/releases)
  3. The packages/dependenies can be specified in an environment.yml or requirements.txt file
name: riz-inno-py-cf-env

channels:
- conda-forge

dependencies:
- pip
### to specfy additional pop based packages you can specify the following
###- pip:
###  - docx
###  - gooey
###  - http://www.lfd.uci.edu/~gohlke/pythonlibs/bofhrmxk/opencv_python-3.1.0-cp35-none-win_amd64.whl
- pytest
#@ if you want to specify a version, you can use - Flask==1.0.2
- flask
- numpy
- matplotlib
  1. The last part is a mta.yaml file just like you would create it for other multi target applications.
    • !!!The memory allocation for this example is tremedous (2gb for memory and at 3gb for disk) I have not done any digging where the consumption originates, but adding the conda package manager seems to take up a lot of overhead.
    • You can find more details about available buildpacks in the SAP Help and on the Cloud Foundry page
    • This is the mta.yaml code:
ID: riz.inno.py-cf
_schema-version: '3.1'
version: 1.0.0

modules:
  - name: riz-inno-py-cf
    type: python
    path: py-service/   
    parameters:
      memory: 2000M   # Specifying theses quotas is important as they specify how much of the assigned entitlement is assigned once the module is started
      disk-quota: 3000M
  1. To build and deploy the application execute
    1. mbt build
    2. cf deploy .\mta_archives\riz.inno.py-cf_1.0.0.mtar
    • Be aware: Staging the application takes a fairly long time.
  2. To view the progress use a different terminal window and specfy: cf logs riz-inno-py-cf
  3. At the end of the deployment the deployment process will show the URL for the deployed component. Open the URL in a browser and you should receive the text ‘Hello World’ in the browser window.

Run Jupyter Notebook in the Cloud Foundry stack

  1. Add - jupyterlab to the end of the ‘environment.yml’ file
  2. Change ‘Procfile’ to have the following content web: jupyter lab --ip 0.0.0.0 --port $PORT --no-browser
  3. To open Jupyter you need two pieces
  4. the host – Execute cf app riz-inno-py-cf – under ‘routes:’ you can find the host name.
  5. The url/token. – Execute cf logs riz-inno-py-cf --recent – copy the path including the token. Something like ‘/lab?token=131a072f38600b24698ea25c14431f1383054d542ce26117’
  6. Combine the host name with path and token to open up jupyter lab – Example URL: https://[host]/lab?token=131a072f38600b24698ea25c14431f1383054d542ce26117

Conclusion

I hope this post provided you a good overview of how you can run python apps in the Business Technology Platform Cloud Foundry stack.

Please share your feedback and thoughts in the comment section below.

You can find more relevant content by following the tag “Python”

Assigned tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.