Доступ к ресурсам Azure из подключенной конечной точки с помощью управляемого удостоверения

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения Azure CLI версии 2 (current)Python SDK azure-ai-ml версии 2 (current)

Узнайте, как получить доступ к ресурсам Azure из скрипта оценки, используя сетевую конечную точку и либо управляемое удостоверение, назначаемое системой, либо управляемое удостоверение, назначаемое пользователем.

Управляемые конечные точки и конечные точки Kubernetes позволяют Машинное обучение Azure управлять бременем подготовки вычислительных ресурсов и развертыванием модели машинного обучения. Обычно модели требуется доступ к ресурсам Azure, например, реестру контейнеров Azure или хранилищу BLOB-объектов для вывода; управляемое удостоверение позволяет получить доступ к этим ресурсам без необходимости управлять учетными данными в коде. Узнайте больше об управляемых удостоверениях.

В настоящем руководстве информация приводится на основании допущения о том, что у вас нет управляемого удостоверения, учетной записи хранения или сетевой конечной точки. Если эти компоненты уже имеются, перейдите к разделу Предоставление разрешения на доступ к управляемому удостоверению.

Необходимые компоненты

  • Для использования машинного обучения Azure необходима подписка Azure. Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе. Опробуйте бесплатную или платную версию Машинного обучения Azure уже сегодня.

  • Установите и настройте расширение Azure CLI и ML (версия 2). Дополнительные сведения см. в разделе Установка, настройка и использование CLI версии 2.0.

  • Группа ресурсов Azure, в которой у вас (или вашего субъекта-службы) должен быть доступ User Access Administrator и Contributor. У вас будет такая группа ресурсов, если вы настроили расширение ML в соответствии с приведенной выше статьей.

  • Рабочая область Машинного обучения Azure. У вас будет такая рабочая область, если вы настроили расширение ML в соответствии с приведенной выше статьей.

  • Обученная модель машинного обучения, готовая для оценки и развертывания. Если вы используете этот пример, модель предоставляется.

  • Если вы еще не задали параметры по умолчанию для Azure CLI, сохраните их. Чтобы не указывать параметры для подписки, рабочей области и группы ресурсов несколько раз, используйте следующий код:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Чтобы использовать пример, клонируйте репозиторий выборок

    git clone https://github.com/Azure/azureml-examples --depth 1
    cd azureml-examples/cli
    

Ограничения

  • Удостоверение конечной точки является неизменяемым. Во время создания конечной точки его можно связать с удостоверением, назначенным системой (по умолчанию) или удостоверением, назначенным пользователем. После создания конечной точки удостоверение нельзя изменить.
  • Если хранилище ARC и BLOB-объектов настроены как частные, т. е. за виртуальной сетью, то доступ к конечной точке Kubernetes должен находиться по закрытой ссылке независимо от того, является ли ваша рабочая область общедоступной или частной. Дополнительные сведения о настройке приватного канала см. в статье "Как защитить виртуальную сеть рабочей области".

Настройка переменных для развертывания

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

Следующий фрагмент кода экспортирует эти значения в качестве переменных среды в конечной точке:

export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"

Затем укажите имена учетной записи хранения BLOB-объектов, контейнера больших двоичных объектов и файла. Эти имена переменных задаются здесь и используются в командах az storage account create и az storage container create в следующем разделе.

Следующий фрагмент кода экспортирует эти значения как переменные среды:

export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"

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

Определите конфигурацию развертывания

Чтобы развернуть сетевую конечную точку с помощью интерфейса командной строки, необходимо определить конфигурацию в файле YAML. Дополнительные сведения о схеме YAML см. в справочном документе о подключенной конечной точке YAML.

Файлы YAML в следующих примерах используются для создания сетевых конечных точек.

Следующий пример YAML находится в endpoints/online/managed/managed-identities/1-sai-create-endpoint. В файле:

  • определяется имя для ссылки на конечную точку, my-sai-endpoint.
  • задается тип авторизации, используемый для доступа к конечной точке, auth-mode: key.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

В этом примере YAML, 2-sai-deployment.yml,

  • задается тип создаваемой конечной точки (online);
  • указывается, что у конечной точки есть связанное развертывание blue;
  • задаются сведения о развертывании (например, какую модель развернуть, какую среду и скрипт оценки использовать).
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score_managedidentity.py
environment:
  conda_file: ../../model-1/environment/conda-managedidentity.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1
