Esempio: usare le librerie di Azure per creare e distribuire un'app Web
Questo esempio illustra come usare le librerie di gestione di Azure SDK in uno script Python per creare e distribuire un'app Web nel servizio app Azure. Il codice dell'app viene distribuito da un repository GitHub.
Con le librerie di gestione (spazi dei nomi che iniziano con azure-mgmt
, ad esempio, azure-mgmt-web
), è possibile scrivere programmi di configurazione e distribuzione per eseguire le stesse attività che è possibile eseguire tramite il portale di Azure, l'interfaccia della riga di comando di Azure o altri strumenti di gestione delle risorse. Per esempi, vedere Avvio rapido: Distribuire un'app Web Python (Django o Flask) nel servizio app Azure. I comandi equivalenti dell'interfaccia della riga di comando di Azure vengono descritti più avanti in questo articolo.
Se non diversamente specificato, tutti i comandi di questo articolo funzionano allo stesso modo nella shell Bash Linux/macOS e nella shell dei comandi di Windows.
1: Configurare l'ambiente di sviluppo locale
Se non è già stato fatto, configurare un ambiente in cui è possibile eseguire questo codice. Di seguito sono riportate alcuni opzioni:
Configurare un ambiente virtuale Python usando o lo
venv
strumento preferito. È possibile creare l'ambiente virtuale in locale o in Azure Cloud Shell ed eseguire il codice. Assicurarsi di attivare l'ambiente virtuale per iniziare a usarlo.Usare un ambiente conda.
Usare un contenitore di sviluppo in Visual Studio Code o GitHub Codespaces.
2: Installare i pacchetti di libreria di Azure necessari
Creare un file denominato requirements.txt con il contenuto seguente:
azure-mgmt-resource
azure-mgmt-web
azure-identity
In un terminale o da un prompt dei comandi con l'ambiente virtuale attivato, installare i requisiti:
pip install -r requirements.txt
3: Creare una copia tramite fork del repository di esempio
Visitare https://github.com/Azure-Samples/python-docs-hello-world e creare una copia tramite fork del repository nel proprio account GitHub. Si userà un fork per assicurarsi di avere le autorizzazioni per distribuire il repository in Azure.
Quindi creare una variabile di ambiente denominata REPO_URL
con l'URL del fork. Il codice di esempio della sezione successiva dipende da questa variabile di ambiente:
4: Scrivere codice per creare e distribuire un'app Web
Creare un file Python denominato provision_deploy_web_app.py con il codice seguente. I commenti illustrano i dettagli del codice. Assicurarsi di definire le REPO_URL
variabili di ambiente e AZURE_SUBSCRIPTION_ID
prima di eseguire lo 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")
Questo codice usa l'autenticazione basata sull'interfaccia della riga di comando (AzureCliCredential
) perché illustra azioni che altrimenti si potrebbero eseguire direttamente con l'interfaccia della riga di comando di Azure. In entrambi i casi si usa la stessa identità per l'autenticazione. A seconda dell'ambiente, potrebbe essere necessario eseguire az login
prima di tutto per l'autenticazione.
Per usare questo codice in uno script di produzione (ad esempio, per automatizzare la gestione delle macchine virtuali), usare DefaultAzureCredential
(scelta consigliata) con un metodo basato su entità servizio, come descritto in Come autenticare le app Python con i servizi di Azure.
Collegamenti di riferimento per le classi usate nel codice
- AzureCliCredential (azure.identity)
- ResourceManagementClient (azure.mgmt.resource)
- WebSiteManagementClient (azure.mgmt.web import)
5: Eseguire lo script
python provision_deploy_web_app.py
6: Verificare la distribuzione dell'app Web
Visitare il sito Web distribuito eseguendo il comando seguente:
az webapp browse --name PythonAzureExample-WebApp-12345 --resource-group PythonAzureExample-WebApp-rg
Sostituire il nome dell'app Web (--name
opzione) e il nome del gruppo di risorse (--resource-group
opzione ) con i valori usati nello script. Nel browser dovrebbe essere visualizzato "Hello, World!".
Se l'output previsto non viene visualizzato, attendere alcuni minuti e riprovare.
Se l'output previsto non è ancora visualizzato, procedere come illustrato di seguito:
- Vai al portale di Azure.
- Selezionare Gruppi di risorse e trovare il gruppo di risorse creato.
- Selezionare il nome del gruppo di risorse per visualizzare le risorse contenute. In particolare, verificare che sia presente un piano servizio app e il servizio app.
- Selezionare il servizio app e quindi centro distribuzione.
- Selezionare la scheda Log per visualizzare i log di distribuzione.
7: Ridistribuire il codice dell'app Web (facoltativo)
Lo script configura le risorse necessarie per ospitare l'app Web e imposta l'origine di distribuzione sul fork usando l'integrazione manuale. Con l'integrazione manuale, è necessario attivare l'app Web per eseguire il pull dal repository e dal ramo configurati.
Lo script chiama il metodo WebSiteManagementClient.web_apps.sync_repository per attivare un pull dall'app Web. Se si esegue il push delle modifiche di codice successive al repository, è possibile ridistribuire il codice richiamando questa API o usando altri strumenti di Azure come l'interfaccia della riga di comando di Azure o portale di Azure.
È possibile distribuire il codice con l'interfaccia della riga di comando di Azure eseguendo il comando az webapp deployment source sync :
az webapp deployment source sync --name PythonAzureExample-WebApp-12345 --resource-group PythonAzureExample-WebApp-rg
Sostituire il nome dell'app Web (--name
opzione) e il nome del gruppo di risorse (--resource-group
opzione ) con i valori usati nello script.
Per distribuire il codice da portale di Azure:
- Vai al portale di Azure.
- Selezionare Gruppi di risorse e trovare il gruppo di risorse creato.
- Selezionare il nome del gruppo di risorse per visualizzare le risorse contenute. In particolare, verificare che sia presente un piano servizio app e il servizio app.
- Selezionare il servizio app e quindi centro distribuzione.
- Nel menu in alto selezionare Sincronizza per distribuire il codice.
8: Pulire le risorse
az group delete --name PythonAzureExample-WebApp-rg --no-wait
Eseguire il comando az group delete se non è necessario mantenere il gruppo di risorse creato in questo esempio. I gruppi di risorse non comportano alcun addebito ricorrente per la sottoscrizione, ma è consigliabile pulire tutti i gruppi che non vengono usati attivamente. Con l'argomento --no-wait
, il comando restituisce immediatamente il risultato invece di attendere il completamento dell'operazione.
Per eliminare un gruppo di risorse dal codice, è anche possibile usare il metodo ResourceManagementClient.resource_groups.begin_delete
.
Per riferimento: comandi equivalenti dell'interfaccia della riga di comando di Azure
I seguenti comandi dell'interfaccia della riga di comando di Azure completano gli stessi passaggi di provisioning dello script 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
Vedi anche
- Esempio: Creare un gruppo di risorse
- Esempio: Elencare i gruppi di risorse in una sottoscrizione
- Esempio: Creare Archiviazione di Azure
- Esempio: Usare Archiviazione di Azure
- Esempio: Creare ed eseguire query su un database MySQL
- Esempio: Creare una macchina virtuale
- Usare Azure Managed Disks con le macchine virtuali
- Completare un breve sondaggio su Azure SDK per Python