TL;DR
Streamlit est un outil formidable pour créer de belles applications data assez facilement mais lorsqu'il s'agit de les déployer et de les rendre accessibles, cela peut s'avérer plus compliqué pour les non-spécialistes. Dans cet article, nous souhaitons vous présenter notre parcours pour déployer notre application sur GCP en garantissant un accès restreint à des personnes spécifiques. Nous avons mis en place deux solutions : l'une avec Cloud Run, l'autre avec App Engine et nous avons choisi de garder App Engine pour sa facilité à sécuriser l'application avec IAP (Identity-Aware Proxy).
Motivations pour le déploiement
Dans cet article, nous prendrons l'exemple du Text Data Explorer, une application Streamlit que nous avons développée dans le but de fournir des informations sur le texte brut data en quelques minutes et quelques clics. Cette application sera présentée dans un prochain article.

Exemple d'application qui sera déployée sur GCP
Il existe deux options principales pour lancer cette application et ce processus :
Afin de rendre l'application accessible au plus grand nombre de personnes au sein de notre entreprise, et donc à des personnes qui n'ont pas forcément l'habitude de travailler avec GitHub, nous avons décidé de déployer l'application sur GCP (Google Cloud Platform) et de la rendre accessible via une URL unique dans un environnement sécurisé.
Déploiement pas à pas sur GCP
Deux approches différentes ont été testées pour déployer l'application sur GCP :
Cependant, il existe une étape préliminaire commune à ces deux approches qui consiste en la “dockérisation” de notre application.
Dockeriser l'application
Si vous n'êtes pas familier avec Docker, voici une petite introduction, mais n'hésitez pas à consulter le site de Docker. documentation ou des articles plus spécifiques pour plus de détails.
Qu'est-ce que Docker ?
Docker est une plateforme ouverte pour le développement, l'expédition et l'exécution d'applications. Elle vous permet d'empaqueter une application avec toutes ses dépendances dans une unité standardisée pour le développement de logiciels. En pratique, il s'agit de construire ce que l'on appelle une image Docker, c'est-à-dire les plans de l'application qui forment la base des conteneurs Docker, le contenu au repos. Pour construire cette image, il faut définir un Dockerfile, c'est-à-dire un simple fichier texte qui contient une liste de commandes que le client Docker appelle lors de la création d'une image. Une fois construite, l'image est stockée dans un registre (par exemple Container Registry sur GCP) et peut être déployée sur une instance dédiée, via Cloud Run ou App Engine par exemple.
C'est pourquoi, dans notre cas, nous devons :
Commençons par la création du Dockerfile. Comme indiqué précédemment, il s'agit d'une succession de commandes permettant de créer l'image Docker. Dans le cas d'une application Streamlit, le Dockerfile peut être divisé en plusieurs blocs :
├── app.py <- Script principal pour lancer l'application Streamlit
├── text_explorer <- Dossier regroupant toutes les fonctions et le code.
├── requirements.txt <- Fichier listant les bibliothèques à installer
└── références <- Dossier contenant des logos et des images
Avec cette structure, voici un exemple de Dockerfile que nous avons utilisé pour notre application :
DE python:3.7
# Expose le port sur lequel vous voulez que votre application soit utilisée
EXPOSER 8080
# Upgrade pip and install requirements (exigences en matière de pip et d'installation)
COPY requirements.txt requirements.txt
RUN pip install -U pip
RUN pip install -r requirements.txt
# Copier le code de l'application et définir le répertoire de travail
COPY texte_explorateur texte_explorateur
COPY app.py app.py
COPIER les références les références
WORKDIR .
# Run
ENTRYPOINT [“streamlit”, “run”, “app.py”, “-server.port=8080”, “-server.address=0.0.0.0”]
Une fois le fichier Docker créé, nous pouvons construire notre image, en suivant une convention de nommage adaptée à GCP qui sera utile pour le déploiement ultérieur. Cela se fait via la commande suivante :
Pour l'adapter à votre propre application, remplacez le ‘gcp_project_name’ par le nom de votre propre projet GCP et le symbole ‘app_name’ par le nom de votre application. Vous pouvez également mettre à jour le numéro de version au fur et à mesure de l'évolution de votre application en modifiant le champ ‘v1’ avec votre version actuelle.
À partir de là, avec notre application emballée dans une image Docker, nous pouvons la déployer sur GCP pour la rendre accessible à nos coéquipiers.
Déployez votre application avec Cloud Run
Cloud Run est un service GCP serverless cloud utilisé pour déployer facilement des applications préconstruites. L'un de ses principaux avantages est qu'il automatise la plupart des processus de gestion des ressources. Par conséquent, tout ce que vous avez à faire est d'indiquer à Cloud Run où se trouve votre image Docker, puis Cloud Run la déploiera sur un environnement serverless sans avoir besoin de spécifier le nombre optimal de ressources par exemple.
Pour ce faire, vous pouvez suivre les étapes énumérées ci-dessous :
- Initialiser gcloud sur le bon projet GCP avec la commande suivante :
gcloud init
- Transférez le docker dans le registre de conteneurs GCP à l'aide de la commande suivante :
- Allez sur votre projet GCP, dans la section Cloud run. Cliquez sur “Create service”, choisissez la région et définissez le nom de votre service. Ensuite, sélectionnez l'image Docker qui correspond à votre application Streamlit et mettez à jour le port avec celui que vous avez défini dans votre Dockerfile.
Interface Cloud Run
- Enfin, vous pouvez tester votre application en suivant l'URL liée au service Cloud Run nouvellement créé
Comme vous pouvez le voir, le déploiement se fait en quelques étapes et est assez facile, même pour les nouveaux venus dans le domaine du déploiement d'applications. Cependant, dans notre cas, en plus du déploiement, nous voulions également sécuriser notre application afin qu'elle ne soit accessible qu'au sein de notre entreprise et à ce moment-là, nous n'avons pas trouvé de solution “facile” qui s'adapterait à Cloud Run. C'est pourquoi nous avons décidé de chercher une solution alternative qui nous permettrait d'avoir cette couche de sécurité sans trop de difficultés et nous avons finalement choisi App Engine.
Déployez votre application avec App Engine
App Engine est un service informatique basé sur cloud utilisé pour héberger des applications web qui se trouvent déjà dans l'infrastructure de Google. En bref, il vous permet de faire la même chose que Cloud Run dans la mesure où il s'agit de deux services Google cloud qui vous permettent de déployer des applications. Cependant, contrairement à Cloud Run où vous ne payez que pour les demandes qui arrivent, sur App Engine vous payez pour toute la durée d'exécution, qu'il y ait des demandes ou non. Au final, App Engine peut donc s'avérer une solution plus onéreuse. Malgré cela, nous avons décidé d'opter pour cette solution car App Engine a l'avantage d'avoir une intégration native avec IAP (Identity-Aware Proxy) qui permet de sécuriser facilement votre application.
Les étapes pour réaliser un déploiement sur App Engine ne sont pas plus nombreuses ni plus compliquées que pour Cloud Run, voici ce que vous devez faire :
- Vérifiez le port spécifié dans votre Dockefile, il doit être de 8080 pour être compatible avec App Engine.
- Initialisez le module gcloud sur le projet GCP de droite avec la commande suivante :
- Créez un fichier YAML pour votre application (nommé app.yaml) à la racine de votre projet (c'est-à-dire au même niveau que votre script principal et votre fichier Docker) avec le modèle suivant :
Exemple de fichier app.yaml
Mettez à jour le nom du service avec le nom de votre propre service d'application.
Ici nous avons défini l'option runtime : custom car les runtimes personnalisés vous permettent de construire des applications qui s'exécutent dans un environnement défini par un Dockerfile comme c'est le cas pour nous. L'option env:flex signifie que notre application sera exécutée dans l'environnement flexible (par opposition à l'environnement standard). Ce choix a été fait car l'environnement flexible exécute l'application dans des conteneurs Docker sur des machines virtuelles (VM) Google Compute Engine, qui ont moins de restrictions que dans l'environnement standard (par exemple, votre application ne peut pas écrire sur le disque). Vous trouverez plus de détails sur les principales différences dans la documentation de Google.
Vous pouvez également inclure des paramètres plus détaillés concernant le réseau, les ressources et la mise à l'échelle dans le fichier YAML, tels que le nombre minimum d'instances données à votre service ou le nombre de CPU, par exemple. Vous pouvez également définir des variables d'environnement dans ce fichier pour les rendre accessibles à votre application.
- Exécutez la commande suivante (cela peut prendre plusieurs minutes) :
- Une fois la commande de déploiement effectuée, l'application sera disponible sur App Engine et vous trouverez son URL dédiée directement sur GCP.
Si vous souhaitez sécuriser votre application et donner un accès restreint à certaines personnes, allez dans votre projet GCP, dans la section “IAM & Admin” / “Identity-Aware Proxy” :
- Dans “All Web Services”, vous devriez voir une section “App Engine app”. Si l'IAP est désactivé, activez-le et cliquez sur votre service Streamlit.

