Compartir a través de


Compilación e implementación de una aplicación web de Python con Azure Container Apps y PostgreSQL

Este artículo forma parte de un tutorial sobre cómo crear e implementar una aplicación web Python en Azure Container Apps. Container Apps permite implementar aplicaciones contenerizadoras sin necesidad de administrar una infraestructura compleja.

En esta parte del tutorial, aprenderá a contenedorizar e implementar una aplicación web de ejemplo de Python (Django o Flask). En concreto, se crea la imagen del contenedor en la nube y se implementa en Azure Container Apps. Se definen variables de entorno que permiten a la aplicación de contenedor conectarse a una instancia de Azure Database for PostgreSQL - Flexible Server, donde la aplicación de ejemplo almacena los datos.

Este diagrama de servicios resalta los componentes cubiertos en este artículo: creación e implementación de una imagen de contenedor.

Una captura de pantalla de los servicios en el Tutorial - Implementación de una aplicación de Python en Azure Container Apps. La sección resaltada es lo que se cubre en este artículo.

Obtención de la aplicación de ejemplo

Bifurcar y clonar el código de ejemplo a su entorno de desarrollador.

Paso 1. Vaya al repositorio GitHub de la aplicación de ejemplo (Django o Flask) y seleccione Bifurcar.

Siga los pasos para bifurcar el directorio a su cuenta de GitHub. También puede descargar el repositorio de código directamente a su equipo local sin bifurcar o una cuenta de GitHub. Sin embargo, no podrá configurar CI/CD como se discute más adelante en el tutorial.

Paso 2. Use el comando git clone para clonar el repositorio bifurcado en la carpeta python-container:

# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container

# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container

Paso 3. Cambiar directorio.

cd python-container

Construir una imagen de contenedor a partir del código de la aplicación web

Después de seguir estos pasos, tendrá un Azure Container Registry que contiene una imagen de contenedor Docker creada a partir del código de ejemplo.

Los comandos de la CLI de Azure se pueden ejecutar en Azure Cloud Shell o en una estación de trabajo que tenga la CLI de Azure instalada.

Paso 1. Para crear un grupo de recursos, use el comando az group create.

az group create \
--name pythoncontainer-rg \
--location <location>

<location> es uno de los valores de Azure location Name de la salida del comando az account list-locations -o table.

Paso 2. Cree un registro de contenedores con el comando az acr create.

az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled

<registry-name> debe ser único dentro de Azure y contener entre 5 y 50 caracteres alfanuméricos.

Puede ver las credenciales creadas para admin con:

az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg

Paso 3. Inicie sesión en el registro con el comando az acr login.

az acr login --name <registry-name>

El comando añade "azurecr.io" al nombre para crear el nombre de registro completo. Si tiene éxito, verá el mensaje "Inicio de sesión realizado correctamente". Si está accediendo al registro desde una suscripción diferente de aquella en la que se creó el registro, use el conmutador --suffix.

Paso 4. Compile la imagen con el comando az acr build.

az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .

Observe lo siguiente:

  • El punto (".") al final del comando indica la ubicación del código fuente que se va a compilar. Si no está ejecutando este comando en el directorio raíz de la aplicación de ejemplo, especifique la ruta al código.

  • Si ejecuta el comando en Azure Cloud Shell, use primero git clone para extraer el repositorio en el entorno de Cloud Shell y cambie el directorio a la raíz del proyecto para que el punto (".") se interprete correctamente.

  • Si omite la opción -t (igual que --image), el comando pone en cola una compilación de contexto local sin enviarla al registro. Compilar sin enviar puede ser útil para comprobar que la imagen se compila.

Paso 5. Confirme que la imagen del contenedor se compiló con el comando az acr repository list.

az acr repository list --name <registry-name>

Crear una instancia de servidor flexible de PostgreSQL.

La aplicación de ejemplo (Django o Flask) almacena los datos de revisión del restaurante en una base de datos PostgreSQL. En estos pasos, se crea el servidor que contendrá la base de datos.

Los comandos de la CLI de Azure se pueden ejecutar en Azure Cloud Shell o en una estación de trabajo que tenga la CLI de Azure instalada.

Paso 1. Use el comando az postgres flexible-server create para crear el servidor PostgreSQL en Azure. No es raro que este comando se ejecute durante unos minutos para completarse.

