Zugriff auf Azure-Ressourcen von einem Onlineendpunkt mit einer verwalteten Identität

GILT FÜR:Azure CLI ML-Erweiterung v2 (aktuell)Python SDK azure-ai-ml v2 (aktuell)

Erfahren Sie, wie Sie von Ihrem Scoring-Skript aus mit einem Onlineendpunkt und entweder einer systemseitig oder einer benutzerseitig zugewiesenen verwalteten Identität auf Azure-Ressourcen zugreifen können.

Sowohl verwaltete Endpunkte als auch Kubernetes-Endpunkte ermöglichen es Azure Machine Learning, den Aufwand für die Bereitstellung Ihrer Computeressourcen und die Bereitstellung Ihres Machine Learning-Modells zu verwalten. In der Regel muss Ihr Modell auf Azure-Ressourcen wie Azure Container Registry oder Ihren Blobspeicher für Rückschlüsse zugreifen. Mit einer verwalteten Identität können Sie auf diese Ressourcen zugreifen, ohne Anmeldeinformationen in Ihrem Code verwalten zu müssen. Weitere Informationen zu verwalteten Identitäten

In diesem Leitfaden wird davon ausgegangen, dass Sie keine verwaltete Identität, kein Speicherkonto und keinen Onlineendpunkt haben. Wenn Sie bereits über diese Komponenten verfügen, fahren Sie mit dem Abschnitt Erteilen von Zugriffsberechtigungen für die verwaltete Identität fort.

Voraussetzungen

  • Für die Verwendung von Azure Machine Learning ist ein Azure-Abonnement erforderlich. Wenn Sie nicht über ein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen. Probieren Sie die kostenlose oder kostenpflichtige Version von Azure Machine Learning noch heute aus.

  • Sie müssen die Azure CLI- und die ML-Erweiterung (v2) installieren und konfigurieren. Weitere Informationen finden Sie unter Installieren, Einrichten und Verwenden der CLI 2.0.

  • Eine Azure-Ressourcengruppe, in der Sie (oder der von Ihnen verwendete Dienstprinzipal) Zugriff der Rollen Benutzerzugriffsadministrator und Mitwirkender haben müssen Sie verfügen über eine solche Ressourcengruppe, wenn Sie Ihre ML-Erweiterung gemäß dem vorherigen Artikel konfiguriert haben.

  • Ein Azure Machine Learning-Arbeitsbereich. Sie verfügen bereits über einen Arbeitsbereich, wenn Sie Ihre ML-Erweiterung gemäß dem vorherigen Artikel konfiguriert haben.

  • Ein trainiertes, für die Bewertung und Bereitstellung bereites Machine Learning-Modell. Wenn Sie dem Beispiel folgen, wird ein Modell bereitgestellt.

  • Wenn Sie die Standardeinstellungen für die Azure-Befehlszeilenschnittstelle noch nicht festgelegt haben, speichern Sie Ihre Standardeinstellungen. Um zu vermeiden, dass Sie die Werte für Ihr Abonnement, Ihren Arbeitsbereich und Ihre Ressourcengruppe mehrfach eingeben müssen, führen Sie den folgenden Code aus:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Um dem Beispiel zu folgen, klonen Sie das Repository mit den Beispielen, und wechseln Sie dann in das Verzeichnis in cli.

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

Einschränkungen

  • Die Identität für einen Endpunkt ist unveränderlich. Während der Erstellung eines Endpunkts können Sie diesem eine systemseitig zugewiesene Identität (Standard) oder eine benutzerseitig zugewiesene Identität zuordnen. Die Identität kann nach der Erstellung des Endpunkts nicht mehr geändert werden.
  • Wenn Ihr ARC- und Blobspeicher als privat konfiguriert sind, d. h. sich hinter einem virtuellen Netzwerk befinden, sollte der Zugriff vom Kubernetes-Endpunkt über die private Verbindung erfolgen, unabhängig davon, ob Ihr Arbeitsbereich öffentlich oder privat ist. Weitere Informationen zur Einstellung für private Verbindungen finden Sie unter Schützen des Arbeitsbereichs-VNet.

