Compartir a través de


Ejemplo: Uso de las bibliotecas de Azure para crear e implementar una aplicación web

En este ejemplo se muestra cómo usar las bibliotecas de administración del SDK de Azure en un script de Python para crear e implementar una aplicación web en Azure App Service, con el código de la aplicación extraído de un repositorio de GitHub.

El SDK de Azure para Python incluye bibliotecas de administración (espacios de nombres que comienzan con azure-mgmt) que permiten automatizar la configuración y la implementación de recursos, de forma similar a lo que puede hacer con el portal de Azure, la CLI de Azure o las plantillas de ARM. Para obtener ejemplos, consulte Inicio rápido: Implementación de una aplicación web de Python (Django o Flask) en Azure App Service.

1: Configuración del entorno de desarrollo local

Si aún no lo ha hecho, configure un entorno en el que pueda ejecutar este código. Estas son algunas opciones:

  • Configure un entorno virtual de Python mediante venv o la herramienta que prefiera. Para empezar a usar el entorno virtual, asegúrese de activarlo. Para instalar Python, consulte Instalación de Python.

    #!/bin/bash
    # Create a virtual environment
    python -m venv .venv
    # Activate the virtual environment
    source .venv/Scripts/activate # only required for Windows (Git Bash)
    
  • Usa un entorno conda . Para instalar Conda, consulte Instalación de Miniconda.

  • Usa un contenedor de desarrollo en Visual Studio Code o en GitHub Codespaces .

2: Instalación de los paquetes de biblioteca de Azure necesarios

Cree un archivo denominado requirements.txt con el siguiente contenido:

azure-mgmt-resource
azure-mgmt-web
azure-identity

En el entorno de desarrollo local, instale los requisitos mediante el código siguiente:

pip install -r requirements.txt

3: Bifurcar el repositorio de ejemplo

  1. Visite https://github.com/Azure-Samples/python-docs-hello-world y haga un fork del repositorio en su cuenta de GitHub. El uso de una bifurcación garantiza que dispone de los permisos necesarios para implementar la aplicación en Azure.

    Crear un fork del repositorio de ejemplo en GitHub

  2. A continuación, cree una variable de entorno denominada REPO_URL y establézcala en la dirección URL del repositorio bifurcada. El código de ejemplo de la sección siguiente requiere esta variable.

export REPO_URL=<url_of_your_fork>
export AZURE_SUBSCRIPTION_ID=<subscription_id>

4: Escribir código para crear e implementar una aplicación web

Cree un archivo de Python denominado provision_deploy_web_app.py y agregue el código siguiente. Los comentarios en línea explican lo que hace cada parte del script. Las REPO_URL variables de entorno y AZURE_SUBSCRIPTION_ID ya deben establecerse en el paso anterior.

import random, os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.web import WebSiteManagementClient

# Acquire a credential object using CLI-based authentication.
credential = AzureCliCredential()

# Retrieve subscription ID from environment variable
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

# Constants we need in multiple places: the resource group name and the region
# in which we provision resources. You can change these values however you want.
RESOURCE_GROUP_NAME = 'PythonAzureExample-WebApp-rg'
LOCATION = "centralus"

# Step 1: Provision the resource group.
resource_client = ResourceManagementClient(credential, subscription_id)

rg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME,
    { "location": LOCATION })

print(f"Provisioned resource group {rg_result.name}")

# For details on the previous code, see Example: Provision a resource group
# at https://docs.microsoft.com/azure/developer/python/azure-sdk-example-resource-group


#Step 2: Provision the App Service plan, which defines the underlying VM for the web app.

# Names for the App Service plan and App Service. We use a random number with the
# latter to create a reasonably unique name. If you've already provisioned a
# web app and need to re-run the script, set the WEB_APP_NAME environment 
# variable to that name instead.
SERVICE_PLAN_NAME = 'PythonAzureExample-WebApp-plan'
WEB_APP_NAME = os.environ.get("WEB_APP_NAME", f"PythonAzureExample-WebApp-{random.randint(1,100000):05}")

# Obtain the client object
app_service_client = WebSiteManagementClient(credential, subscription_id)

# Provision the plan; Linux is the default
poller = app_service_client.app_service_plans.begin_create_or_update(RESOURCE_GROUP_NAME,
    SERVICE_PLAN_NAME,
    {
        "location": LOCATION,
        "reserved": True,
        "sku" : {"name" : "B1"}
    }
)

plan_result = poller.result()

print(f"Provisioned App Service plan {plan_result.name}")


# Step 3: With the plan in place, provision the web app itself, which is the process that can host
# whatever code we want to deploy to it.

poller = app_service_client.web_apps.begin_create_or_update(RESOURCE_GROUP_NAME,
    WEB_APP_NAME,
    {
        "location": LOCATION,
        "server_farm_id": plan_result.id,
        "site_config": {
            "linux_fx_version": "python|3.8"
        }
    }
)

web_app_result = poller.result()

print(f"Provisioned web app {web_app_result.name} at {web_app_result.default_host_name}")

