Exemplo: usar as bibliotecas do Azure para criar e implantar um aplicativo Web

Este exemplo demonstra como usar as bibliotecas de gerenciamento do SDK do Azure em um script Python para criar e implantar um aplicativo Web no Serviço de Aplicativo do Azure. O código do aplicativo é implantado a partir de um repositório GitHub.

Com as bibliotecas de gerenciamento (namespaces que começam com azure-mgmt, por exemplo, azure-mgmt-web), você pode criar programas de configuração e implantação para executar as mesmas tarefas que podem ser executadas com o portal do Azure, a CLI do Azure ou outras ferramentas de gerenciamento de recursos. Para ver exemplos, consulte Início Rápido: Implantar um aplicativo Web Python (Django ou Flask) para o Serviço de Aplicativo do Azure. (Comandos de CLI do Azure equivalentes são fornecidos posteriormente neste artigo.)

Todos os comandos neste artigo funcionam da mesma forma no bash do Linux/macOS e nos shells de comando do Windows, a menos que haja uma observação.

1: configurar seu ambiente de desenvolvimento

Caso ainda não tenha feito isso, configure um ambiente onde você possa executar esse código. Estas são algumas opções:

2: Instalar os pacotes da biblioteca do Azure necessários

Crie um arquivo chamado requirements.txt com o conteúdo abaixo:

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

Em um terminal ou prompt de comando com o ambiente virtual ativado, instale os requisitos:

pip install -r requirements.txt

3: Criar fork do repositório de exemplo

Acesse https://github.com/Azure-Samples/python-docs-hello-world e bifuque o repositório na sua conta do GitHub. Você usará uma bifurcação para garantir que você tenha permissões para implantar o repositório no Azure.

Bifurcação de amostra de repositório no GitHub

Em seguida, crie uma variável de ambiente com nome REPO_URL na URL da sua bifurcação. O código de exemplo na próxima seção depende desta variável de ambiente:

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

4: Escrever código para criar e implantar um aplicativo Web

Crie um arquivo Python com o nome provision_deploy_web_app.py e o código a seguir. Os comentários explicam os detalhes do código. Certifique-se de definir as variáveis de ambiente REPO_URL e AZURE_SUBSCRIPTION_ID antes de executar o 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")

Esse código usa a autenticação baseada na CLI (usando AzureCliCredential), pois demonstra ações que você pode efetuar diretamente com a CLI do Azure. Em ambos os casos, você usará a mesma identidade para autenticação. Dependendo do seu ambiente, talvez você precise executar az login primeiro para autenticar.

Para colocar esse código em um script de produção (por exemplo, para automatizar o gerenciamento da VM), você deve usar DefaultAzureCredential (recomendado) ou com um método baseado na entidade de serviço, como descrito em Como autenticar aplicativos Python com os serviços do Azure.

5: executar o script

python provision_deploy_web_app.py

6: verificar a implantação do aplicativo Web

Para acessar o site da Web implantado, execute o seguinte comando:

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

Substitua o nome do aplicativo Web (opção --name) e o nome do grupo de recursos (opção --resource-group) pelos valores usados no script. Você deverá ver "Olá, mundo!" no navegador.

Se você não vir a saída esperada, aguarde alguns minutos e tente novamente.

Se você ainda não vir a saída esperada:

  1. Acesse o portal do Azure.
  2. Selecione Grupos de recursos e encontre o grupo de recursos que você criou.
  3. Selecione o nome do grupo de recursos para exibir os recursos que ele contém. Especificamente, verifique se há um Plano do Serviço de Aplicativo e o Serviço de Aplicativo.
  4. Selecione o Serviço de Aplicativo e então selecione Centro de Implantação.
  5. Selecione a guia logs para exibir os logs de implantação.

7: Reimplantar o código do aplicativo Web (opcional)

O script configura os recursos necessários para hospedar seu aplicativo Web e define a origem de implantação para sua bifurcação usando a integração manual. Com a integração manual, você deve acionar o aplicativo Web para extrair do repositório e da ramificação configurados.

O script chama o método WebSiteManagementClient.web_apps.sync_repository para acionar um pull do aplicativo Web. Se enviar alterações de código subsequentes por push para o repositório, você poderá reimplantar o código invocando essa API ou usando outras ferramentas do Azure, como a CLI do Azure ou o portal do Azure.

Você pode implantar seu código com a CLI do Azure executando o comando az webapp deployment source sync:

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

Substitua o nome do aplicativo Web (opção --name) e o nome do grupo de recursos (opção --resource-group) pelos valores usados no script.

Para implantar seu código do portal do Azure:

  1. Acesse o portal do Azure.
  2. Selecione Grupos de recursos e encontre o grupo de recursos que você criou.
  3. Selecione o nome do grupo de recursos para exibir os recursos que ele contém. Especificamente, verifique se há um Plano do Serviço de Aplicativo e o Serviço de Aplicativo.
  4. Selecione o Serviço de Aplicativo e então selecione Centro de Implantação.
  5. No menu superior, selecione Sincronizar para implantar seu código.

8: limpar recursos

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

Execute o comando az group delete se você não precisar manter o grupo de recursos criado neste exemplo. Os grupos de recursos não incorrem em encargos contínuos na sua assinatura, mas recomendamos limpar os grupos que você não esteja usando ativamente. O argumento --no-wait permite que o comando seja retornado imediatamente, em vez de esperar a conclusão da operação.

Você também pode usar o método ResourceManagementClient.resource_groups.begin_delete para excluir um grupo de recursos do código.

Para referência: comandos equivalentes da CLI do Azure

Os comandos a seguir da CLI do Azure executam as mesmas etapas de provisionamento do 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

Confira também