Dela via


Exempel: Använd Azure-biblioteken för att skapa och distribuera en webbapp

Det här exemplet visar hur du använder Azure SDK-hanteringsbiblioteken i ett Python-skript för att skapa och distribuera en webbapp till Azure App Service, där appkoden hämtas från en GitHub-lagringsplats.

Azure SDK för Python innehåller hanteringsbibliotek (namnrymder som börjar med azure-mgmt) som gör att du kan automatisera resurskonfiguration och distribution – ungefär som du kan göra med Azure-portalen, Azure CLI eller ARM-mallar. Exempel finns i Snabbstart: Distribuera en Python-webbapp (Django eller Flask) till Azure App Service.

1: Konfigurera din lokala utvecklingsmiljö

Om du inte redan har gjort det konfigurerar du en miljö där du kan köra den här koden. Här är några alternativ:

  • Konfigurera en virtuell Python-miljö med hjälp av venv eller valfritt verktyg. Om du vill börja använda den virtuella miljön måste du aktivera den. Information om hur du installerar Python finns i Installera 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)
    
  • Använd en conda-miljö. Information om hur du installerar Conda finns i Installera Miniconda.

  • Använd en Dev Container i Visual Studio Code eller GitHub Codespaces.

2: Installera nödvändiga Azure-bibliotekspaket

Skapa en fil med namnet requirements.txt med följande innehåll:

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

I din lokala utvecklingsmiljö installerar du kraven med hjälp av följande kod:

pip install -r requirements.txt

3: Skapa en förgrening av exempel-repositoryt

  1. Besök https://github.com/Azure-Samples/python-docs-hello-world och förgrena lagringsplatsen till ditt eget GitHub-konto. Genom att använda en förgrening ser du till att du har de behörigheter som krävs för att distribuera appen till Azure.

    Förgrena exempellagringsplatsen på GitHub

  2. Skapa sedan en miljövariabel med namnet REPO_URL och ange den till URL:en för din förgrenade lagringsplats. Den här variabeln krävs av exempelkoden i nästa avsnitt.

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

4: Skriva kod för att skapa och distribuera en webbapp

Skapa en Python-fil med namnet provision_deploy_web_app.py och lägg till följande kod. De infogade kommentarerna förklarar vad varje del av skriptet gör. Miljövariablerna REPO_URL och AZURE_SUBSCRIPTION_ID bör redan anges i föregående steg.

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

Den här koden använder CLI-baserad autentisering (med AzureCliCredential) eftersom den visar åtgärder som du annars skulle kunna göra med Azure CLI direkt. I båda fallen använder du samma identitet för autentisering. Beroende på din miljö kan du behöva köra az login först för att autentisera.

Om du vill använda sådan kod i ett produktionsskript (till exempel för att automatisera hantering av virtuella datorer) använder du DefaultAzureCredential (rekommenderas) med en tjänsthuvudnamnsbaserad metod enligt beskrivningen i Så här autentiserar du Python-appar med Azure-tjänster.

5: Kör skriptet

python provision_deploy_web_app.py

6: Verifiera distributionen av webbappen

Om du vill visa den distribuerade webbplatsen kör du följande kommando:

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

Ersätt webbappens namn (--name) med det värde som genereras av skriptet. Du behöver inte ändra resursgruppens namn (--resource-group) om du inte har ändrat det i skriptet. När du öppnar webbplatsen bör du se "Hello, World!" i din webbläsare.

Tips/Råd

Om du inte ser förväntade utdata väntar du några minuter och försöker igen.

Om du fortfarande inte ser de förväntade utdata:

  1. Gå till Azure-portalen.
  2. Gå till Resursgrupper och leta upp den resursgrupp som du skapade.
  3. Välj resursgruppen för att visa dess resurser. Se till att den innehåller både en App Service-plan och en App Service.
  4. Välj App Service och gå sedan till Distributionscenter.
  5. Öppna fliken Loggar för att kontrollera om det finns fel eller statusuppdateringar i distributionsloggarna.

7: Omplacera webbappkoden (valfritt)

Skriptet etablerar alla nödvändiga resurser som värd för webbappen och konfigurerar distributionskällan så att den använder din förgrenade lagringsplats med manuell integrering. Med manuell integrering måste du manuellt utlösa webbappen för att hämta uppdateringar från den angivna lagringsplatsen och grenen.

Skriptet använder metoden WebSiteManagementClient.web_apps.sync_repository för att utlösa webbappen för att hämta kod från lagringsplatsen. Om du gör ytterligare ändringar i koden kan du distribuera om genom att anropa det här API:et igen eller genom att använda andra Azure-verktyg som Azure CLI eller Azure-portalen.

Du kan distribuera om koden med hjälp av Azure CLI genom att köra kommandot az webapp deployment source sync :

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

Du behöver inte ändra resursgruppens namn (--resource-group) om du inte har ändrat det i skriptet.

Så här distribuerar du koden från Azure-portalen:

  1. Gå till Azure-portalen.
  2. Gå till Resursgrupper och leta upp den resursgrupp som du skapade.
  3. Välj resursgruppens namn för att visa dess resurser. Se till att den innehåller både en App Service-plan och en App Service.
  4. Välj App Service och gå sedan till Distributionscenter.
  5. På den översta menyn väljer du Synkronisera för att utlösa distributionen av koden.

8: Rensa resurser

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

Du behöver inte ändra resursgruppens namn (--resource-group alternativ) om du inte har ändrat det i skriptet.

Om du inte längre behöver den resursgrupp som skapats i det här exemplet kan du ta bort den genom att köra kommandot az group delete . Även om resursgrupper inte debiteras löpande avgifter är det en bra idé att rensa alla oanvända resurser. --no-wait Använd argumentet för att omedelbart returnera kontrollen till kommandoraden utan att vänta på att borttagningen ska slutföras.

Du kan också ta bort en resursgrupp programmatiskt med hjälp av ResourceManagementClient.resource_groups.begin_delete metoden .

Se även