Wie Sie eine App auf SAP BTP Cloud Foundry erstellen

Wie Sie eine App auf SAP BTP Cloud Foundry erstellen

SAP BTP Cloud Foundry ermöglicht die einfache Bereitstellung und Skalierung von Cloud-Anwendungen in einer standardisierten, offenen Laufzeitumgebung. Die Vorteile liegen in der hohen Flexibilität, schnellen Entwicklungszyklen sowie nahtloser Integration mit anderen SAP-Diensten. In diesem Beitrag führe ich Sie Schritt für Schritt durch die Erstellung einer eigenen SAP BTP Cloud Foundry Applikation mit Python.

So erleichtern Sie die Entscheidungsfindung und gewinnen einen umfassenden Überblick über Ihr Geschäft! Mit meinem Buch lernen Sie, SAP BPC für die Unternehmensplanung einzurichten, zu nutzen und zu erweitern.

Dabei führen wir folgende Schritte aus:

Gergana Tsakova hat in Ihrem Tutorial „Create an Application with Cloud Foundry Python Buildpack“ einen sehr guten Überblick über die notwendigen Schritte gegeben. Allerdings ist der Artikel eher auf das Command Line Interface fokusiert. In diesem Beitrag zeige ich Ihnen beide Optionen. Einmal mit der grafischen Obefläche von SAP BTP Cockpit und nochmals mit CLI. Zum Verinnnerliches von Konzepten ist die grafische Oberfläche hilfreich. Zur Steigerung der Produktivität nutzen Sie den CLI Client.

SAP BTP Trial Instanz bereitstellen

Zunächst müssen Sie allerdings eine SAP BTP Instanz haben, auf der Sie die App hosten können. Sie können Ihre eigene Umgebung nutzen oder eine 30-tagige Testversion nehmen. Nutzen Sie Ihre SAP Unversal ID und sie können nach einigen Minuten loslegen.

Applikation erstellen

Während die BTP Einrichtung läuft, können Sie schon mit der Erstellung Ihrer App loslegen. In unserem Beispiel erstellen wir eine einfache Python App mit Flask.

Python Dateien

Unsere App basiert auf der Python Bibliothek Flask. Dazu legen wir in einem neuen Ordner (in meinem Fall cf_fancy_flask_hello_world) eine server.py Datei an. Diese enthält den folgenden Code:

import os
from flask import Flask
from fancy import get_fancy_html  

app = Flask(__name__)
port = int(os.environ.get('PORT', 3000))

@app.route('/')
def home():
    return get_fancy_html()  

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port)

Um die Datei übersichtlich zu halten, lagern wir den eigentlichen HTML Code in die fancy.py Datei aus, die wir über from fancy import get_fancy_html importieren und dann über get_fancy_html() aufrufen. Der Inhalt von fancy.py sieht wie folgt aus. Ein einfaches „Hello world“ war mir zu langweilig ;)

# fancy.py
def get_fancy_html():
    html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Fancy Hello World</title>
    <style>
        body {
            margin: 0;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
            background-size: 400% 400%;
            animation: gradientBG 15s ease infinite;
            overflow: hidden; 
            font-family: Arial, sans-serif; 
        }

        @keyframes gradientBG {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }

        .hello-text {
            font-size: 14em;
            color: white;
            text-shadow: 2px 2px 5px rgba(0,0,0,0.3);
            animation: moveText 6s ease-in-out infinite alternate;
        }

        @keyframes moveText {
            0% { transform: translateY(0px) scale(1); }
            50% { transform: translateY(-20px) scale(1.1); }
            100% { transform: translateY(0px) scale(1); }
        }
    </style>
</head>
<body>
    <div class="hello-text">Hello world!</div>
