TL;DR
Streamlit ist ein großartiges Tool, mit dem Sie ganz einfach schöne data-Anwendungen erstellen können. Wenn es jedoch darum geht, sie bereitzustellen und zugänglich zu machen, kann es für Nichtfachleute komplizierter werden. In diesem Artikel stellen wir Ihnen unseren Weg zur Bereitstellung unserer Anwendung auf GCP vor, wobei wir den Zugang auf bestimmte Personen beschränkt haben. Wir haben zwei Lösungen implementiert: eine mit Cloud Run, die andere mit App Engine. Wir haben uns für App Engine entschieden, weil es so einfach ist, die Anwendung mit IAP (Identity-Aware Proxy) zu sichern.
Beweggründe für den Einsatz
In diesem Artikel nehmen wir das Beispiel des Text Data Explorer, einer Streamlit-Anwendung, die wir entwickelt haben, um in wenigen Minuten und mit wenigen Klicks Einblicke in den Rohtext data zu geben. Diese Anwendung werden wir in einem späteren Artikel vorstellen.

Beispiel für eine App, die auf GCP bereitgestellt werden soll
Es gibt zwei Hauptoptionen, um diese Anwendung und diesen Prozess zu starten:
Um die Anwendung möglichst vielen Personen in unserem Unternehmen zur Verfügung zu stellen, also auch Personen, die nicht unbedingt an den Umgang mit GitHub gewöhnt sind, haben wir beschlossen, die Anwendung auf GCP (Google Cloud Platform) bereitzustellen und sie über eine einzige URL in einer sicheren Umgebung zugänglich zu machen.
Schritt-für-Schritt-Bereitstellung auf GCP
Es wurden zwei verschiedene Ansätze für die Bereitstellung der Anwendung auf GCP getestet:
Es gibt jedoch einen ersten gemeinsamen Schritt, der beide Ansätze betrifft und in der “Dockerisierung” unserer Anwendung besteht.
Dockerisierung der Anwendung
Wenn Sie mit Docker nicht vertraut sind, finden Sie hier eine kleine Einführung, aber zögern Sie nicht, die Dokumentation oder spezifischere Artikel für weitere Details.
Was ist Docker?
Docker ist eine offene Plattform für die Entwicklung, den Versand und die Ausführung von Anwendungen. Sie ermöglicht es Ihnen, eine Anwendung mit all ihren Abhängigkeiten in eine standardisierte Einheit für die Softwareentwicklung zu verpacken. In der Praxis bedeutet dies, dass Sie ein so genanntes Docker-Image erstellen, d.h. die Blaupausen der Anwendung, die die Grundlage für die Docker-Container bilden, den ruhenden Inhalt. Um dieses Image zu erstellen, müssen wir ein Dockerfile definieren, d.h. eine einfache Textdatei, die eine Liste von Befehlen enthält, die der Docker-Client beim Erstellen eines Images aufruft. Sobald das Image erstellt ist, wird es in einer Registry gespeichert (z.B. Container Registry auf GCP) und kann auf einer dedizierten Instanz bereitgestellt werden, z.B. über Cloud Run oder App Engine.
In unserem Fall müssen wir das also tun:
Beginnen wir mit der Erstellung der Dockerdatei. Wie bereits erwähnt, besteht diese aus einer Reihe von Befehlen, die zur Erstellung des Docker-Images verwendet werden. Im Falle einer Streamlit-Anwendung kann das Dockerfile in mehrere Blöcke unterteilt werden:
├── app.py <- Hauptskript zum Starten der Streamlit-App
├── text_explorer <- Ordner, der alle Funktionen und den Code sammelt
├── requirements.txt <- Datei, die die zu installierenden Bibliotheken auflistet
└── Referenzen <- Ordner mit Logos und Bildern
Anhand dieser Struktur sehen Sie hier ein Beispiel für das Dockerfile, das wir für unsere Anwendung verwendet haben:
VON python:3.7
# Legen Sie den Port frei, auf dem Ihre Anwendung laufen soll
EXPOSE 8080
# Upgrade pip und Installationsanforderungen
COPY Anforderungen.txt Anforderungen.txt
RUN pip install -U pip
RUN pip install -r requirements.txt
# App-Code kopieren und Arbeitsverzeichnis festlegen
COPY text_explorer text_explorer
COPY app.py app.py
COPY Referenzen Referenzen
WORKDIR .
# Lauf
ENTRYPOINT [“streamlit”, “run”, “app.py”, “-server.port=8080”, “-server.address=0.0.0.0”]
Sobald die Dockerdatei erstellt ist, können wir unser Image erstellen und dabei einer GCP-freundlichen Namenskonvention folgen, die später bei der Bereitstellung hilfreich sein wird. Dies geschieht mit dem folgenden Befehl:
Um es an Ihre eigene Anwendung anzupassen, ersetzen Sie die ‘gcp_project_name’ durch Ihren eigenen GCP-Projektnamen und den ‘app_name’ durch Ihren eigenen Anwendungsnamen ersetzen. Sie können die Versionsnummer auch aktualisieren, wenn sich Ihre Anwendung weiterentwickelt, indem Sie die ‘v1’Suffix mit Ihrer aktuellen Version.
Von dort aus können wir unsere Anwendung in einem Docker-Image verpackt auf GCP bereitstellen, um sie für unsere Teamkollegen zugänglich zu machen.
Stellen Sie Ihre Anwendung mit Cloud Run bereit
Cloud Run ist ein serverloser cloud-Dienst von GCP, mit dem Sie vorgefertigte Anwendungen einfach bereitstellen können. Einer seiner Hauptvorteile ist, dass er den größten Teil der Ressourcenverwaltung automatisiert. Sie müssen Cloud Run also nur mitteilen, wo sich Ihr Docker-Image befindet, und Cloud Run stellt es dann in einer serverlosen Umgebung bereit, ohne dass Sie z. B. die optimale Anzahl von Ressourcen angeben müssen.
Um dies zu tun, können Sie die unten aufgeführten Schritte befolgen:
- Initialisieren Sie gcloud Modul auf dem rechten GCP-Projekt mit dem folgenden Befehl:
gcloud init
- Übertragen Sie den Docker mit folgendem Befehl in die GCP Container Registry:
- Gehen Sie in Ihrem GCP-Projekt auf den Abschnitt Cloud run. Klicken Sie auf “Dienst erstellen”, wählen Sie die Region und legen Sie den Namen Ihres Dienstes fest. Wählen Sie dann das Docker-Image, das Ihrer Streamlit-App entspricht, und aktualisieren Sie den Port mit dem, den Sie in Ihrer Dockerdatei definiert haben
Cloud Run Schnittstelle
- Schließlich können Sie Ihre App testen, indem Sie der URL folgen, die mit dem neu erstellten Cloud Run-Dienst verknüpft ist
Wie Sie sehen, erfolgt die Bereitstellung in nur wenigen Schritten und ist selbst für Neulinge in der Anwendungsbereitstellung recht einfach. In unserem Fall wollten wir jedoch neben der Bereitstellung auch unsere Anwendung absichern, damit sie nur innerhalb unseres Unternehmens zugänglich ist, und zu diesem Zeitpunkt fanden wir keine “einfache” Lösung, die zu Cloud Run passte. Deshalb beschlossen wir, nach einer alternativen Lösung zu suchen, die uns diese Sicherheitsebene ohne allzu große Schwierigkeiten ermöglichen würde, und landeten schließlich bei App Engine.
Stellen Sie Ihre App mit App Engine bereit
App Engine ist ein cloud-basierter Computing-Service, der zum Hosten von Webanwendungen verwendet wird, die sich bereits in der Google-Infrastruktur befinden. Kurz gesagt, können Sie damit dasselbe tun wie mit Cloud Run, da es sich bei beiden um cloud-Dienste von Google handelt, mit denen Sie Anwendungen bereitstellen können. Im Gegensatz zu Cloud Run, wo Sie nur für die eingehenden Anfragen zahlen, zahlen Sie bei App Engine jedoch für die gesamte Laufzeit, unabhängig davon, ob es Anfragen gibt oder nicht. Daher kann App Engine am Ende eine teurere Lösung sein. Trotzdem haben wir uns für diese Lösung entschieden, weil App Engine den Vorteil einer nativen Integration mit IAP (Identity-Aware Proxy) hat, mit der Sie Ihre Anwendung problemlos absichern können.
Die Schritte für eine Bereitstellung auf App Engine sind nicht zahlreicher oder komplizierter als bei Cloud Run, hier ist, was Sie tun müssen:
- Überprüfen Sie den in Ihrer Dockefile angegebenen Port. Er muss 8080 sein, um mit App Engine kompatibel zu sein.
- Initialisieren Sie das gcloud-Modul im rechten GCP-Projekt mit dem folgenden Befehl:
- Erstellen Sie eine YAML-Datei für Ihre App (mit dem Namen app.yaml) im Stammverzeichnis Ihres Projekts (d.h. auf derselben Ebene wie Ihr Hauptskript und Ihre Dockerdatei) mit der folgenden Vorlage:
app.yaml Datei Beispiel
Aktualisieren Sie den Dienstnamen mit Ihrem eigenen Anwendungsdienstnamen
Hier haben wir die Option runtime:custom definiert, denn mit benutzerdefinierten Laufzeiten können Sie Anwendungen erstellen, die in einer durch ein Dockerfile definierten Umgebung laufen, wie es bei uns der Fall ist. Die Option env:flex bedeutet, dass unsere Anwendung in der flexiblen Umgebung ausgeführt wird (im Gegensatz zur Standardumgebung). Diese Wahl wurde getroffen, weil die flexible Umgebung die Anwendung in Docker-Containern auf virtuellen Maschinen (VMs) der Google Compute Engine ausführt, die weniger Einschränkungen unterliegen als die Standardumgebung (z.B. kann Ihre Anwendung nicht auf die Festplatte schreiben). Weitere Einzelheiten zu den wichtigsten Unterschieden finden Sie in der Google-Dokumentation.
Sie können in der YAML-Datei auch detailliertere Netzwerk-, Ressourcen- und Skalierungseinstellungen vornehmen, wie z.B. die Mindestanzahl der Instanzen, die Ihrem Dienst zur Verfügung stehen, oder die Anzahl der CPUs. Sie können in dieser Datei auch einige Umgebungsvariablen definieren, um sie für Ihre Anwendung zugänglich zu machen.
- Führen Sie den folgenden Befehl aus (dies kann einige Minuten dauern):
- Nach der Ausführung des Deploy-Befehls wird die App auf App Engine verfügbar sein und Sie finden die entsprechende URL direkt auf GCP
Wenn Sie Ihre App absichern und einigen Personen einen eingeschränkten Zugriff gewähren möchten, gehen Sie in Ihrem GCP-Projekt in den Bereich “IAM & Admin” / “Identity-Aware Proxy”:
- Unter “Alle Webdienste” sollten Sie einen Abschnitt “App Engine App” sehen. Wenn IAP deaktiviert ist, schalten Sie es ein und klicken Sie auf Ihren Streamlit-Dienst.