environment_variables:
  STORAGE_ACCOUNT_NAME: "storage_place_holder"
  STORAGE_CONTAINER_NAME: "container_place_holder"
  FILE_NAME: "file_place_holder"

Создание управляемого удостоверения

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

При создании сетевой конечной точкиавтоматически создается управляемое удостоверение, назначаемое системой, поэтому вам не нужно создавать его отдельно.

Создание учетной записи и контейнера хранения

В этом примере создается учетная запись хранилища BLOB-объектов и контейнер BLOB-объектов, а затем ранее созданный текстовый файл отправляется в контейнер BLOB-объектов. Именно этой учетной записи хранения и этому контейнеру BLOB-объектов будет предоставлен доступ к сетевой конечной точке и управляемому удостоверению.

Сначала создайте учетную запись хранения.

az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION

Затем создайте в этой учетной записи хранения контейнер BLOB-объектов.

az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME

Затем отправьте текстовый файл в контейнер больших двоичных объектов.

az storage blob upload --account-name $STORAGE_ACCOUNT_NAME --container-name $STORAGE_CONTAINER_NAME --name $FILE_NAME --file endpoints/online/managed/managed-identities/hello.txt

Создание сетевой конечной точки

Следующий код создает управляемую сетевую конечную точку без указания развертывания.

Предупреждение

Удостоверение конечной точки является неизменяемым. Во время создания конечной точки его можно связать с удостоверением, назначенным системой (по умолчанию) или удостоверением, назначенным пользователем. После создания конечной точки удостоверение нельзя изменить.

При создании сетевой конечной точки для нее создается назначаемое системой удостоверение по умолчанию.

az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/managed-identities/1-sai-create-endpoint.yml

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

az ml online-endpoint show --name $ENDPOINT_NAME

В случае возникновения проблем см. раздел Устранение неполадок при развертывании и оценке подключенных конечных точек.

Предоставление разрешения на доступ к управляемому удостоверению

Важно!

Для сетевых конечных точек требуется разрешение на запрос реестра контейнеров Azure, разрешение AcrPull на доступ к реестру контейнеров и разрешение читателя данных хранилища BLOB-объектов для рабочей области по умолчанию.

Вы можете разрешить сетевой конечной точке получать доступ к хранилищу через назначаемое системой управляемое удостоверение или предоставить разрешение назначаемому пользователем управляемому удостоверению на доступ к учетной записи хранения, созданной в предыдущем разделе.

Получите назначаемое системой управляемое удостоверение, созданное для конечной точки.

system_identity=`az ml online-endpoint show --name $ENDPOINT_NAME --query "identity.principal_id" -o tsv`

Отсюда можно предоставить назначаемому системой управляемому удостоверению разрешение для доступа к хранилищу.

az role assignment create --assignee-object-id $system_identity --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id

Скрипт оценки для доступа к ресурсу Azure

Обратитесь к следующему скрипту, чтобы узнать, как использовать маркер удостоверения для доступа к ресурсам Azure в этом сценарии (учетная запись хранения создана в предыдущих разделах).

import os
import logging
import json
import numpy
import joblib
import requests
from azure.identity import ManagedIdentityCredential
from azure.storage.blob import BlobClient


def access_blob_storage_sdk():
    credential = ManagedIdentityCredential(client_id=os.getenv("UAI_CLIENT_ID"))
    storage_account = os.getenv("STORAGE_ACCOUNT_NAME")
    storage_container = os.getenv("STORAGE_CONTAINER_NAME")
    file_name = os.getenv("FILE_NAME")

    blob_client = BlobClient(
        account_url=f"https://{storage_account}.blob.core.windows.net/",
        container_name=storage_container,
        blob_name=file_name,
        credential=credential,
    )
    blob_contents = blob_client.download_blob().content_as_text()
    logging.info(f"Blob contains: {blob_contents}")


