Share via


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 incluir e implementar una aplicación web de Python en Azure Container Apps. Container Apps permite implementar aplicaciones en contenedor sin administrar infraestructura compleja.

En esta parte del tutorial, aprenderá a incluir en contenedores e implementar una aplicación web de ejemplo de Python (Django o Flask). En concreto, compilará la imagen de contenedor en la nube e implementarla en Azure Container Apps. Las variables de entorno que permiten que la aplicación contenedora se conecte a una instancia de Servidor flexible de Azure Database for PostgreSQL, donde la aplicación de ejemplo almacena los datos.

En este diagrama de servicio se resaltan los componentes descritos en este artículo: compilar e implementar una imagen de contenedor.

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

Obtención de la aplicación de ejemplo

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

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

Siga los pasos para bifurcar el directorio en la cuenta de GitHub. También puede descargar el repositorio de código directamente en la máquina local sin bifurcar ni una cuenta de GitHub, pero no podrá configurar CI/CD descrito 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. Cambie el directorio.

cd python-container

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

Después de seguir estos pasos, tendrá una instancia de Azure Container Registry que contiene una imagen de contenedor de Docker compilada 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 nombre de ubicación de Azure de la salida del comando az account list-locations -o table.

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

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

<El nombre> del registro debe ser único en Azure y contener 5-50 caracteres alfanuméricos.

Puede ver las credenciales creadas para el administrador con:

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

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

az acr login --name <registry-name>

El comando agrega "azurecr.io" al nombre para crear el nombre completo del Registro. Si se ejecuta correctamente, verá el mensaje "Login Succeeded". Si va a acceder al registro desde una suscripción diferente de la que se creó, use el --suffix modificador .

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 ejecuta este comando en el directorio raíz de la aplicación de ejemplo, especifique la ruta de acceso al código.

  • Si ejecuta el comando en Azure Cloud Shell, use git clone para extraer primero 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 deja fuera la -t opción (igual --imageque ) , el comando pone en cola una compilación de contexto local sin insertarla en el registro. Compilar sin insertar puede ser útil para comprobar que la imagen se compila.

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

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

Creación de 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, creará 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 usó un nombre diferente, cambie este valor.

  • <postgres-server-name> → el nombre del servidor de base de datos postgreSQL. Este nombre debe ser único en todas las instancias de Azure. El punto de conexión 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 nombre de ubicación de Azure de la salida del comando az account list-locations -o table.

  • <admin-username> → Nombre de usuario para 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

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

  • <sku-name> → El nombre del plan de tarifa y la configuración de proceso, 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 de Azure, como Container Apps.

Nota:

Si planea trabajar el servidor PostgreSQL desde la estación de trabajo local con herramientas distintas de la CLI de Azure, deberá agregar una regla de firewall con el comando az postgres flexible-server firewall-rule create .

Creación de una base de datos en el servidor

En este momento, tiene un servidor PostgreSQL. En esta sección, creará una base de datos en el servidor.

Puede usar el terminal interactivo de PostgreSQL psql en el entorno local o en Azure Cloud Shell, que también es accesible en Azure Portal. Al trabajar con psql, a menudo es más fácil usar Cloud Shell porque todas las dependencias se incluyen automáticamente en el shell.

Paso 1. Conectar 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 el entorno local, la dirección IP debe agregarse a la lista de reglas de firewall para el servicio de base de datos.

Paso 2. Cree la base de datos.

En el tipo de postgres=> mensaje:

CREATE DATABASE restaurants_reviews;

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

También puede conectarse al servidor flexible de Azure PostgreSQL y crear una base de datos mediante Azure Data Studio o cualquier otro IDE que admita PostgreSQL.

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

Las aplicaciones de contenedor se implementan en entornos de Container Apps, que actúan como límites seguros. 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 autentí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 nombre de ubicación de Azure de la salida del comando az account list-locations -o table.

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

az acr credential show -n <registry-name>