IAP-Abschnitte zur Verwaltung von Berechtigungen
- Klicken Sie rechts auf “Mitglied hinzufügen”, geben Sie alle gewünschten E-Mail-Adressen (oder einen mit einer Mailingliste verknüpften Alias) ein und wählen Sie die Rolle “IAP-gesicherter Web-App-Benutzer”.
Und schon sind Sie fertig. Ihre Anwendung ist nun bereitgestellt und gesichert.
Tipps, wenn Sie Probleme mit der Anzeige von Bildern in Ihrer installierten App haben
Bei der Verwendung von st.pyplot() oder st.image() kann es zu Darstellungsproblemen kommen, wenn Sie Ihre installierte Anwendung betrachten (d.h. es wird “0” anstelle Ihres Plots oder Bildes angezeigt). Wir empfehlen Ihnen, st.plotly_chart() zu verwenden, wann immer Sie können, um dies zu vermeiden, und ansonsten HTML-Codefragmente zu verwenden. In unserem Fall wollten wir z.B. einige wordclouds anzeigen und das war mit Plotly nicht machbar. Daher haben wir beschlossen, das Bild wordcloud als PNG in einem speziellen GCS-Bucket zu speichern, es als Bytes herunterzuladen und es mit etwas HTML-Code wie diesem anzuzeigen:
st.markdown(
f"""
""",
unsafe_allow_html=True
)
st.markdown("")
st.markdown("")
In diesem Beispiel ist die Variable “image” ein Byte-Objekt, das aus der Methode .dowload_as_bytes() des Google cloud Storage Python-Pakets stammt.
Fazit
Der Zweck dieses Artikels war es, Ihnen einige Tipps und Beispiele für cloud-Dienste zu geben, die für die Bereitstellung von Streamlit-Anwendungen verwendet werden können. Unserer Erfahrung nach ist App Engine die geeignete Lösung, wenn Sie eine Sicherheitsebene benötigen, um den Zugriff auf bestimmte Personen zu beschränken. Ansonsten bleibt Cloud Run eine einfache Möglichkeit, eine Streamlit-Anwendung bereitzustellen.
Credits: Paul Devienne, Amale El Hamri

BLOG






