Configurare l'autenticazione per i modelli distribuiti come servizi Web

SI APPLICA A: Python SDK azureml v1

Azure Machine Learning consente di distribuire i modelli di machine learning sottoposti a training come servizi Web. Questo articolo illustra come configurare l'autenticazione per queste distribuzioni.

Le distribuzioni modello create da Azure Machine Learning possono essere configurate per usare uno di due metodi di autenticazione:

  • basato su chiave: viene usata una chiave statica per l'autenticazione al servizio Web.

  • basato su token: un token temporaneo deve essere ottenuto dall'area di lavoro di Azure Machine Learning (usando Microsoft Entra ID) e usato per eseguire l'autenticazione al servizio Web. Questo token scade dopo un periodo di tempo e deve essere aggiornato per continuare a lavorare con il servizio Web.

    Nota

    L'autenticazione basata su token è disponibile solo quando si esegue la distribuzione nel servizio Azure Kubernetes.

Autenticazione basata su chiave

I servizi Web distribuiti nel servizio Azure Kubernetes (AKS) hanno l'autenticazione basata su chiavi abilitata per impostazione predefinita.

I servizi distribuiti di Istanze di Azure Container (ACI) hanno l'autenticazione basata su chiave disabilitata per impostazione predefinita, ma può essere abilitata impostando auth_enabled=Truedurante la creazione del servizio Web ACI. Il codice seguente è un esempio di creazione di una configurazione di distribuzione ACI con l'autenticazione basata su chiave abilitata.

from azureml.core.webservice import AciWebservice

aci_config = AciWebservice.deploy_configuration(cpu_cores = 1,
                                                memory_gb = 1,
                                                auth_enabled=True)

È quindi possibile usare la configurazione personalizzata di Istanze di Azure Container nella distribuzione usando la classe Model.

from azureml.core.model import Model, InferenceConfig


inference_config = InferenceConfig(entry_script="score.py",
                                   environment=myenv)
aci_service = Model.deploy(workspace=ws,
                       name="aci_service_sample",
                       models=[model],
                       inference_config=inference_config,
                       deployment_config=aci_config)
aci_service.wait_for_deployment(True)

Per recuperare il token di autenticazione usare aci_service.get_keys(). Per rigenerare una chiave, usare la funzione regen_key() e passare Primaria o Secondaria.

aci_service.regen_key("Primary")
# or
aci_service.regen_key("Secondary")

Autenticazione basata su token

Quando si abilita l'autenticazione tramite token per un servizio Web, gli utenti devono presentare un token JSON Web di Azure Machine Learning al servizio Web per accedervi. Il token scade dopo un periodo di tempo specificato e deve essere aggiornato per continuare a eseguire chiamate.

  • L'autenticazione tramite token è disabilitata per impostazione predefinita quando si esegue la distribuzione al servizio Azure Kubernetes.
  • L'autenticazione tramite token non è supportata quando si esegue la distribuzione a Istanze di Azure Container.
  • L'autenticazione basata su token non può essere usata contemporaneamente all'autenticazione basata su chiave.

Per controllare l'autenticazione tramite token, usare il parametro token_auth_enabled quando si crea o si aggiorna una distribuzione:

from azureml.core.webservice import AksWebservice
from azureml.core.model import Model, InferenceConfig

# Create the config
aks_config = AksWebservice.deploy_configuration()

#  Enable token auth and disable (key) auth on the webservice
aks_config = AksWebservice.deploy_configuration(token_auth_enabled=True, auth_enabled=False)

aks_service_name ='aks-service-1'

# deploy the model
aks_service = Model.deploy(workspace=ws,
                           name=aks_service_name,
                           models=[model],
                           inference_config=inference_config,
                           deployment_config=aks_config,
                           deployment_target=aks_target)

aks_service.wait_for_deployment(show_output = True)

Se l'autenticazione tramite token è abilitata, è possibile usare il metodo get_token per recuperare un token JSON Web (JWT) e la data di scadenza del token:

Suggerimento

Se si usa un'entità servizio per ottenere il token e si vuole che abbia l'accesso minimo necessario per recuperare un token, assegnarlo al ruolo di lettore per l'area di lavoro.

token, refresh_by = aks_service.get_token()
print(token)

Importante

Al termine della durata del token refresh_by, sarà necessario richiedere un nuovo token. Se è necessario aggiornare i token al di fuori di Python SDK, un'opzione consiste nell'usare l'API REST con l'autenticazione dell'entità servizio per effettuare periodicamente la chiamata service.get_token(), come illustrato in precedenza.

È consigliabile creare l'area di lavoro Azure Machine Learning nella stessa area del cluster del servizio Azure Kubernetes.

Per eseguire l'autenticazione con un token, il servizio Web effettuerà una chiamata all'area in cui viene creata l'area di lavoro Azure Machine Learning. Se la regione dell'area di lavoro non è disponibile, non sarà possibile recuperare un token per il servizio Web, anche se il cluster si trova in una regione diversa dall'area di lavoro. Il risultato è che l'autenticazione di Microsoft Entra non è disponibile fino a quando la regione dell'area di lavoro non è nuovamente disponibile.

Inoltre, maggiore è la distanza tra la regione del cluster e quella dell'area di lavoro, più tempo sarà necessario per recuperare un token.

Passaggi successivi

Per ulteriori informazioni sull'autenticazione in un modello distribuito, vedere Creare un client per un modello distribuito come servizio Web.