def get_token_rest():
    """
    Retrieve an access token via REST.
    """

    access_token = None
    msi_endpoint = os.environ.get("MSI_ENDPOINT", None)
    msi_secret = os.environ.get("MSI_SECRET", None)

    # If UAI_CLIENT_ID is provided then assume that endpoint was created with user assigned identity,
    # # otherwise system assigned identity deployment.
    client_id = os.environ.get("UAI_CLIENT_ID", None)
    if client_id is not None:
        token_url = (
            msi_endpoint + f"?clientid={client_id}&resource=https://storage.azure.com/"
        )
    else:
        token_url = msi_endpoint + f"?resource=https://storage.azure.com/"

    logging.info("Trying to get identity token...")
    headers = {"secret": msi_secret, "Metadata": "true"}
    resp = requests.get(token_url, headers=headers)
    resp.raise_for_status()
    access_token = resp.json()["access_token"]
    logging.info("Retrieved token successfully.")
    return access_token


def access_blob_storage_rest():
    """
    Access a blob via REST.
    """

    logging.info("Trying to access blob storage...")
    storage_account = os.environ.get("STORAGE_ACCOUNT_NAME")
    storage_container = os.environ.get("STORAGE_CONTAINER_NAME")
    file_name = os.environ.get("FILE_NAME")
    logging.info(
        f"storage_account: {storage_account}, container: {storage_container}, filename: {file_name}"
    )
    token = get_token_rest()

    blob_url = f"https://{storage_account}.blob.core.windows.net/{storage_container}/{file_name}?api-version=2019-04-01"
    auth_headers = {
        "Authorization": f"Bearer {token}",
        "x-ms-blob-type": "BlockBlob",
        "x-ms-version": "2019-02-02",
    }
    resp = requests.get(blob_url, headers=auth_headers)
    resp.raise_for_status()
    logging.info(f"Blob contains: {resp.text}")


def init():
    global model
    # AZUREML_MODEL_DIR is an environment variable created during deployment.
    # It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION)
    # For multiple models, it points to the folder containing all deployed models (./azureml-models)
    # Please provide your model's folder name if there is one
    model_path = os.path.join(
        os.getenv("AZUREML_MODEL_DIR"), "model/sklearn_regression_model.pkl"
    )
    # deserialize the model file back into a sklearn model
    model = joblib.load(model_path)
    logging.info("Model loaded")

    # Access Azure resource (Blob storage) using system assigned identity token
    access_blob_storage_rest()
    access_blob_storage_sdk()

    logging.info("Init complete")


# note you can pass in multiple rows for scoring
def run(raw_data):
    logging.info("Request received")
    data = json.loads(raw_data)["data"]
    data = numpy.array(data)
    result = model.predict(data)
    logging.info("Request processed")
    return result.tolist()

Создание развертывания с использованием конфигурации

Создайте развертывание, связанное с сетевой конечной точкой. Дополнительные сведения о развертывании в сетевых конечных точках см. здесь.

Предупреждение

Его создание может занять примерно 8–14 минут в зависимости от того, формируются ли базовая среда и образ впервые. Последующие развертывания в той же среде будут выполняться быстрее.

az ml online-deployment create --endpoint-name $ENDPOINT_NAME --all-traffic --name blue --file endpoints/online/managed/managed-identities/2-sai-deployment.yml --set environment_variables.STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME environment_variables.STORAGE_CONTAINER_NAME=$STORAGE_CONTAINER_NAME environment_variables.FILE_NAME=$FILE_NAME

Примечание.

Значение аргумента --name может переопределять ключ name в файле YAML.

Проверьте состояние развертывания.

az ml online-deployment show --endpoint-name $ENDPOINT_NAME --name blue

Сведения о том, как уточнить указанные запросы таким образом, чтобы возвращались только определенные данные, приведены в статье Запросы к выходным данным команд Azure CLI.

Примечание.

Метод init в скрипте оценки считывает файл из учетной записи хранения с помощью маркера управляемого удостоверения, назначаемого системой.

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

# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue

После завершения развертывания модель, среда и конечная точка регистрируются в рабочей области Машинного обучения Azure.

Тестирование конечной точки

После развертывания виртуальной конечной точки проверьте и подтвердите свою операцию с помощью запроса. Особенности вывода зависят от конкретной модели. В этом руководстве параметры запроса JSON выглядят следующим образом:

{"data": [
    [1,2,3,4,5,6,7,8,9,10], 
    [10,9,8,7,6,5,4,3,2,1]
]}

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

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

Удаление конечной точки и учетной записи хранения

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

az ml online-endpoint delete --name $ENDPOINT_NAME --yes
az storage account delete --name $STORAGE_ACCOUNT_NAME --yes

Следующие шаги