Partilhar via


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 começando com azure-mgmt, por exemplo, azure-mgmt-web), você pode escrever programas de configuração e implantação para executar as mesmas tarefas que você pode através do portal do Azure, CLI do Azure ou outras ferramentas de gerenciamento de recursos. Para obter exemplos, consulte Guia de início rápido: implantar um aplicativo Web Python (Django ou Flask) no Serviço de Aplicativo do Azure. (Comandos equivalentes da CLI do Azure são fornecidos mais adiante neste artigo.)

Todos os comandos neste artigo funcionam da mesma forma em shells de comando Linux/macOS bash e Windows, a menos que indicado.

1: Configure seu ambiente de desenvolvimento local

Se ainda não o fez, configure um ambiente onde possa executar este código. Seguem-se algumas opções:

  • Configure um ambiente virtual Python usando venv ou sua ferramenta de escolha. Você pode criar o ambiente virtual localmente ou no Azure Cloud Shell e executar o código lá. Certifique-se de ativar o ambiente virtual para começar a usá-lo.

  • Use um ambiente de conda.

  • Use um contêiner de desenvolvimento no Visual Studio Code ou GitHub Codespaces.

2: Instale os pacotes de biblioteca do Azure necessários

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

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: Fork o repositório de exemplo

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

Forking o repositório de exemplo no GitHub

Em seguida, crie uma variável de ambiente nomeada REPO_URL com a URL da 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: Escreva código para criar e implantar um aplicativo Web

Crie um arquivo Python chamado provision_deploy_web_app.py com o código a seguir. Os comentários explicam os detalhes do código. Certifique-se de definir as REPO_URL variáveis e AZURE_SUBSCRIPTION_ID de ambiente 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 em CLI (usando AzureCliCredential) porque demonstra ações que, de outra forma, você poderia fazer diretamente com a CLI do Azure. Em ambos os casos, você está usando a mesma identidade para autenticação. Dependendo do seu ambiente, talvez seja necessário executar az login primeiro para autenticar.

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

5: Execute o script

python provision_deploy_web_app.py

6: Verificar a implantação do aplicativo Web

Visite o site implantado executando o seguinte comando:

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

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

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

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

  1. Aceda ao portal do Azure.
  2. Selecione Grupos de recursos e localize 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, em seguida, 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 fonte de implantação para sua bifurcação usando 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 disparar um pull do aplicativo Web. Se você enviar por push alterações de código subsequentes para seu repositório, poderá reimplantar seu 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 (--name opção) e o nome do grupo de recursos (--resource-group opção) pelos valores usados no script.

Para implantar seu código do portal do Azure:

  1. Aceda ao portal do Azure.
  2. Selecione Grupos de recursos e localize 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, em seguida, 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 não precisar manter o grupo de recursos criado neste exemplo. Os grupos de recursos não incorrem em cobranças contínuas na sua assinatura, mas é uma boa prática limpar qualquer grupo que você não esteja usando ativamente. O --no-wait argumento permite que o comando retorne imediatamente em vez de esperar que a operação seja concluída.

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

Para referência: comandos equivalentes da CLI do Azure

Os seguintes comandos da CLI do Azure concluem as mesmas etapas de provisionamento que o 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

Consulte também