az postgres flexible-server create \
   --resource-group pythoncontainer-rg \
   --name <postgres-server-name>  \
   --location <location> \
   --admin-user <admin-username> \
   --admin-password <admin-password> \
   --sku-name Standard_D2s_v3 \
   --public-access 0.0.0.0 
  • "pythoncontainer-rg" → El nombre del grupo de recursos usado en este tutorial. Si ha usado un nombre diferente, cambie este valor.

  • <postgres-server-name> → El nombre del servidor de base de datos PostgreSQL. Este nombre debe ser único en Azure. El punto final del servidor es "https://<postgres-server-name>.postgres.database.azure.com". Los caracteres permitidos son "A"-"Z", "0"-"9" y "-".

  • <location> → Use la misma ubicación que se usa para la aplicación web. <location> es uno de los valores de Azure location Name de la salida del comando az account list-locations -o table.

  • <admin-username> → Nombre de usuario de la cuenta de administrador. No puede ser "azure_superuser", "admin", "administrator", "root", "guest", o "public". Use "demoadmin" para este tutorial.

  • <admin-password> Contraseña del usuario de administrador. Debe contener entre 8 y 128 caracteres de tres de las siguientes categorías: Letras del alfabeto inglés mayúsculas y minúsculas, números y caracteres no alfanuméricos.

    Importante

    Cuando cree nombres de usuario o contraseñas no use el carácter "$". Más adelante creará variables de entorno con estos valores, donde el carácter "$" tiene un significado especial dentro del contenedor de Linux que se usa para ejecutar aplicaciones de Python.

  • <sku-name> → El nombre del nivel de precios y la configuración de computación, por ejemplo "Standard_D2s_v3". Para más información, consulte los precios de Azure Database for PostgreSQL. Para enumerar las SKU disponibles, use az postgres flexible-server list-skus --location <location>.

  • <public-access> → Use "0.0.0.0", que permite el acceso público al servidor desde cualquier servicio Azure, como Container Apps.

Nota:

Si planea trabajar el servidor PostgreSQL desde su estación de trabajo local con herramientas que no sean Azure CLI, necesitará añadir una regla de firewall con el comando az postgres flexible-server firewall-rule create.

Crear una base de datos en el servidor

En este punto, tiene un servidor PostgreSQL. En esta sección, se crea una base de datos en el servidor.

Puede usar el terminal interactivo de PostgreSQL psql en su entorno local, o en Azure Cloud Shell, que también es accesible en el portal de Azure. Cuando se trabaja con psql, a menudo es más fácil usar el Cloud Shell porque todas las dependencias se incluyen para usted en el shell.

Paso 1. Conexión a la base de datos con psql.

psql --host=<postgres-server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=demoadmin@<postgres-server-name> \
     --dbname=postgres

Donde <postgres-server-name> es el nombre del servidor postgreSQL. El comando le pedirá la contraseña de administrador.

Si tiene problemas para conectarse, reinicie la base de datos e inténtelo de nuevo. Si se conecta desde su entorno local, su dirección IP debe añadirse a la lista de reglas del cortafuegos para el servicio de base de datos.

Paso 2. Cree la base de datos.

En el símbolo del sistema postgres=>, escriba:

CREATE DATABASE restaurants_reviews;

El punto y coma (";") al final del comando es necesario. Para comprobar que la base de datos se ha creado correctamente, use el comando \c restaurants_reviews. Escriba \? para mostrar ayuda o \q para salir.

También puede conectarse al servidor flexible Azure PostgreSQL y crear una base de datos usando Azure Data Studio o cualquier otro IDE compatible con PostgreSQL.

Implementación de la aplicación web en Container Apps

Las aplicaciones en contenedores se despliegan en entornos de Container Apps, que actúan como un límite seguro. En los pasos siguientes, creará el entorno, un contenedor dentro del entorno y configurará el contenedor para que el sitio web sea visible externamente.

Paso 1. Inicie sesión en Azure y autentifíquese, si es necesario.

az login

Paso 2. Instale o actualice la extensión para Azure Container Apps con el comando az extension add.

az extension add --name containerapp --upgrade

Paso 3. Cree un entorno de Container Apps con el comando az containerapp env create.

az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>

<location> es uno de los valores de Azure location Name de la salida del comando az account list-locations -o table.

Paso 4. Obtenga las credenciales de inicio de sesión para Azure Container Registry.

az acr credential show -n <registry-name>

Use el nombre de usuario y una de las contraseñas devueltas por el comando.

Paso 5. Crea una aplicación contenedora en el entorno con el comando az containerapp create.

az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn

<env-variable-string> es una cadena compuesta por valores separados por espacios en el formato key="value" con los siguientes valores.

  • AZURE_POSTGRESQL_HOST=<postgres-server-name>.postgres.database.azure.com
  • AZURE_POSTGRESQL_DATABASE=restaurants_reviews
  • AZURE_POSTGRESQL_USERNAME=demoadmin
  • AZURE_POSTGRESQL_PASSWORD=<db-password>
  • RUNNING_IN_PRODUCTION=1
  • AZURE_SECRET_KEY=<YOUR-SECRET-KEY>

Genere el valor AZURE_SECRET_KEY usando la salida de python -c 'import secrets; print(secrets.token_hex())'.