Use el nombre de usuario y una de las contraseñas devueltas de la salida del comando.

Paso 5. Cree 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 valores siguientes.

  • 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 AZURE_SECRET_KEY el valor mediante la salida de python -c 'import secrets; print(secrets.token_hex())'.

Este es un 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 un esquema de base de datos. (En la aplicación de ejemplo de Flask, se realiza automáticamente y puede omitir este paso).

Conectar con el comando az containerapp exec:

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

A continuación, en el símbolo del sistema del shell, escriba python manage.py migrate.

No es necesario migrar para las revisiones del contenedor.

Paso 8. Pruebe el sitio web.

El az containerapp create comando que escribió anteriormente genera una dirección URL de aplicación que puede usar para ir a la aplicación. La dirección URL termina en "azurecontainerapps.io". Vaya a la dirección URL en un explorador. Como alternativa, puede usar el comando az containerapp browse .

Este es un ejemplo del sitio web de ejemplo después de agregar un restaurante y dos revisiones.

Screenshot showing an example of the sample website built in this tutorial.

Solución de problemas de implementación

  • Olvidó la dirección URL de la aplicación para acceder al sitio web.

    • En Azure Portal, vaya a la página Información general de la aplicación contenedora y busque la dirección URL de la aplicación.
    • En VS Code, vaya a la extensión de Azure y seleccione la sección Aplicaciones de contenedor. Expanda la suscripción, expanda el entorno de contenedor y, cuando encuentre la aplicación contenedora, haga clic con el botón derecho en python-container-app y seleccione Examinar.
    • 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 en 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 Salida de VS Code y, a continuación, actualice el registro en la extensión de Docker. Para actualizarlo, seleccione la extensión de 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 el registro de una ejecución anterior existe y, si es así, úselo.
  • En Azure Portal durante la creación de una aplicación contenedora, verá un error de acceso que contiene "No se puede acceder a ACR '<name.azurecr.io>'".

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

    • Compruebe la salida del comando de la CLI de Azure o la salida de VS Code y busque mensajes para confirmar que se ha realizado correctamente.
    • Compruebe que el nombre del registro se especificó correctamente en el comando de compilación con la CLI de Azure o en las indicaciones de la tarea de VS Code.
    • Asegúrese de que las credenciales no han expirado. Por ejemplo, en VS Code, busque el registro de destino en la extensión de Docker y actualice. En la CLI de Azure, ejecute az login.
  • El sitio web devuelve "Solicitud incorrecta (400)".

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

    • Compruebe la dirección URL de la aplicación en la página Información general del contenedor. Si la dirección URL de la aplicación contiene la palabra "internal", la entrada no se establece correctamente.
    • Compruebe la entrada del contenedor. Por ejemplo, en Azure Portal, vaya al recurso Entrada del contenedor y asegúrese de que la entrada HTTP está habilitada y de que está seleccionado Aceptar tráfico desde cualquier lugar.
  • El sitio web no se inicia, ve "tiempo de espera de transmisión" o no se devuelve nada.

    • Compruebe los registros.
      • En Azure Portal, vaya al recurso Administración de revisiones de la aplicación contenedora y compruebe el estado de aprovisionamiento del contenedor.
        • Si es "Aprovisionamiento", espere hasta que se haya completado el aprovisionamiento.
        • Si se ha producido un error, seleccione la revisión y vea los registros de la consola. Elija el orden de las columnas para mostrar "Time Generated", "Stream_s" y "Log_s". Ordene los registros por primera vez más reciente y busque los mensajes stderr y stdout de Python en la columna "Stream_s". La salida "print" de Python será mensajes stdout .
      • Con la CLI de Azure, use el comando az containerapp logs show .
    • Si usa el marco de Django, compruebe si las tablas de restaurants_reviews existen en la base de datos. Si no es así, use una consola para acceder al contenedor y ejecutar python manage.py migrate.

Paso siguiente