</body>
</html>
"""
    return html_content

requirements.txt anlegen

Die requirements.txt-Datei wird verwendet, um alle benötigten Bibliotheken bzw. Pakete aufzulisten, die für den Betrieb der Anwendung erforderlich sind. Sie ist besonders wichtig beim Deployment von Apps auf SAP BTP Cloud Foundry, da dort beim Bereitstellen automatisch diese Datei ausgelesen wird, um die Umgebung korrekt einzurichten. Sie können die Datei manuell anlegen oder die im Python Spickzettel beschriebenen Tipps nutzen.

Unsere requirements.txt ist recht einfach und enthält nur die Flask Bibliothek, Version 2.3:

Flask==2.3.*

runtime.txt anlegen

Die runtime.txt definiert die verwendete Python Version, in unserem Beispiel 3.13:

python-3.13.x

manifest.yml anlegen

Sie können die Eigenschaften und das Verhalten der App über CLI oder über die manifest.yml Datei (eine YAML-Definitionsdatei) verwalten. Ist um einiges übersichtlicher als JSON. In unserem Beispiel sieht die Datei so aus:

---
applications:
- name: fancy-hello-world-app
  random-route: false
  routes:
  - route: https://fancy-hello-world-app.cfapps.us10-001.hana.ondemand.com
  path: ./
  memory: 512M
  disk_quota: 1024M
  instances: 2
  buildpacks: 
  - python_buildpack
  command: python server.py

Nachfolgend erkläre ich die einzelnen Parameter. Eine detaillierte Übersicht erhalten Sie unter App manifest attribute reference.

name: fancy-hello-world-app – das ist der Name unserer App.

random-route: false – wenn Sie eine App ohne Angabe route (URL) bereitstellen, versucht Cloud Foundry, automatisch eine URL basierend auf dem App-Namen zu erzeugen – was zu Kollisionen führen kann. Sie können das Attribut random-route: true verwenden, um automatisch eine eindeutige Route generieren zu lassen und Namenskonflikte zu vermeiden.

routes:
- route: https://fancy-hello-world-app.cfapps.us10-001.hana.ondemand.com
– in unserem Fall wollen wir eine von uns definierte URL nutzen. Diese setzt sich aus der Domain fancy-hello-world-app und dem Host bzw. API Endpoint api.cf.us10-001.hana.ondemand.com zusammen. Sie können den API Endpoint in dem Subaccount unter Cloud Foundry Environment einsehen.

API Endpoint einsehen

path: ./ – Das Attribut path gibt Cloud Foundry an, in welchem Verzeichnis sich die Anwendung befindet. In unserem Fall direkt unter https://fancy-hello-world-app.cfapps.us10-001.hana.ondemand.com/

memory: 512M – Das Attribut memory legt das Speicherlimit für alle Instanzen einer App fest. Dabei muss eine Einheit angegeben werden: M, MB, G oder GB – sowohl Groß- als auch Kleinschreibung sind erlaubt. Das Standardlimit beträgt 1 G. Wenn Sie wissen, dass Ihre App-Instanzen weniger als 1 G Speicher benötigen, können Sie ein kleineres Limit angeben, um Kontingent zu sparen.

disk_quota: 1024M – Das Attribut disk_quota legt den Festplattenspeicher fest, der einer App-Instanz zugewiesen wird. Hier kann man zunächst großzügiger sein, um sicherzustellen, dass alle Python Bibliotheken installiert werden können. Nach der Bereitstellung der App kann man den definierten Festplattenspeicher nach unten korrigieren.

instances: 2 – Um sicherzustellen, dass Plattformwartungen deine App nicht unterbrechen, empfiehlt Cloud Foundry, mindestens zwei Instanzen der App laufen zu lassen.

buildpacks:
- python_buildpack
– Der verwendete Buildpack, in unserem Fall Python. Ein Buildpack in Cloud Foundry ist eine Sammlung von Skripten und Abhängigkeiten, die Ihre Anwendung für die Ausführung in der Cloud vorbereitet. Buildpacks erkennen, konfigurieren und kompilieren Ihre Anwendung automatisch für die Cloud-Umgebung. Die verfügbaren Buildbacks können über den cf builbacks Befehl im CLI aufgelistet werden.

Verfügbare Buildpacks

command: python server.py – gibt an, wie die App gestartet wird.

Procfile

Ein Procfile dient in Cloud Foundry dazu, explizit anzugeben, wie die Anwendung gestartet werden soll. Da wir es aber bereits im manifest.yml definiert haben, ist diese Datei (ohne Dateierweiterung, sie heißt einfach nur Procfile) nicht zwingend notwendig.

web: python server.py

Grafische Oberfläsche – SAP BTP Cockpit

Gratuliere, die App ist eigentlich fertig. Nun müssen wir es auf SAP BTP Cloud Foundry installieren bzw. bereitstellen.

App installieren

Um die App über das SAP BTP Cockpit zu installieren, müssen Sie zunächst alle erstellten Dateien, außer manifest.yml, als zip-Datei komprimieren.

Dateien verpacken

Loggen Sie sich nun beim BTP Cockpit ein, z.B. dem gerade angelegten Trial Account.

SAP BTP Cockpit aufrufen

Wählen Sie anschließend den Subaccount.

Zum Subaccount wechseln

Wechseln Sie danach zum dev Space.

Space aufrufen

Dieser hat noch keine Apps. Klicken Sie auf Deploy Application, um eine neue App zu installieren.

Deploy Application

Wählen Sie nun unter File location die gerade erstellte zip-Datei aus. Unter Manifest location wählen sie die erstellte manifest.yml Datei aus. Stellen Sie sicher, dass die Option Start application after deploy aktiv ist. Klicken Sie anschließend auf Deploy.

Datei und manifest auswählen

Nun wird Ihre App installiert und gestartet. Das kann ein paar Sekunden dauern. Anschließend wird die frisch installierte App unter Applications angezeigt. Allerdings wird diese manchmal im Hintergrund noch gestartet, auch wenn der Requested State schon auf Started steht.

Installierte App

Klicken Sie auf die App, um die Details einzusehen. Unter Application Routes sehen Sie die URL. Rufen Sie diese auf, um zu Ihrer App zu gelangen.

Sieht ganz schön cool aus, finde ich. Klicken Sie auf das Bild, um die animierte Version zu sehen.

Umgebungsvariablen setzen

Sie sollten Passwörter, API Schlüssel oder sonstige vertrauliche Informationen niemals in Code selbst speichern. Nutzen Sie dazu Umgebungsvariablen. In unserem Beispiel, wollen wir einen Namen der Person definieren, die begrüsst werden soll.

Um eine neue Umgebungsvariable für Ihre App zu definieren, klicken Sie auf User-Provided Variables.

Umgebungsvariable definieren

Klicken Sie nun auf Create Variable, um eine neue Variable anzulegen.

Neue Variable erstellen

Vergeben Sie als Schlüssel (Key) den Namen der Variable und einen Wert (Value) für diese. In meinem Beispiel heißt die Umgebungsvariable NAME und sie hat den Wert Denis. Klicken Sie anschließend auf Create.

Namen der Variable und Wert angeben

Nun sehen Sie die gespeicherte Variable in der Übersicht.

Übersicht über angelegten Variablen.

Damit die Änderung übernommen wird, müssen Sie die App neustarten. In unserem Fall muss die App zunächst die Variable überhaupt verarbeiten. Also passen wir die App an.

App aktualisieren

Zunächst passen wir, die server.py an, um den Namen aus der Umgebungsvariable zu bekommen und an die Funktion get_fancy_html zu übergeben. Der neue Code sieht wie folgt aus:

import os
from flask import Flask
from fancy import get_fancy_html  

app = Flask(__name__)
port = int(os.environ.get('PORT', 3000))
name = os.environ.get('NAME')

@app.route('/')
def home():
    return get_fancy_html(name=name)  

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port)

In fancy.py definieren wir name als Parameter und passen den Begrüssungstext entsprechend an. Darüber hinaus müssen wir die CSS Definition mit zusätzlichen {} escapen. Der angepasste Code sieht wie folgt aus:

# fancy.py
def get_fancy_html(name):
    html_content = f"""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Fancy Hello World</title>
    <style>
        body {{
            margin: 0;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
            background-size: 400% 400%;
            animation: gradientBG 15s ease infinite;
            overflow: hidden; 
            font-family: Arial, sans-serif; 
        }}

        @keyframes gradientBG {{
            0% {{ background-position: 0% 50%; }}
            50% {{ background-position: 100% 50%; }}
            100% {{ background-position: 0% 50%; }}
        }}

        .hello-text {{
            font-size: 14em;
            color: white;
            text-shadow: 2px 2px 5px rgba(0,0,0,0.3);
            animation: moveText 6s ease-in-out infinite alternate;
        }}

        @keyframes moveText {{
            0% {{ transform: translateY(0px) scale(1); }}
            50% {{ transform: translateY(-20px) scale(1.1); }}
            100% {{ transform: translateY(0px) scale(1); }}
        }}
    </style>
