Få åtkomst till Azure-resurser från en onlineslutpunkt med en hanterad identitet

GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)

Lär dig hur du kommer åt Azure-resurser från ditt bedömningsskript med en onlineslutpunkt och antingen en systemtilldelad hanterad identitet eller en användartilldelad hanterad identitet.

Både hanterade slutpunkter och Kubernetes-slutpunkter gör det möjligt för Azure Machine Learning att hantera bördan med att etablera beräkningsresursen och distribuera din maskininlärningsmodell. Vanligtvis behöver din modell komma åt Azure-resurser, till exempel Azure Container Registry eller din bloblagring för slutsatsdragning. med en hanterad identitet kan du komma åt dessa resurser utan att behöva hantera autentiseringsuppgifter i koden. Läs mer om hanterade identiteter.

Den här guiden förutsätter att du inte har någon hanterad identitet, ett lagringskonto eller en onlineslutpunkt. Om du redan har dessa komponenter går du vidare till avsnittet Ge åtkomstbehörighet till den hanterade identiteten .

Förutsättningar

  • Om du vill använda Azure Machine Learning måste du ha en Azure-prenumeration. Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar. Prova den kostnadsfria eller betalda versionen av Azure Machine Learning idag.

  • Installera och konfigurera Tillägget Azure CLI och ML (v2). Mer information finns i Installera, konfigurera och använda 2.0 CLI.

  • En Azure-resursgrupp där du (eller tjänstens huvudnamn du använder) måste ha användaråtkomstadministratör och deltagaråtkomst . Du har en sådan resursgrupp om du har konfigurerat ML-tillägget enligt föregående artikel.

  • En Azure Machine Learning-arbetsyta. Du har redan en arbetsyta om du har konfigurerat ML-tillägget enligt föregående artikel.

  • En tränad maskininlärningsmodell som är redo för bedömning och distribution. Om du följer med i exemplet tillhandahålls en modell.

  • Om du inte redan har angett standardinställningarna för Azure CLI sparar du standardinställningarna. Kör den här koden för att undvika att skicka in värdena för din prenumeration, arbetsyta och resursgrupp flera gånger:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Om du vill följa med i exemplet klonar du exempellagringsplatsen och ändrar sedan katalogen till cli.

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

Begränsningar

  • Identiteten för en slutpunkt är oföränderlig. När slutpunkten skapas kan du associera den med en systemtilldelad identitet (standard) eller en användartilldelad identitet. Du kan inte ändra identiteten när slutpunkten har skapats.
  • Om arc- och bloblagringen har konfigurerats som privata, dvs. bakom ett virtuellt nätverk, bör åtkomsten från Kubernetes-slutpunkten vara via den privata länken oavsett om din arbetsyta är offentlig eller privat. Mer information om inställningen för privat länk finns i Så här skyddar du arbetsytans virtuella nätverk.

Konfigurera variabler för distribution

Konfigurera variabelnamnen för arbetsytan, arbetsytans plats och slutpunkten som du vill skapa för användning med distributionen.

Följande kod exporterar dessa värden som miljövariabler i slutpunkten:

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

Ange sedan vad du vill ge bloblagringskontot, blobcontainern och filen namnet. Dessa variabelnamn definieras här och refereras till i az storage account create och az storage container create kommandon i nästa avsnitt.

Följande kod exporterar dessa värden som miljövariabler:

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

När dessa variabler har exporterats skapar du en textfil lokalt. När slutpunkten distribueras kommer bedömningsskriptet åt den här textfilen med hjälp av den systemtilldelade hanterade identiteten som genereras när slutpunkten skapas.

Definiera distributionskonfigurationen

Om du vill distribuera en onlineslutpunkt med CLI måste du definiera konfigurationen i en YAML-fil. Mer information om YAML-schemat finns i YAML-referensdokumentet för onlineslutpunkten.

YAML-filerna i följande exempel används för att skapa onlineslutpunkter.

Följande YAML-exempel finns vid slutpunkter/online/managed/managed-identities/1-sai-create-endpoint. Filen,

  • Definierar namnet som du vill referera till slutpunkten, my-sai-endpoint.
  • Anger vilken typ av auktorisering som ska användas för att komma åt slutpunkten, auth-mode: key.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

