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 de Azure SDK en un script de Python para crear e implementar una aplicación web en App de Azure Service. El código de la aplicación se implementa desde un repositorio de GitHub.

Con las bibliotecas de administración (los espacios de nombres que empiezan por azure-mgmt, como por ejemplo, azure-mgmt-web), puede escribir programas de configuración e implementación para llevar a cabo las mismas tareas que puede realizar mediante Azure Portal, la CLI de Azure u otras herramientas de administración de recursos. Para obtener ejemplos, consulte Inicio rápido: Implementación de una aplicación web de Python (Django o Flask) en App de Azure Service. (Más adelante en este artículo se proporcionan los comandos equivalentes de la CLI de Azure).

Todos los comandos de este artículo funcionan igual en el bash de Linux o macOS y en los shells de comandos de Windows, a menos que se indique lo contrario.

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:

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

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

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

En un terminal o símbolo del sistema con el entorno virtual activado, instale los requisitos:

pip install -r requirements.txt

3: Bifurcar el repositorio de ejemplo

Visite https://github.com/Azure-Samples/python-docs-hello-world y bifurque el repositorio en su propia cuenta de GitHub. Usará una bifurcación para asegurarse de que tiene permisos para implementar el repositorio en Azure.

Forking the sample repository on GitHub

A continuación, cree una variable de entorno llamada REPO_URL con la dirección URL de la bifurcación. El ejemplo de código de la siguiente sección depende de esta variable de entorno:

set REPO_URL=<url_of_your_fork>
set AZURE_SUBSCRIPTION_ID=<subscription_id>

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

Cree un archivo de Python llamado provision_deploy_web_app.py con el siguiente código. Los comentarios explican los detalles del código. Asegúrese de definir las REPO_URL variables de entorno y AZURE_SUBSCRIPTION_ID antes de ejecutar el script.

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 (con AzureCliCredential), ya que muestra las acciones que, de otro modo, podría realizar 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 ejecutarse 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

Ejecute el comando siguiente para visitar el sitio web implementado:

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

Reemplace el nombre de la aplicación web (--name opción) y el nombre del grupo de recursos (--resource-group opción) por los valores que usó en el script. Debería ver "Hello, World!" en el explorador.

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

Si sigue sin ver la salida esperada, haga lo siguiente:

  1. Vaya a Azure Portal.
  2. Seleccione Grupos de recursos y busque el grupo de recursos que ha creado.
  3. Seleccione el nombre del grupo de recursos para ver los recursos que contiene. En concreto, compruebe que hay un plan de App Service y app Service.
  4. Seleccione App Service y, a continuación, seleccione Centro de implementación.
  5. Seleccione la pestaña registros para ver los registros de implementación.

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

El script configura los recursos necesarios para hospedar la aplicación web y establece el origen de implementación en la bifurcación mediante la integración manual. Con la integración manual, debe desencadenar la aplicación web para extraer del repositorio y la rama configurados.

El script llama al método WebSiteManagementClient.web_apps.sync_repository para desencadenar una extracción de la aplicación web. Si inserta cambios de código posteriores en el repositorio, puede volver a implementar el código invocando esta API o mediante otras herramientas de Azure, como la CLI de Azure o Azure Portal.

Para implementar el código con 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

Reemplace el nombre de la aplicación web (--name opción) y el nombre del grupo de recursos (--resource-group opción) por los valores que usó en el script.

Para implementar el código desde Azure Portal:

  1. Vaya a Azure Portal.
  2. Seleccione Grupos de recursos y busque el grupo de recursos que ha creado.
  3. Seleccione el nombre del grupo de recursos para ver los recursos que contiene. En concreto, compruebe que hay un plan de App Service y app Service.
  4. Seleccione App Service y, a continuación, seleccione Centro de implementación.
  5. En el menú superior, seleccione Sincronizar para implementar el código.

8: Limpieza de recursos

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

Ejecute el comando az group delete si no es necesario mantener el grupo de recursos creado en este ejemplo. Los grupos de recursos no acarrean cargos continuos en su suscripción, pero es recomendable limpiar cualquier grupo que no vaya a usar activamente. El argumento --no-wait permite que el comando devuelva el control inmediatamente en lugar de esperar a que finalice la operación.

También puede usar el método ResourceManagementClient.resource_groups.begin_delete para eliminar un grupo de recursos del código.

Como referencia: comandos equivalentes de la CLI de Azure

Los siguientes comandos de la CLI de Azure realizan los mismos pasos de aprovisionamiento que el script de Python:

rem Replace <your_github_user_name> with the account name of the fork.

set repoUrl=https://github.com/<your_github_user_name>/python-docs-hello-world
set appName=PythonAzureExample-WebApp-%random%

az group create -l centralus -n PythonAzureExample-WebApp-rg

az appservice plan create -n PythonAzureExample-WebApp-plan -g PythonAzureExample-WebApp-rg ^
     --is-linux --sku F1

echo Creating app: %appName%

az webapp create -g PythonAzureExample-WebApp-rg -n %appName% ^
    --plan PythonAzureExample-WebApp-plan --runtime "python|3.8"

rem You can use --deployment-source-url with the first create command. It is shown here
rem to match the sequence of the Python code.

az webapp create -n %appName% -g PythonAzureExample-WebApp-rg ^
    --plan PythonAzureExample-WebApp-plan --runtime "python|3.8" ^
    --deployment-source-url %repoUrl% 

rem The previous command sets up External Git deployment from the specified repository. This 
rem command triggers a pull from the repository.

az webapp deployment source sync --name %appName% --resource-group PythonAzureExample-WebApp-rg

Consulte también