</head>
<body>
    <div class="hello-text">Hello {name}!</div>
</body>
</html>
"""
    return html_content

Nun werden die ganzen Dateien (außer manifest.yml) neu als zip verpackt und wieder über SAP BTP Cockpit hochgeladen. Gehen Sie dazu wieder zu dem dev Space und klicken Sie erneut auf Deploy Application.

Applikation aktualisieren

Laden Sie nun die neue Version der App hoch.

Neue Version hochladen

Nachdem die Aktualisierung abgeschlossen wurde, wird eine Application started Meldung angezeigt.

Rufen Sie die App erneut auf, um zu überprüfen, dass die Umgebungsvariablen korrekt ausgelesen werden.

Scheint zu funktionieren.

Umgebungsvariablen anpassen

Gegebenenfalls müssen Sie den, in einer Umgebungsvariable gespeicherten, API Schlüssel, das Passwort oder den Namen der Person anpassen. Selektieren Sie dazu Ihre App und wählen Sie erneut User-Provided Variables.

Umgebungsvariable anpassen

Unter Actions, wählen Sie das Ändern Icon aus.

Variable ändern

Geben Sie anaschließend einen neuen Wert für die Variable ein.

Neuen Wert eingeben

Der neue Wert wird in der Übersicht angezeigt. Damit jedoch die Änderung übernommen wird, müssen Sie die Applikation neu starten.

Neuer Wert in der Übersicht sichtbar

Wechseln Sie dazu zu Overview und klicken Sie auf Restart.

Applikation neustarten

Nun wird der neue Wert der Umgebungsvariable angezeigt.

Neuer Name wird angezeigt

Wenn Sie die Umgebungsvariable komplett löschen wollen, gehen Sie wieder zu User-Provided Variablen und klicken Sie auf das Löschen Icon. Anschließend wird die Variable gelöscht.

Umgebungsvariable löschen

SAP Analytics Cloud für Microsoft Office - Das Praxishandbuch

Moderne Berichte und Präsentationen mit SAP Analytics Cloud Daten!

Bringen Sie die Analyse- und Reporting-Funktionen von SAP Analytics Cloud in Ihre gewohnte Office-Umgebung! In diesem Handbuch zeige ich Ihnen, wie Sie das Add-in für Excel und PowerPoint nutzen, um in Echtzeit auf aktuelle Daten zuzugreifen, diese zu analysieren sowie in Berichten und Präsentationen zu verwenden.

Command Line Interface (CLI)

Nun löschen wir unsere schöne App und machen das Ganze nochmals mit dem CLI Client. Dieser erlaubt schnelleres Deployment ohne viel Geklicke und zip-Dateien, sowie zusätzliche Funktionen.

CLI Client herunterladen

Um den CLI Client nutzen zu können, müssen Sie es herunterladen. Beim Github von Cloud Foundry finden Sie den Link zu der Version V8. Scrollen Sie runter zu Installers and compressed binaries und laden Sie den Installer für Windows 64 bit herunter.

Installer herunterladen

Entpacken Sie die Datei und führen Sie die Installation durch.

Nach der Installation drücken Sie die Start Taste und geben Sie cmd ein. Bestätigen Sie anschließend mit ENTER oder klicken Sie auf Eingabeaufforderung.

cmd starten

Tippen Sie nun in der Eingabeaufforderung cf ein, um die Installation zu überprüfen. Es wird Ihnen die Version des Clients sowie die Dokumentation angezeigt.

Version des Clients sowie die Dokumentation

App installieren

Nun können wir den Client nutzen, um unsere App auf SAP BTP Cloud Foundry zu installieren. Sie können die komplette Übersicht über die Befehle in der Cloud Foundry CLI Reference Guide finden.

Rufen Sie dazu zuerst den API Endpoint von Ihrer Cloud Foundry Umgebung auf.

cf api https://api.cf.us10-001.hana.ondemand.com

Sie können diese in Ihrem Subaccount unter Cloud Foundry Environment einsehen.

API Endpoint

Nachdem der API Endpoint erfolgreich gesetzt wurde, müssen Sie sich einloggen.

Anmeldung mit SSO

Nutzen Sie die Option --sso, um sich mit der SAP Universal ID anzumelden.

cf login --sso

Es wird eine Webseite angezeigt, bei der Sie sich Ihren Authentifizierungscode abholen können.

Authentifizierungscode abholen

Melden Sie sich bei der Webseite an, kopieren Sie den Code, fügen ihn mit der rechten Maustaste in die Eingabeaufforderung ein und bestätigen Sie mit der Enter Taste.

Anmeldung erfolgreich

Navigieren Sie nun zu dem Ordner, der die von Ihnen erstellten Dateien enthält.

D:
cd Users\denis\python_projekte\cf_fancy_flask_hello_world\src
dir
Ordner auswählen

Installieren Sie nun die App auf Cloud Foundry über cf push. Sie müssen keine zip-Dateien anlegen.

cf push

Nun werden die benötigten Abhängigkeiten installiert.

Schließlich wird die App gestartet.

App wird gestartet

Nun können Sie die App über die definierte URL aufrufen.

App aufrufen

Umgebungsvariablen setzen

Nun wollen wir, analog zu dem Beispiel über SAP BTP Cockpit, Umgebungsvariablen definieren. Dazu nutzen wir den set-env Befehl.

 cf set-env APP_NAME ENV_VAR_NAME ENV_VAR_VALUE

In unserem Fall:

cf set-env fancy-hello-world-app NAME Denis
Umgebungsvariable setzen

Um alle Umgebungsvariablen aufzulisten, können Sie den Befehl cf env nutzen. Die Syntax sieht wie folgt aus:

 cf env APP_NAME

Für uns also:

cf env fancy-hello-world-app

Unsere Variable ist unter dem User-Provided Abschnitt aufgelistet.

Variablen abrufen

App aktualisieren

Nun müssen wir die App anpassen, um die Umgebungsvariable auszulesen und erneut bereitstellen. Die Anpassung läuft analog zu der BTP Cockpit Version.

Die Aktualisierung ist dagegen viel einfacher. Wir tippen einfach nochmals cf push ein.

cf push

Nach der Bereitstellung wird die Umgebungsvariable abgerufen und im Code verwendet.

Umgebungsvariablen anpassen

Um die Umgebungsvariable zu ändern, führen Sie einfach cf set-env mit einem anderen Wert aus.

cf set-env fancy-hello-world-app NAME Alice

Führen Sie anschließend cf restage aus, um die Änderungen in der App zu reflektieren.

cf restage fancy-hello-world-app
App nach dem Neustart

Wenn Sie die Umgebungsvariable komplett löschen wollen, nutzen Sie cf unset-env. Die Syntax sieht wie folgt aus:

 cf unset-env APP_NAME ENV_VAR_NAME

Für uns also:

cf unset-env fancy-hello-world-app NAME

Damit sind wir am Ende angelangt.

cf logout

Sie sind nun in der Lage, eigene Apps auf SAP BTP Cloud Foundry zu erstellen, zu aktualisieren und Umgebungsvariablen nutzen. Ich hoffe, dass dieser Beitrag Ihnen weitergeholfen hat. Sie können alle Beispieldateien hier herunterladen.

Ihre User beklagen sich über langsame Berichte?

  • In meinem Newsletter lernen Sie, wie Sie Abhilfe schaffen.
  • Entdecken Sie die Möglichkeiten der Performanceoptimierung.
  • Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung von SAP Systemen.
  • Viele Tipps und Tricks zu SAP BI Themen.
  • Holen Sie die maximale Performance aus Ihrem SAP BI!
  • Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „High Performance SAP BI“ als Willkommensgeschenk.
Fordere SAP Performance Tricks an

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.
0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

This site uses Akismet to reduce spam. Learn how your comment data is processed.