Por ejemplo: --env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf.

Paso 7. Solo para Django, migre y cree esquema de base de datos. (En la app de ejemplo Flask, se hace automáticamente, y puede saltarse este paso).

Conéctese con el comando az containerapp exec:

az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg

A continuación, en la línea de comandos del shell, escriba python manage.py migrate.

No es necesario migrar para las revisiones del contenedor.

Paso 8. Pruebe el sitio web.

El comando az containerapp create que ha introducido anteriormente genera una URL de aplicación que puede usar para navegar hasta la aplicación. La URL termina en "azurecontainerapps.io". Navegue hasta la URL en un navegador. También puede usar el comando az containerapp browse.

A continuación se muestra un ejemplo del sitio web de muestra después de añadir un restaurante y dos reseñas.

Captura de pantalla mostrando un ejemplo del sitio web de muestra construido en este tutorial.

Solución de problemas de implementación

  • Ha olvidado la Url de la aplicación para acceder al sitio web.

    • En el portal Azure, vaya a la página Información General de la Container App y busque la URL de la aplicación.
    • En VS Code, vaya a la vista Azure (Ctrl+Shift+A) y expanda la suscripción en la que está trabajando. Expanda el nodo Container Apps, luego expanda el entorno administrado y haga clic con el botón derecho en python-container-app y selecciona Navegar. Se abrirá el explorador con la URL de la aplicación.
    • Con la CLI de Azure use el comando az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.
  • En VS Code, la tarea Compilar imagen in Azure devuelve un error.

    • Si ve el mensaje "Error: no se pudo descargar el contexto. Compruebe si la dirección URL es incorrecta" en la ventana de Salida de VS Code, entonces actualice el registro en la extensión Docker. Para actualizar, seleccione la extensión Docker, vaya a la sección Registros, busque el registro y selecciónelo.
    • Si vuelve a ejecutar la tarea Compilar imagen en Azure, compruebe si existe el registro de una ejecución anterior y, si es así, úselo.
  • En el portal Azure durante la creación de una Container App, aparece un error de acceso que contiene "No se puede acceder a ACR '<name>.azurecr.io'".

    • Este error se produce cuando las credenciales de administrador en el ACR están deshabilitadas. Para comprobar el estado del administrador en el portal, vaya a su Azure Container Registry, seleccione el recurso Claves de acceso y asegúrese de que el usuario administrador está habilitado.
  • Su imagen de contenedor no aparece en Azure Container Registry.

    • Compruebe la salida del comando CLI de Azure o salida de VS Code y busque mensajes que se ha realizado correctamente.
    • Compruebe que el nombre del registro se ha especificado correctamente en el comando de compilación con la CLI de Azure o en los mensajes de tarea de VS Code.
    • Asegúrese de que sus credenciales no hayan caducado. Por ejemplo, en VS Code, busque el registro de destino en la extensión de Docker y actualícelo. En el CLI de Azure, ejecute az login.
  • El sitio web devuelve "Solicitud incorrecta (400)".

    • Compruebe las variables de entorno PostgreSQL pasadas al contenedor. El error 400 a menudo indica que el código Python no puede conectarse a la instancia PostgreSQL.
    • El código de ejemplo usado en este tutorial comprueba la existencia de la variable de entorno del contenedor RUNNING_IN_PRODUCTION, que se puede establecer a cualquier valor como "1".
  • El sitio web devuelve "No encontrado (404)".

    • Compruebe la Url de la aplicación en la página de Información general del contenedor. Si la Url de la aplicación contiene la palabra "internal", entonces la entrada no está configurada correctamente.
    • Compruebe la entrada del contenedor. Por ejemplo, en el portal Azure, vaya al recurso Entrada del contenedor y asegúrese de que la Entrada HTTP está activado y que la opción Aceptar tráfico desde cualquier lugar está seleccionada.
  • El sitio web no se inicia, aparece "tiempo de espera de transmisión" o no se devuelve nada.

    • Compruebe los registros.
      • En el portal de Azure, vaya al recurso de gestión de aprovisionamiento de la aplicación de contenedor y compruebe el Estado de aprovisionamiento del contenedor.
        • Si es "Aprovisionamiento", espere a que se complete el aprovisionamiento.
        • Si es "Fallido", seleccione la revisión y vea los registros de la consola. Elija el orden de las columnas para mostrar "Hora generada", "Stream_s", and "Log_s". Ordene los registros primero por los más recientes y busque los mensajes stderr y stdout de Python en la columna "Stream_s". La salida 'print' de Python serán mensajes stdout.
      • Con la CLI de Azure, usE el comando az containerapp logs show.
    • Si usa el framework Django, comprueba si las tablas restaurants_reviews existen en la base de datos. Si no es así, use una consola para acceder al contenedor y ejecute python manage.py migrate.

Paso siguiente