Konfigurieren Sie Variablen für die Bereitstellung

Konfigurieren Sie die Variablennamen für den Arbeitsbereich, den Arbeitsbereichsspeicherort und den Endpunkt, den Sie für die Verwendung mit Ihrer Bereitstellung erstellen möchten.

Durch den folgenden Code werden diese Werte als Umgebungsvariablen in Ihren Endpunkt exportiert:

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

Geben Sie als Nächstes an, wie Sie Ihr Blobspeicherkonto, Ihren Blobcontainer und Ihre Datei nennen möchten. Diese Variablennamen werden hier definiert und im nächsten Abschnitt in den Befehlen az storage account create und az storage container create verwendet.

Durch den folgenden Code werden diese Werte als Umgebungsvariablen exportiert:

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

Erstellen Sie nach dem Exportieren dieser Variablen eine lokale Textdatei. Wenn der Endpunkt bereitgestellt wird, wird vom Bewertungsskript mithilfe der systemseitig zugewiesenen verwalteten Identität, die bei der Erstellung des Endpunkts generiert wird, auf diese Textdatei zugegriffen.

Definieren der Bereitstellungskonfiguration

Um einen Onlineendpunkt mit der CLI bereitzustellen, müssen Sie die Konfiguration in einer YAML-Datei definieren. Weitere Informationen zum YAML-Schema finden Sie im Dokument YAML-Referenz für verwalteten Onlineendpunkt.

Die YAML-Dateien in den folgenden Beispielen werden zur Erstellung von Online-Endpunkten verwendet.

Das folgende YAML-Beispiel befindet sich in Endpunkten/online/managed/managed-identities/1-sai-create-endpoint. Die Datei,

  • Legt den Namen fest, mit dem Sie auf den Endpunkt my-sai-endpoint verweisen wollen.
  • Gibt die Art der Berechtigung an, die für den Zugriff auf den Endpunkt auth-mode: key verwendet werden soll.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

Dieses YAML-Beispiel, 2-sai-deployment.yml,

  • Angabe, dass Sie einen Endpunkt vom Typ online erstellen möchten
  • Zeigt an, dass der Endpunkt eine zugehörige Bereitstellung mit dem Namen blue hat.
  • Konfiguration der Bereitstellungsdetails (beispielsweise, welches Modell bereitgestellt und welche Umgebung und welches Bewertungsskript verwendet werden soll)
$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"

Erstellen Sie die verwaltete Identität

Um auf Azure-Ressourcen zuzugreifen, erstellen Sie eine dem System oder dem Benutzer zugewiesene verwaltete Identität für Ihren Onlineendpunkt.

Wenn Sie einen Online-Endpunkt erstellen, wird automatisch eine vom System zugewiesene verwaltete Identität für Sie generiert, so dass Sie keine separate Identität erstellen müssen.

Speicherkonto und Container erstellen

Für dieses Beispiel erstellen Sie ein Blob-Speicherkonto und einen Blob-Container und laden dann die zuvor erstellte Textdatei in den Blob-Container hoch. Sie gewähren dem Onlineendpunkt und der verwalteten Identität Zugriff auf dieses Speicherkonto und den Blobcontainer.

Erstellen Sie zuerst ein Speicherkonto.

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

Als nächstes erstellen Sie den Blob-Container im Speicherkonto.

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

Laden Sie anschließend Ihre Textdatei in den Blobcontainer hoch.

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

Erstellen eines Onlineendpunkts

Durch den folgenden Code wird ein Onlineendpunkt ohne Angabe einer Bereitstellung erstellt.

Warnung

Die Identität für einen Endpunkt ist unveränderlich. Während der Erstellung eines Endpunkts können Sie diesem eine systemseitig zugewiesene Identität (Standard) oder eine benutzerseitig zugewiesene Identität zuordnen. Die Identität kann nach der Erstellung des Endpunkts nicht mehr geändert werden.

