Desplegar una aplicación con Streamlit en Azure App Service

Si tú también te has enamorado de Streamlit para mostrar tus datos de forma rápida en formato web, hoy quiero compartir contigo cómo puedes desplegar una aplicación desarrollada con este framework en Azure App Service.

Aplicación de ejemplo

Para mostrártelo con un ejemplo, voy a desplegar esta aplicación con Streamlit:

import streamlit as st
import pandas as pd
# Title
st.title('Streamlit on Azure App Service 🥳')
# Create some mock data
df = pd.DataFrame({
    'first column': [1, 2, 3, 4],
    'second column': [10, 20, 30, 40]
})
# Create a table
st.table(df)

Es importante que esta lleve consigo el archivo requirements.txt, en el root del proyecto, para que durante el despliegue Azure App Service lo tenga en cuenta e instale los módulos que necesites. Para este ejemplo este archivo contiene lo siguiente:

streamlit
pandas

Crear una instancia de Azure App Service

Ahora que ya tienes algo para desplegar, lo siguiente que necesitas es crear el App Service Plan y la web app donde vivirá:

# Variables
RESOURCE_GROUP="streamlit-on-azure"
LOCATION="westeurope"
APP_SVC_PLAN="streamlitplan"
WEB_APP_NAME="streamlitonazure"
# Login
az login
# Create resource group
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
# Create App Service Plan
az appservice plan create \
--name $APP_SVC_PLAN \
--resource-group $RESOURCE_GROUP \
--is-linux \
--sku S1
# Create Web App
az webapp create \
--resource-group $RESOURCE_GROUP \
--plan $APP_SVC_PLAN \
--name $WEB_APP_NAME \
--runtime "PYTHON|3.10"

Desplegar la aplicación en Streamlit en App Service

En el caso de App Service, para que esta se ejecute correctamente debemos acompañar la misma de un archivo de arranque, el cual he llamado startup.sh, como el siguiente:

python -m streamlit run app.py --server.port 8000 --server.address 0.0.0.0

Para que mi App Service lo tenga en cuenta, debo indicarlo en la configuración del mismo:

az webapp config set \
--resource-group $RESOURCE_GROUP \
--name $WEB_APP_NAME \
--startup-file startup.sh

Por otro lado, también tengo que decirle que durante el despliegue se quiere hacer la build para que instale todos los módulos que aparecen en el archivo requirements.txt

# set SCM_DO_BUILD_DURING_DEPLOYMENT to true
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $WEB_APP_NAME \
--settings SCM_DO_BUILD_DURING_DEPLOYMENT=true

Para este ejemplo voy a hacer el despliegue a través de Azure CLI, pero te recomiendo que integres el mismo en la herramienta que utilices para tu despliegue continuo:

# Zip only the files needed
zip -r app.zip app.py requirements.txt startup.sh
# Deploy zip
az webapp deploy \
--resource-group $RESOURCE_GROUP \
--name $WEB_APP_NAME \
--type zip \
--src-path app.zip \
--verbose --async true

Este proceso puede durar unos instantes hasta que se complete. Una vez finalizado puedes lanzar este otro comando para ver el resultado:

az webapp browse \
--resource-group $RESOURCE_GROUP \
--name $WEB_APP_NAME

Y ahí tienes tu aplicación con Streamlit up & running en Azure 🥳

El código de ejemplo, y todos los pasos, los tienes en este repo en GitHub.

¡Saludos!