Share via


Beispiel: Verwenden der Azure-Bibliotheken zum Erstellen und Bereitstellen einer Web-App

In diesem Beispiel wird veranschaulicht, wie Sie die Azure SDK-Verwaltungsbibliotheken in einem Python-Skript verwenden, um eine Web-App für Azure-App Dienst zu erstellen und bereitzustellen. Der App-Code wird aus einem GitHub-Repository bereitgestellt.

Mit den Verwaltungsbibliotheken (die Namenspaces beginnen mit azure-mgmt, z. B. azure-mgmt-web) können Sie Konfigurations- und Bereitstellungsprogramme schreiben, um dieselben Aufgaben auszuführen, zu denen Sie auch das Azure-Portal, die Azure CLI oder andere Tools zur Verwaltung von Ressourcen nutzen können. Beispiele finden Sie in der Schnellstartanleitung: Bereitstellen einer Python-Web-App (Django oder Flask) für Azure-App Service. (Äquivalente Azure CLI-Befehle finden Sie weiter unten in diesem Artikel.)

Alle Befehle in diesem Artikel funktionieren in Linux-/macOS-Bash- und Windows-Befehlsshells identisch, sofern nicht anders angegeben.

1: Einrichten Ihrer lokalen Entwicklungsumgebung

Falls noch nicht geschehen, richten Sie eine Umgebung ein, in der Sie diesen Code ausführen können. Hier einige Optionen:

2: Installieren der erforderlichen Azure-Bibliothekspakete

Erstellen Sie eine Datei namens requirements.txt mit folgendem Inhalt:

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

Installieren Sie in einem Terminal oder einer Eingabeaufforderung bei aktivierter virtueller Umgebung die Voraussetzungen:

pip install -r requirements.txt

3: Verzweigung des Beispiel-Repositorys

Besuchen Sie https://github.com/Azure-Samples/python-docs-hello-world, und forken Sie das Repository in Ihr eigenes GitHub-Konto. Sie verwenden eine Verzweigung, um sicherzustellen, dass Sie über Berechtigungen zum Bereitstellen des Repositorys für Azure verfügen.

Forking the sample repository on GitHub

Erstellen Sie dann eine Umgebungsvariable namens REPO_URL mit der URL Ihrer Fork. Der Beispielcode im nächsten Abschnitt hängt von dieser Umgebungsvariablen ab:

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

4: Schreiben von Code zum Erstellen und Bereitstellen einer Web-App

Erstellen Sie eine Python-Datei mit dem Namen provision_deploy_web_app.py und dem folgenden Code. In den Kommentaren werden die Details des Codes erläutert. Definieren Sie vor dem Ausführen des Skripts unbedingt die REPO_URL Variablen und AZURE_SUBSCRIPTION_ID Umgebungsvariablen.

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")

Dieser Code verwendet die CLI-basierte Authentifizierung (AzureCliCredential), da er Aktionen veranschaulicht, die Sie andernfalls direkt mit der Azure CLI ausführen würden. In beiden Fällen verwenden Sie dieselbe Identität für die Authentifizierung. Je nach Ihrer Umgebung müssen Sie möglicherweise zuerst zur Authentifizierung ausgeführt az login werden.

Um diesen Code in einem Produktionsskript (z. B. zum Automatisieren der VM-Verwaltung) zu verwenden, verwenden DefaultAzureCredential Sie (empfohlen) mit einer Dienstprinzipalmethode, wie unter "Authentifizieren von Python-Apps mit Azure-Diensten" beschrieben.

5: Ausführen des Skripts

python provision_deploy_web_app.py

6: Überprüfen der Web-App-Bereitstellung

Besuchen Sie die bereitgestellte Website, indem Sie den folgenden Befehl ausführen:

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

Ersetzen Sie den Web-App-Namen (--name Option) und den Ressourcengruppennamen (--resource-group Option) durch die Werte, die Sie im Skript verwendet haben. Im Browser sollte "Hello, World!" angezeigt werden.

Wenn die erwartete Ausgabe nicht angezeigt wird, warten Sie einige Minuten, und versuchen Sie es erneut.

Wenn die erwartete Ausgabe weiterhin nicht angezeigt wird, dann:

  1. Öffnen Sie das Azure-Portal.
  2. Wählen Sie "Ressourcengruppen" aus, und suchen Sie die von Ihnen erstellte Ressourcengruppe.
  3. Wählen Sie den Namen der Ressourcengruppe aus, um die darin enthaltenen Ressourcen anzuzeigen. Überprüfen Sie insbesondere, ob ein App-Dienstplan und der App-Dienst vorhanden sind.
  4. Wählen Sie den App-Dienst und dann das Bereitstellungscenter aus.
  5. Wählen Sie die Registerkarte "Protokolle " aus, um Bereitstellungsprotokolle anzuzeigen.

7: Erneutes Bereitstellen des Web-App-Codes (optional)

Das Skript richtet die Ressourcen ein, die zum Hosten Ihrer Web-App erforderlich sind, und legt die Bereitstellungsquelle mithilfe der manuellen Integration auf Ihre Verzweigung fest. Mit der manuellen Integration müssen Sie die Web-App auslösen, um aus dem konfigurierten Repository und der Verzweigung abzurufen.

Das Skript ruft die WebSiteManagementClient.web_apps.sync_repository-Methode auf, um einen Pull aus der Web-App auszulösen. Wenn Sie nachfolgende Codeänderungen an Ihr Repository übertragen, können Sie Ihren Code erneut bereitstellen, indem Sie diese API aufrufen oder andere Azure-Tools wie azure CLI oder Azure-Portal verwenden.

Sie können Ihren Code mit der Azure CLI bereitstellen, indem Sie den Az webapp-Bereitstellungsquellensynchronisierungsbefehl ausführen:

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

Ersetzen Sie den Web-App-Namen (--name Option) und den Ressourcengruppennamen (--resource-group Option) durch die Werte, die Sie im Skript verwendet haben.

So stellen Sie Ihren Code aus Azure-Portal bereit:

  1. Öffnen Sie das Azure-Portal.
  2. Wählen Sie "Ressourcengruppen" aus, und suchen Sie die von Ihnen erstellte Ressourcengruppe.
  3. Wählen Sie den Namen der Ressourcengruppe aus, um die darin enthaltenen Ressourcen anzuzeigen. Überprüfen Sie insbesondere, ob ein App-Dienstplan und der App-Dienst vorhanden sind.
  4. Wählen Sie den App-Dienst und dann das Bereitstellungscenter aus.
  5. Wählen Sie im oberen Menü " Synchronisieren" aus, um Ihren Code bereitzustellen.

8: Bereinigen von Ressourcen

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

Führen Sie den Befehl "az group delete " aus, wenn Sie die in diesem Beispiel erstellte Ressourcengruppe nicht beibehalten müssen. Ressourcengruppen verursachen keine laufenden Gebühren in Ihrem Abonnement, aber es ist eine bewährte Methode, alle Gruppen zu bereinigen, die Sie nicht aktiv verwenden. Das Argument --no-wait ermöglicht die direkte Rückgabe des Befehls, und es muss nicht auf den Abschluss des Vorgangs gewartet werden.

Sie können auch die ResourceManagementClient.resource_groups.begin_delete-Methode verwenden, um eine Ressourcengruppe aus dem Code zu löschen.

Zur Referenz: äquivalente Azure CLI-Befehle

Die folgenden Azure CLI-Befehle führen dieselben Bereitstellungsschritte wie das Python-Skript aus:

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

Siehe auch