# Step 4: deploy code from a GitHub repository. For Python code, App Service on Linux runs
# the code inside a container that makes certain assumptions about the structure of the code.
# For more information, see How to configure Python apps,
# https://docs.microsoft.com/azure/app-service/containers/how-to-configure-python.
#
# The create_or_update_source_control method doesn't provision a web app. It only sets the
# source control configuration for the app. In this case we're simply pointing to
# a GitHub repository.
#
# You can call this method again to change the repo.

REPO_URL = os.environ["REPO_URL"]

poller = app_service_client.web_apps.begin_create_or_update_source_control(RESOURCE_GROUP_NAME,
    WEB_APP_NAME, 
    { 
        "location": "GitHub",
        "repo_url": REPO_URL,
        "branch": "master",
        "is_manual_integration": True
    }
)

sc_result = poller.result()

print(f"Set source control on web app to {sc_result.branch} branch of {sc_result.repo_url}")

# Step 5: Deploy the code using the repository and branch configured in the previous step.
#
# If you push subsequent code changes to the repo and branch, you must call this method again
# or use another Azure tool like the Azure CLI or Azure portal to redeploy. 
# Note: By default, the method returns None.

app_service_client.web_apps.sync_repository(RESOURCE_GROUP_NAME, WEB_APP_NAME)

print(f"Deploy code")

Este código usa la autenticación basada en la CLI (mediante AzureCliCredential) porque muestra las acciones que podría hacer directamente con la CLI de Azure. En ambos casos, usa la misma identidad para la autenticación. En función de su entorno, es posible que tenga que ejecutar az login primero para autenticarse.

Para usar este código en un script de producción (por ejemplo, para automatizar la administración de máquinas virtuales), use DefaultAzureCredential (recomendado) con un método basado en una entidad de servicio, tal como se describe en Autenticación de aplicaciones de Python con servicios de Azure.

5: Ejecutar el script

python provision_deploy_web_app.py

6: Comprobación de la implementación de la aplicación web

Para ver el sitio web implementado, ejecute el siguiente comando:

az webapp browse --name <PythonAzureExample-WebApp-12345> --resource-group PythonAzureExample-WebApp-rg

Reemplace el nombre de la aplicación web (--name) por el valor generado por el script. No es necesario cambiar el nombre del grupo de recursos (--resource-group) a menos que lo haya cambiado en el script. Al abrir el sitio, debería ver "Hello, World!" en el explorador.

Sugerencia

Si no ve la salida esperada, espere unos minutos e inténtelo de nuevo.

Si sigue sin ver el resultado esperado:

  1. Vaya a Azure Portal.
  2. Vaya a Grupos de recursos y busque el grupo de recursos que creó.
  3. Seleccione el grupo de recursos para ver sus recursos. Asegúrese de que incluye tanto un Plan de Servicio de Aplicaciones como un Servicio de Aplicaciones.
  4. Seleccione App Service y, a continuación, vaya al Centro de implementación.
  5. Abra la pestaña registros para comprobar los registros de implementación en busca de errores o actualizaciones de estado.

7: Volver a implementar el código de la aplicación web (opcional)

El script provisiona todos los recursos necesarios para alojar tu aplicación web y configura el origen de implementación para usar tu repositorio bifurcado mediante integración manual. Con la integración manual, debe iniciar manualmente la aplicación web para obtener actualizaciones del repositorio y la rama especificados.

El script usa el método WebSiteManagementClient.web_apps.sync_repository para desencadenar la aplicación web para extraer código del repositorio. Si realiza más cambios en el código, puede volver a implementar mediante una llamada a esta API de nuevo o mediante otras herramientas de Azure, como la CLI de Azure o Azure Portal.

Para volver a implementar el código mediante la CLI de Azure, ejecute el comando az webapp deployment source sync :

az webapp deployment source sync --name <PythonAzureExample-WebApp-12345> --resource-group PythonAzureExample-WebApp-rg

No es necesario cambiar el nombre del grupo de recursos (--resource-group) a menos que lo haya cambiado en el script.

Para implementar el código desde Azure Portal:

  1. Vaya a Azure Portal.
  2. Vaya a Grupos de recursos y busque el grupo de recursos que creó.
  3. Seleccione el nombre del grupo de recursos para ver sus recursos. Asegúrese de que incluye tanto un Plan de Servicio de Aplicaciones como un Servicio de Aplicaciones.
  4. Seleccione App Service y, a continuación, vaya al Centro de implementación.
  5. En el menú superior, seleccione Sincronizar para desencadenar la implementación del código.

8: Limpieza de recursos

az group delete --name PythonAzureExample-WebApp-rg --no-wait

No es necesario cambiar el nombre del grupo de recursos (--resource-group opción) a menos que lo haya cambiado en el script.

Si ya no necesita el grupo de recursos creado en este ejemplo, puede eliminarlo ejecutando el comando az group delete . Aunque los grupos de recursos no incurren en cargos continuos, se recomienda limpiar los recursos no utilizados. Use el --no-wait argumento para devolver inmediatamente el control a la línea de comandos sin esperar a que se complete la eliminación.

También puede eliminar un grupo de recursos mediante programación mediante el ResourceManagementClient.resource_groups.begin_delete método .

Consulte también