Přístup k prostředkům Azure z online koncového bodu pomocí spravované identity

PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)

Zjistěte, jak získat přístup k prostředkům Azure z hodnoticího skriptu pomocí online koncového bodu a spravované identity přiřazené systémem nebo spravované identity přiřazené uživatelem.

Spravované koncové body i koncové body Kubernetes umožňují službě Azure Machine Učení spravovat zátěž zřizování výpočetního prostředku a nasazování modelu strojového učení. Váš model obvykle potřebuje přístup k prostředkům Azure, jako je Azure Container Registry nebo úložiště objektů blob pro odvozování. se spravovanou identitou můžete k těmto prostředkům přistupovat bez nutnosti spravovat přihlašovací údaje ve vašem kódu. Přečtěte si další informace o spravovaných identitách.

V této příručce se předpokládá, že nemáte spravovanou identitu, účet úložiště ani online koncový bod. Pokud už tyto komponenty máte, přejděte do části Udělení oprávnění pro přístup ke spravované identitě .

Požadavky

  • Pokud chcete používat Učení Azure Machine, musíte mít předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet. Vyzkoušejte si bezplatnou nebo placenou verzi služby Azure Machine Učení ještě dnes.

  • Nainstalujte a nakonfigurujte rozšíření Azure CLI a ML (v2). Další informace najdete v tématu Instalace, nastavení a použití rozhraní příkazového řádku 2.0.

  • Skupina prostředků Azure, ve které vy (nebo instanční objekt, který používáte), musí mít uživatelský přístup Správa istrator a přispěvatel. Takovou skupinu prostředků máte, pokud jste nakonfigurovali rozšíření ML podle předchozího článku.

  • Pracovní prostor služby Azure Machine Learning. Pokud jste nakonfigurovali rozšíření ML podle předchozího článku, už máte pracovní prostor.

  • Trénovaný model strojového učení připravený k bodování a nasazení Pokud sledujete společně s ukázkou, je k dispozici model.

  • Pokud jste ještě nenastavili výchozí hodnoty pro Azure CLI, uložte výchozí nastavení. Pokud se chcete vyhnout předávání hodnot pro vaše předplatné, pracovní prostor a skupinu prostředků několikrát, spusťte tento kód:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Pokud chcete postupovat podle ukázky, naklonujte úložiště ukázek a pak změňte adresář na cli.

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

Omezení

  • Identita koncového bodu je neměnná. Během vytváření koncového bodu ho můžete přidružit k identitě přiřazené systémem (výchozí) nebo k identitě přiřazené uživatelem. Identitu po vytvoření koncového bodu nemůžete změnit.
  • Pokud je vaše úložiště ARC a objektů blob nakonfigurované jako privátní, to znamená za virtuální sítí, měl by být přístup z koncového bodu Kubernetes přes privátní propojení bez ohledu na to, jestli je váš pracovní prostor veřejný nebo privátní. Další podrobnosti o nastavení privátního propojení najdete v tématu Postup zabezpečení virtuální sítě pracovního prostoru.

Konfigurace proměnných pro nasazení

Nakonfigurujte názvy proměnných pro pracovní prostor, umístění pracovního prostoru a koncový bod, který chcete vytvořit pro použití s vaším nasazením.

Následující kód exportuje tyto hodnoty jako proměnné prostředí ve vašem koncovém bodu:

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

Dále určete, co chcete pojmenovat účet úložiště objektů blob, kontejner objektů blob a soubor. Tyto názvy proměnných jsou zde definovány a v další části jsou odkazované az storage account createaz storage container create na příkazy.

Následující kód tyto hodnoty exportuje jako proměnné prostředí:

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

Po exportu těchto proměnných vytvořte textový soubor místně. Po nasazení koncového bodu skript bodování přistupuje k tomuto textovému souboru pomocí spravované identity přiřazené systémem, která se vygeneruje při vytváření koncového bodu.

Definování konfigurace nasazení

Pokud chcete nasadit online koncový bod pomocí rozhraní příkazového řádku, musíte definovat konfiguraci v souboru YAML. Další informace o schématu YAML najdete v referenčním dokumentu YAML o online koncovém bodu.

Soubory YAML v následujících příkladech slouží k vytváření online koncových bodů.

Následující příklad YAML se nachází na koncových bodech, online, managed/managed-identities/1-sai-create-endpoint. Soubor,

  • Definuje název, kterým chcete odkazovat na koncový bod. my-sai-endpoint
  • Určuje typ autorizace, který se má použít pro přístup ke koncovému bodu. auth-mode: key
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

