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. Appkoden distribueras från en GitHub-lagringsplats.

Med hanteringsbiblioteken (namnrymder som börjar med azure-mgmt, till exempel azure-mgmt-web), kan du skriva konfigurations- och distributionsprogram för att utföra samma uppgifter som du kan via Azure-portalen, Azure CLI eller andra resurshanteringsverktyg. Exempel finns i Snabbstart: Distribuera en Python-webbapp (Django eller Flask) till Azure App Service. (Motsvarande Azure CLI-kommandon ges senare i den här artikeln.)

Alla kommandon i den här artikeln fungerar på samma sätt i Linux/macOS bash- och Windows-kommandogränssnitt om de inte anges.

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 följer några alternativ:

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

Installera kraven i en terminal eller kommandotolk med den virtuella miljön aktiverad:

pip install -r requirements.txt

3: Förgrena exempellagringsplatsen

Besök https://github.com/Azure-Samples/python-docs-hello-world och förgrena lagringsplatsen till ditt eget GitHub-konto. Du använder en förgrening för att säkerställa att du har behörighet att distribuera lagringsplatsen till Azure.

Forking the sample repository on GitHub

Skapa sedan en miljövariabel med namnet REPO_URL med URL:en för din förgrening. Exempelkoden i nästa avsnitt beror på den här miljövariabeln:

set REPO_URL=<url_of_your_fork>
set 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 med följande kod. Kommentarerna förklarar informationen om koden. Se till att definiera REPO_URL miljövariablerna och AZURE_SUBSCRIPTION_ID innan du kör skriptet.

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 ) AzureCliCredentialeftersom den visar åtgärder som du annars kan 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 Autentisera Python-appar med Azure-tjänster.

5: Kör skriptet

python provision_deploy_web_app.py

6: Verifiera distributionen av webbappen

Besök den distribuerade webbplatsen genom att köra följande kommando:

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

Ersätt namnet på webbappen (--name alternativet) och resursgruppens namn (--resource-group alternativet) med de värden som du använde i skriptet. Du bör se "Hello, World!" i webbläsaren.

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. Välj Resursgrupper och leta reda på den resursgrupp som du skapade.
  3. Välj resursgruppens namn för att visa de resurser som den innehåller. Mer specifikt kontrollerar du att det finns en App Service-plan och App Service.
  4. Välj App Service och välj sedan Distributionscenter.
  5. Välj fliken Loggar för att visa distributionsloggar.

7: Distribuera om webbappkoden (valfritt)

Skriptet konfigurerar de resurser som behövs för att vara värd för webbappen och anger distributionskällan till din förgrening med hjälp av manuell integrering. Med manuell integrering måste du utlösa webbappen för att hämta från den konfigurerade lagringsplatsen och grenen.

Skriptet anropar metoden WebSiteManagementClient.web_apps.sync_repository för att utlösa en hämtning från webbappen. Om du skickar efterföljande kodändringar till lagringsplatsen kan du distribuera om koden genom att anropa det här API:et eller med hjälp av andra Azure-verktyg som Azure CLI eller Azure-portalen.

Du kan distribuera koden med 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

Ersätt namnet på webbappen (--name alternativet) och resursgruppens namn (--resource-group alternativet) med de värden som du använde i skriptet.

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

  1. Gå till Azure-portalen.
  2. Välj Resursgrupper och leta reda på den resursgrupp som du skapade.
  3. Välj resursgruppens namn för att visa de resurser som den innehåller. Mer specifikt kontrollerar du att det finns en App Service-plan och App Service.
  4. Välj App Service och välj sedan Distributionscenter.
  5. På den översta menyn väljer du Synkronisera för att distribuera koden.

8: Rensa resurser

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

Kör kommandot az group delete om du inte behöver behålla resursgruppen som skapats i det här exemplet. Resursgrupper debiteras inga löpande avgifter i din prenumeration, men det är en bra idé att rensa alla grupper som du inte aktivt använder. Argumentet --no-wait gör att kommandot kan returneras omedelbart i stället för att vänta på att åtgärden ska slutföras.

Du kan också använda ResourceManagementClient.resource_groups.begin_delete metoden för att ta bort en resursgrupp från koden.

Som referens: motsvarande Azure CLI-kommandon

Följande Azure CLI-kommandon utför samma etableringssteg som Python-skriptet:

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

Se även