Det här YAML-exemplet, 2-sai-deployment.yml,

  • Anger att den typ av slutpunkt som du vill skapa är en online slutpunkt.
  • Anger att slutpunkten har en associerad distribution med namnet blue.
  • Konfigurerar information om distributionen, till exempel vilken modell som ska distribueras och vilken miljö och bedömningsskript som ska användas.
$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"

Skapa den hanterade identiteten

Om du vill komma åt Azure-resurser skapar du en systemtilldelad eller användartilldelad hanterad identitet för din onlineslutpunkt.

När du skapar en onlineslutpunkt genereras automatiskt en systemtilldelad hanterad identitet åt dig, så du behöver inte skapa en separat.

Skapa lagringskonto och container

I det här exemplet skapar du ett bloblagringskonto och en blobcontainer och laddar sedan upp den tidigare skapade textfilen till blobcontainern. Du ger onlineslutpunkten och den hanterade identiteten åtkomst till det här lagringskontot och blobcontainern.

Skapa först ett lagringskonto.

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

Skapa sedan blobcontainern i lagringskontot.

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

Ladda sedan upp textfilen till blobcontainern.

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

Skapa en onlineslutpunkt

Följande kod skapar en onlineslutpunkt utan att ange någon distribution.

Varning

Identiteten för en slutpunkt är oföränderlig. När slutpunkten skapas kan du associera den med en systemtilldelad identitet (standard) eller en användartilldelad identitet. Du kan inte ändra identiteten när slutpunkten har skapats.

När du skapar en onlineslutpunkt skapas som standard en systemtilldelad hanterad identitet för slutpunkten.

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

Kontrollera statusen för slutpunkten med följande.

az ml online-endpoint show --name $ENDPOINT_NAME

Om du stöter på problem kan du läsa Felsöka distribution och bedömning av onlineslutpunkter.

Ge åtkomstbehörighet till den hanterade identiteten

Viktigt!

Onlineslutpunkter kräver pull-behörighet för Azure Container Registry, AcrPull-behörighet till containerregistret och behörigheten Storage Blob Data Reader till arbetsytans standarddatalager.

Du kan ge onlineslutpunkten behörighet att komma åt lagringen via dess systemtilldelade hanterade identitet eller ge behörighet till den användartilldelade hanterade identiteten för att få åtkomst till lagringskontot som skapades i föregående avsnitt.

Hämta den systemtilldelade hanterade identiteten som skapades för slutpunkten.

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

Härifrån kan du ge den systemtilldelade hanterade identiteten behörighet att komma åt din lagring.

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

Bedömningsskript för åtkomst till Azure-resurs

Se följande skript för att förstå hur du använder din identitetstoken för att komma åt Azure-resurser, i det här scenariot det lagringskonto som skapades i föregående avsnitt.

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

Skapa en distribution med din konfiguration

Skapa en distribution som är associerad med onlineslutpunkten. Läs mer om att distribuera till onlineslutpunkter.

Varning

Den här distributionen kan ta cirka 8–14 minuter beroende på om den underliggande miljön/avbildningen skapas för första gången. Efterföljande distributioner med samma miljö går snabbare.

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

Kommentar

Argumentets --name värde kan åsidosätta name nyckeln i YAML-filen.

Kontrollera distributionens status.

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

Information om hur du förfinar ovanstående fråga för att endast returnera specifika data finns i Fråga azure CLI-kommandoutdata.

Kommentar

Init-metoden i bedömningsskriptet läser filen från ditt lagringskonto med hjälp av den systemtilldelade hanterade identitetstoken.

Information om hur du kontrollerar init-metodens utdata finns i distributionsloggen med följande kod.

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

När distributionen är klar registreras modellen, miljön och slutpunkten på din Azure Machine Learning-arbetsyta.

Testa slutpunkten

När din onlineslutpunkt har distribuerats testar och bekräftar du dess åtgärd med en begäran. Information om slutsatsdragning varierar från modell till modell. I den här guiden ser JSON-frågeparametrarna ut så här:

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

Anropa slutpunkten genom att köra:

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

Ta bort slutpunkten och lagringskontot

Om du inte planerar att fortsätta använda den distribuerade onlineslutpunkten och lagringen tar du bort dem för att minska kostnaderna. När du tar bort slutpunkten tas även alla dess associerade distributioner bort.

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