Sections du PEI pour gérer les autorisations
- A droite, cliquez sur “Ajouter un membre”, entrez toutes les adresses email que vous souhaitez (ou un alias lié à une liste de diffusion) et sélectionnez le rôle “IAP-secured Web App User”.
Et vous avez terminé. Votre application est maintenant déployée et sécurisée.
Conseils si vous avez des problèmes avec l'affichage des images dans votre application déployée
Lorsque vous utilisez st.pyplot() ou st.image(), vous pouvez rencontrer des problèmes d'affichage lorsque vous regardez votre application déployée (i.e. “0” affiché à la place de votre graphique ou image). Nous vous recommandons d'utiliser st.plotly_chart() chaque fois que vous le pouvez pour éviter cela et d'utiliser des extraits de code HTML dans le cas contraire. Par exemple, dans notre cas, nous voulions afficher quelques wordclouds et cela ne pouvait pas être fait avec Plotly. Nous avons donc décidé de sauvegarder l'image wordcloud au format PNG dans un godet GCS dédié, de la télécharger en tant qu'octets et de l'afficher avec un peu de code HTML comme ceci :
st.markdown(
f"""
""",
unsafe_allow_html=True
)
st.markdown("")
st.markdown("")
Dans cet exemple, la variable “image” est un objet bytes provenant de la méthode .dowload_as_bytes() du paquet python Google cloud storage.
Conclusion
L'objectif de cet article était de vous donner quelques conseils et exemples de services cloud qui peuvent être utilisés pour déployer des applications Streamlit. D'après notre expérience, si vous avez besoin d'une couche de sécurité pour garantir un accès limité à certaines personnes, App Engine sera la solution appropriée. Sinon, Cloud Run reste un moyen facile de déployer une application Streamlit.
Crédits : Paul Devienne, Amale El Hamri

BLOG