Wenn Sie einen Onlineendpunkt erstellen, wird standardmäßig eine systemseitig zugewiesene verwaltete Identität für den Endpunkt erstellt.

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

Überprüfen Sie den Status des Endpunkts wie folgt:

az ml online-endpoint show --name $ENDPOINT_NAME

Falls Probleme auftreten, lesen Sie die Informationen unter Problembehandlung für die Bereitstellung und Bewertung von Onlineendpunkten.

Zugriffsberechtigung für die verwaltete Identität erteilen

Wichtig

Online-Endpunkte benötigen die Azure Container Registry Pull-Berechtigung, die AcrPull-Berechtigung, für die Container Registry und die Storage Blob Data Reader-Berechtigung für den Standard-Datenspeicher des Arbeitsbereich.

Sie können dem Onlineendpunkt die Erlaubnis erteilen, über seine vom System zugewiesene verwaltete Identität auf Ihren Speicher zuzugreifen, oder der vom Benutzer zugewiesenen verwalteten Identität die Erlaubnis erteilen, auf das im vorherigen Abschnitt erstellte Speicherkonto zuzugreifen.

Rufen Sie die dem System zugewiesene verwaltete Identität ab, die für Ihren Endpunkt erstellt wurde.

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

Anschließend können Sie der systemseitig zugewiesenen verwalteten Identität Zugriff auf Ihren Speicher gewähren.

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

Bewertungsskript für den Zugriff auf Azure-Ressourcen

Anhand des folgenden Skripts können Sie nachvollziehen, wie Sie mit Ihrem Identitäts-Token auf Azure-Ressourcen zugreifen, in diesem Szenario auf das in den vorherigen Abschnitten erstellte Speicherkonto.

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

Erstellen Sie eine Bereitstellung mit Ihrer Konfiguration

Erstellen Sie eine Bereitstellung, die dem Onlineendpunkt zugeordnet ist. Erfahren Sie mehr über die Bereitstellung auf Onlineendpunkten.

Warnung

Diese Bereitstellung dauert etwa acht bis 14 Minuten – je nachdem, ob die zugrunde liegende Umgebung bzw. das zugrunde liegende Image zum ersten Mal erstellt wird. Nachfolgende Bereitstellungen mit der gleichen Umgebung sind schneller.

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

Hinweis

Der Wert des --name-Arguments kann den name-Schlüssel in der YAML-Datei außer Kraft setzen.

Überprüfen Sie den Status der Bereitstellung.

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

Um die obige Abfrage so zu verfeinern, dass nur bestimmte Daten zurückgegeben werden, siehe Abfrage der Azure CLI-Befehlsausgabe.

Hinweis

Von der init-Methode im Bewertungsskript wird die Datei aus Ihrem Speicherkonto unter Verwendung des Tokens der systemseitig zugewiesenen verwalteten Identität gelesen.

Die Ausgabe der init-Methode kann im Bereitstellungsprotokoll mit dem folgenden Code überprüft werden.

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

Wenn Ihre Bereitstellung abgeschlossen ist, werden das Modell, die Umgebung und der Endpunkt in Ihrem Azure Machine Learning-Arbeitsbereich registriert.

Testen des Endpunkts

Sobald Ihr Onlineendpunkt bereitgestellt ist, testen und bestätigen Sie seinen Betrieb mit einer Anforderung. Details zum Rückschluss variieren von Modell zu Modell. Für diesen Leitfaden sehen die JSON-Abfrageparameter wie folgt aus:

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

Führen Sie zum Aufrufen Ihres Endpunkts Folgendes aus:

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

Löschen des Endpunkts und des Speicherkontos

Wenn Sie den bereitgestellten Onlineendpunkt und den Speicher nicht mehr benötigen, löschen Sie sie, um Kosten zu sparen. Durch das Löschen des Endpunkts werden auch alle zugeordneten Bereitstellungen gelöscht.

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