Поделиться через


Пример. Использование библиотек Azure для создания и развертывания веб-приложения

В этом примере показано, как использовать библиотеки управления пакетом SDK Azure в скрипте Python для создания и развертывания веб-приложения в Службе приложений Azure с кодом приложения, полученным из репозитория GitHub.

Пакет SDK Azure для Python включает библиотеки управления (пространства имен, начиная с azure-mgmt), которые позволяют автоматизировать настройку ресурсов и развертывание, аналогично тому, что можно сделать с помощью портала Azure, Azure CLI или шаблонов ARM. Примеры см. в кратком руководстве по развертыванию веб-приложения Python (Django или Flask) в службе приложений Azure.

1. Настройка локальной среды разработки

Если вы еще не сделали этого, настройте среду, в которой можно запустить этот код. Ниже приведено несколько вариантов:

  • Настройте виртуальную среду Python с помощью venv или выбранного средства. Чтобы начать использовать виртуальную среду, обязательно активируйте ее. Сведения об установке Python см. в разделе "Установка 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)
    
  • Используйте среду conda. Сведения об установке Conda см. в разделе "Установка Miniconda".

  • Используйте контейнер разработки в Visual Studio Code или GitHub Codespaces.

2. Установка необходимых пакетов библиотек Azure

Создайте файл с именемrequirements.txt со следующим содержимым:

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

В локальной среде разработки установите требования с помощью следующего кода:

pip install -r requirements.txt

3. Создать форк образца репозитория

  1. Посетите https://github.com/Azure-Samples/python-docs-hello-world и создайте форк репозитория в своем аккаунте GitHub. Использование форка гарантирует, что у вас есть необходимые разрешения для развертывания приложения в Azure.

    Форкинг примерного репозитория на GitHub

  2. Затем создайте переменную окружения с именем REPO_URL и задайте ей URL-адрес форкнутого репозитория. Эта переменная требуется примером кода в следующем разделе.

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

4. Написание кода для создания и развертывания веб-приложения

Создайте файл Python с именем provision_deploy_web_app.py и добавьте следующий код. Примечания в строке объясняют, что делает каждая часть скрипта. Переменные среды REPO_URL и AZURE_SUBSCRIPTION_ID уже должны быть заданы на предыдущем шаге.

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

Этот код использует аутентификацию на основе интерфейса командной строки (с помощью AzureCliCredential), так как он демонстрирует действия, которые вы могли бы выполнять непосредственно через Azure CLI. В обоих случаях для проверки подлинности используется одно и то же удостоверение. В зависимости от вашего окружения, вам может понадобиться сначала выполнить az login, чтобы пройти проверку подлинности.

Чтобы использовать такой код в рабочем скрипте (например, для автоматизации управления виртуальными машинами), используйте DefaultAzureCredential (рекомендуется) с методом на основе сервисного принципала, как описано в Проверка подлинности приложений Python с помощью служб Azure.

5. Запуск скрипта

python provision_deploy_web_app.py

6. Проверка развертывания веб-приложения

Чтобы просмотреть развернутый веб-сайт, выполните следующую команду:

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

Замените имя веб-приложения (--name) значением, созданным скриптом. Изменить имя группы ресурсов (--resource-group) не нужно, если вы не изменили его в скрипте. Когда вы открываете сайт, вы увидите "Hello, World!" в вашем браузере

Подсказка

Если ожидаемые выходные данные не отображаются, подождите несколько минут и повторите попытку.

Если вы по-прежнему не видите ожидаемые выходные данные:

  1. Перейдите на портал Azure.
  2. Перейдите к группам ресурсов и найдите созданную группу ресурсов.
  3. Выберите группу ресурсов, чтобы просмотреть ее ресурсы. Убедитесь, что он включает как план службы приложений, так и службу приложений.
  4. Выберите службу приложений и перейдите в Центр развертывания.
  5. Откройте вкладку журналов, чтобы проверить журналы развертывания на наличие ошибок или обновлений статуса.

7. Повторное развертывание кода веб-приложения (необязательно)

Скрипт подготавливает все необходимые ресурсы для размещения вашего веб-приложения и настраивает источник развертывания для использования форкнутого репозитория с помощью ручной интеграции. При интеграции вручную необходимо вручную активировать веб-приложение для извлечения обновлений из указанного репозитория и ветви.

Скрипт использует метод WebSiteManagementClient.web_apps.sync_repository для активации веб-приложения для извлечения кода из репозитория. Если вы вносите дополнительные изменения в код, вы можете повторно развернуть его, снова вызвав этот API или используя другие средства Azure, такие как Azure CLI или портал Azure.

Вы можете повторно развернуть код с помощью Azure CLI, выполнив команду az webapp deployment source sync :

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

Изменить имя группы ресурсов (--resource-group) не нужно, если вы не изменили его в скрипте.

Чтобы развернуть код на портале Azure, выполните следующие действия.

  1. Перейдите на портал Azure.
  2. Перейдите к группам ресурсов и найдите созданную группу ресурсов.
  3. Выберите имя группы ресурсов, чтобы просмотреть ее ресурсы. Убедитесь, что он включает как план службы приложений, так и службу приложений.
  4. Выберите службу приложений и перейдите в Центр развертывания.
  5. В верхнем меню выберите "Синхронизация ", чтобы активировать развертывание кода.

8. Очистка ресурсов

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

Если вы не изменили его в скрипте, не нужно изменять имя группы ресурсов (--resource-group параметр).

Если вам больше не нужна группа ресурсов, созданная в этом примере, ее можно удалить, выполнив команду az group delete . Хотя группы ресурсов не несут текущих расходов, рекомендуется очистить неиспользуемые ресурсы. --no-wait Используйте аргумент, чтобы немедленно вернуть элемент управления в командную строку, не ожидая завершения удаления.

Вы также можете удалить группу ресурсов программным способом ResourceManagementClient.resource_groups.begin_delete .

См. также