Tento příklad YAML, 2-sai-deployment.yml,

  • Určuje, že typ koncového bodu, který chcete vytvořit, je online koncový bod.
  • Označuje, že koncový bod má přidružené nasazení s názvem blue.
  • Konfiguruje podrobnosti o nasazení, například který model se má nasadit a které prostředí a bodovací skript použít.
$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"

Vytvoření spravované identity

Pokud chcete získat přístup k prostředkům Azure, vytvořte spravovanou identitu přiřazenou systémem nebo přiřazenou uživatelem pro váš online koncový bod.

Když vytvoříte online koncový bod, automaticky se vygeneruje spravovaná identita přiřazená systémem, takže nemusíte vytvářet samostatnou identitu.

Vytvoření účtu úložiště a kontejneru

V tomto příkladu vytvořte účet úložiště objektů blob a kontejner objektů blob a potom nahrajte dříve vytvořený textový soubor do kontejneru objektů blob. Udělíte online koncovému bodu a spravované identitě přístup k tomuto účtu úložiště a kontejneru objektů blob.

Nejprve vytvořte účet úložiště.

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

Dále vytvořte kontejner objektů blob v účtu úložiště.

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

Pak nahrajte textový soubor do kontejneru objektů blob.

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

Vytvoření online koncového bodu

Následující kód vytvoří online koncový bod bez zadání nasazení.

Upozorňující

Identita koncového bodu je neměnná. Během vytváření koncového bodu ho můžete přidružit k identitě přiřazené systémem (výchozí) nebo k identitě přiřazené uživatelem. Identitu po vytvoření koncového bodu nemůžete změnit.

Když vytvoříte online koncový bod, pro koncový bod se ve výchozím nastavení vytvoří spravovaná identita přiřazená systémem.

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

Pomocí následujícího příkazu zkontrolujte stav koncového bodu.

az ml online-endpoint show --name $ENDPOINT_NAME

Pokud narazíte na nějaké problémy, přečtěte si téma Řešení potíží s nasazením a vyhodnocováním online koncových bodů.

Udělení oprávnění k přístupu spravované identitě

Důležité

Online koncové body vyžadují oprávnění služby Azure Container Registry k vyžádání obsahu, oprávnění AcrPull k registru kontejneru a oprávnění čtenáře dat objektů blob služby Storage k výchozímu úložišti dat pracovního prostoru.

Můžete povolit online koncovému bodu přístup k vašemu úložišti prostřednictvím spravované identity přiřazené systémem nebo udělit oprávnění spravované identitě přiřazené uživatelem pro přístup k účtu úložiště vytvořenému v předchozí části.

Načtěte spravovanou identitu přiřazenou systémem, která byla vytvořena pro váš koncový bod.

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

Odtud můžete udělit spravované identitě přiřazené systémem oprávnění pro přístup k úložišti.

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

Bodovací skript pro přístup k prostředku Azure

V následujícím skriptu se dozvíte, jak používat token identity pro přístup k prostředkům Azure, v tomto scénáři účet úložiště vytvořený v předchozích částech.

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

Vytvoření nasazení s konfigurací

Vytvořte nasazení, které je přidružené k online koncovému bodu. Přečtěte si další informace o nasazení do online koncových bodů.

Upozorňující

Toto nasazení může trvat přibližně 8 až 14 minut v závislosti na tom, jestli se podkladové prostředí nebo image sestavují poprvé. Další nasazení používající stejné prostředí budou rychlejší.

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

Poznámka:

Hodnota argumentu --name může přepsat name klíč uvnitř souboru YAML.

Zkontrolujte stav nasazení.

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

Pokud chcete výše uvedený dotaz upřesnit tak, aby vracel jenom konkrétní data, přečtěte si téma Dotazování výstupu příkazu Azure CLI.

Poznámka:

Inicializační metoda ve skriptu bodování načte soubor z vašeho účtu úložiště pomocí tokenu spravované identity přiřazeného systémem.

Pokud chcete zkontrolovat výstup inicializační metody, projděte si protokol nasazení s následujícím kódem.

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

Po dokončení nasazení se model, prostředí a koncový bod zaregistrují do vašeho pracovního prostoru Azure Machine Učení.

Testování koncového bodu

Po nasazení online koncového bodu otestujte a potvrďte její operaci pomocí požadavku. Podrobnosti odvozování se liší od modelu po model. V tomto průvodci vypadají parametry dotazu JSON takto:

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

Pokud chcete volat koncový bod, spusťte:

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

Odstranění koncového bodu a účtu úložiště

Pokud nechcete dál používat nasazený online koncový bod a úložiště, odstraňte je, abyste snížili náklady. Když koncový bod odstraníte, odstraní se také všechna jeho přidružená nasazení.

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