Azure Machine Learning のリソースとワークフローの認証を設定する

適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)

Azure CLI または Azure Machine Learning SDK v2 から Azure Machine Learning ワークスペースへの認証を設定する方法について説明します。 お使いの Azure Machine Learning ワークスペースには、多くの場合、Microsoft Entra ID を使用して認証されます。 ワークスペースに接続するときに使用できる認証ワークフローには、一般に次の 4 つがあります。

  • インタラクティブ: Microsoft Entra ID でアカウントを使用して、直接認証するか、認証に使用されるトークンを取得します。 対話型認証は、"実験および反復開発" 時に使用します。 対話型認証では、(Web サービスなどの) リソースへのアクセスを、ユーザーごとに制御できます。

  • サービス プリンシパル: Microsoft Entra ID でサービス プリンシパル アカウントを作成し、それを使用して認証を行うか、トークンを取得します。 サービス プリンシパルは、ユーザーが操作をせず、サービスに "自動認証されるプロセス" が必要な場合に使用します。 たとえば、トレーニング コードが変更されるたびにモデルをトレーニングおよびテストする継続的インテグレーションとデプロイ スクリプトです。

  • Azure CLIセッション: アクティブな Azure CLI セッションを使用して認証します。 Machine Learning 用の Azure CLI 拡張機能 (ml 拡張機能または CLI v2) は、Azure Machine Learning を操作するためのコマンド ライン ツールです。 Python コードに資格情報を格納したり、ユーザーに認証を求めることなく、ローカル ワークステーションの Azure CLI を使用して Azure にサインインできます。 同様に、継続的インテグレーションとデプロイ パイプラインの一部として同じスクリプトを再利用しながら、サービス プリンシパル ID で Azure CLI を認証できます。

  • マネージド ID: Azure Machine Learning SDK v2 を "コンピューティング インスタンス" または "Azure 仮想マシン" で使用する場合は、Azure のマネージド ID を使用できます。 このワークフローでは、Python コードに資格情報を保存したり、ユーザーに認証を求めずに、マネージド ID を使用して VM をワークスペースに接続したりすることが許可されます。 "モデルのトレーニング時" に、Azure Machine Learning コンピューティング クラスターをマネージド ID を使用してワークスペースにアクセスするように構成することもできます。

Azure ロールベースのアクセス制御 (Azure RBAC) は、使用する認証のワークフローに関係なく、リソースに対して許可するアクセス レベル (認証) の範囲の設定に使用します。 たとえば、管理者または自動化プロセスには、コンピューティング インスタンスを作成するアクセス権は持っていても、それを使用できない場合があり、それを使用できるデータ サイエンティストが、それを削除または作成できない場合があります。 詳細については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。

Microsoft Entra 条件付きアクセスを使用して、各認証ワークフローのワークスペースへのアクセスをさらに制御または制限できます。 たとえば、管理者はマネージド デバイスからのワークスペース アクセスのみを許可できます。

前提条件

Microsoft Entra ID

お使いのワークスペースのすべての認証ワークフローは、Microsoft Entra ID に依存しています。 ユーザーに個人アカウントを使用して認証させる場合、自分の Microsoft Entra ID にアカウントが必要です。 サービス プリンシパルを使用する場合は、それらが自分の Microsoft Entra ID にある必要があります。 マネージド ID は Microsoft Entra ID の機能でもあります。

Microsoft Entra ID の詳細については、「Microsoft Entra 認証とは」を参照してください。

Microsoft Entra アカウントを作成したら、ワークスペースにアクセスする方法および Azure Machine Learning でのその他の操作に関する情報を、「Azure Machine Learning ワークスペースへのアクセスの管理」でご確認ください。

対話型認証の使用

適用対象: Python SDK azure-ai-ml v2 (現行)

対話型認証では、Python 用の Azure Identity パッケージが使用されます。 ほとんどの例では、DefaultAzureCredential を使用して資格情報にアクセスします。 トークンが必要な場合は、複数の ID (EnvironmentCredentialManagedIdentityCredentialSharedTokenCacheCredentialVisualStudioCodeCredentialAzureCliCredentialAzurePowerShellCredential) を使用してトークンを要求し、トークンが提供されると停止します。 詳細については、DefaultAzureCredential クラスのリファレンスを参照してください。

DefaultAzureCredential を使用して認証する例を次に示します。 DefaultAzureCredential を使用した認証が失敗した場合は、Web ブラウザーからの認証のフォールバックが代わりに使用されます。

from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential

try:
    credential = DefaultAzureCredential()
    # Check if given credential can get token successfully.
    credential.get_token("https://management.azure.com/.default")
except Exception as ex:
    # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work
    # This will open a browser page for
    credential = InteractiveBrowserCredential()

資格情報オブジェクトが作成されると、MLClient クラスを使用してワークスペースに接続します。 たとえば、次のコードでは、from_config() メソッドを使用して接続情報を読み込みます。

from azure.ai.ml import MLClient
try:
    ml_client = MLClient.from_config(credential=credential)
except Exception as ex:
    # NOTE: Update following workspace information to contain
    #       your subscription ID, resource group name, and workspace name
    client_config = {
        "subscription_id": "<SUBSCRIPTION_ID>",
        "resource_group": "<RESOURCE_GROUP>",
        "workspace_name": "<AZUREML_WORKSPACE_NAME>",
    }

    # write and reload from config file
    import json, os

    config_path = "../.azureml/config.json"
    os.makedirs(os.path.dirname(config_path), exist_ok=True)
    with open(config_path, "w") as fo:
        fo.write(json.dumps(client_config))
    ml_client = MLClient.from_config(credential=credential, path=config_path)

print(ml_client)

サービス プリンシパルの構成

サービス プリンシパル (SP) を使用するには、最初に SP を作成する必要があります。 次に、お使いのワークスペースへのアクセス権を SP に付与します。 既に説明したように、Azure のロールベースのアクセス制御 (Azure RBAC) を使用してアクセスを制御するため、SP に付与するアクセス権も決定する必要があります。

重要

サービス プリンシパルを使用する場合は、使用するタスクに必要な最小限のアクセス権を付与します。 たとえば、サービス プリンシパルが Web デプロイのアクセス トークンを読み取るためにのみ使用される場合は、所有者または共同作成者のアクセス権は付与しません。

最小限のアクセス権を付与する理由は、サービス プリンシパルがパスワードを使用して認証を行うためであり、パスワードがオートメーション スクリプトの一部として格納される可能性があるからです。 パスワードが漏洩した場合、特定のタスクに必要な最小限のアクセス権のみを保持しているため、SP が悪意を持って使用される可能性が最小限に抑えられます。

SP を作成し、ワークスペースへのアクセス権を付与する最も簡単な方法は、Azure CLIを使用することです。 サービス プリンシパルを作成して、ワークスペースへのアクセス権を付与するには、次の手順に従います。

注意

これらのすべての手順を実行するには、サブスクリプションの管理者である必要があります。

  1. Azure サブスクリプションに対して認証を行います。

    az login
    

    CLI で既定のブラウザーを開くことができる場合、開いたブラウザにサインイン ページが読み込まれます。 それ以外の場合は、ブラウザーを開き、コマンド ラインの指示に従う必要があります。 この手順では、https://aka.ms/devicelogin にアクセスして認証コードを入力する必要があります。

    Azure のサブスクリプションが複数ある場合、az account set -s <subscription name or ID> コマンドを使用してサブスクリプションを設定できます。 詳しくは、「Use multiple Azure subscriptions (複数の Azure サブスクリプションを使用する)」をご覧ください。

    その他の認証方法については、「Azure CLI を使用してサインインする」を参照してください。

  2. サービス プリンシパルを作成します。 次の例では、ml auth という名前の SP が作成されます。

    az ad sp create-for-rbac --json-auth --name ml-auth --role Contributor --scopes /subscriptions/<subscription id>
    

    --json-auth パラメーターは、Azure CLI バージョン 2.51.0 以降で使用できます。 これよりも前のバージョンでは --sdk-auth を使用します。

    出力は次のような JSON になります。 この記事の他の手順で必要になるため、clientIdclientSecrettenantId の各フィールドをメモしておきます。

    {
        "clientId": "your-client-id",
        "clientSecret": "your-client-secret",
        "subscriptionId": "your-sub-id",
        "tenantId": "your-tenant-id",
        "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
        "resourceManagerEndpointUrl": "https://management.azure.com",
        "activeDirectoryGraphResourceId": "https://graph.windows.net",
        "sqlManagementEndpointUrl": "https://management.core.windows.net:5555",
        "galleryEndpointUrl": "https://gallery.azure.com/",
        "managementEndpointUrl": "https://management.core.windows.net"
    }
    
  3. 前の手順で返された clientId 値を使用して、サービス プリンシパルの詳細を取得します。

    az ad sp show --id your-client-id
    

    次の JSON は、コマンドからの出力を簡略化した例です。 次の手順で値が必要になるため、objectId フィールドをメモしておきます。

    {
        "accountEnabled": "True",
        "addIns": [],
        "appDisplayName": "ml-auth",
        ...
        ...
        ...
        "objectId": "your-sp-object-id",
        "objectType": "ServicePrincipal"
    }
    
  4. Azure Machine Learning によって使用されるワークスペースやその他のリソースへのアクセス権を付与するには、次の記事の情報を使用します。

    重要

    所有者アクセスを使用すると、サービス プリンシパルは、ワークスペースでほぼすべての操作を実行できます。 このドキュメントでは、アクセス権を付与する方法を説明するために使用されています。運用環境では、目的のロールを実行するために必要な最小限のアクセス権をサービス プリンシパルに付与することをお勧めします。 自分のシナリオに必要なアクセス権を持つカスタム ロールの作成に関する情報については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。

マネージド ID の構成

重要

マネージド ID は、Azure Machine Learning SDK を Azure Virtual Machine、Azure Machine Learning のコンピューティング クラスターまたはコンピューティング インスタンスから使用する場合にのみサポートされます。

VM でのマネージド ID

  1. VM 上の Azure リソースに対して、システムで割り当てられたマネージド ID を有効にしてください

  2. Azure portal でワークスペースを選択し、 [Access Control (IAM)](アクセス制御 (IAM)) をクリックします。

  3. [Add](追加)[Add Role Assignment](ロールの割り当ての追加) を順にクリックし、 [Add role assignmen](ロールの割り当ての追加) ページを開きます。

  4. マネージド ID を割り当てるロールを選択します。 たとえば、閲覧者を選択します。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

コンピューティング クラスターでのマネージド ID

詳細については、コンピューティング クラスターでのマネージド ID の設定に関する説明を参照してください。

コンピューティング インスタンスでのマネージド ID

詳細については、コンピューティング インスタンスでのマネージド ID の設定に関する説明を参照してください。

サービス プリンシパル認証を使用する

適用対象: Python SDK azure-ai-ml v2 (現行)

サービス プリンシパルを使用した認証では、Python 用の Azure Identity パッケージが使用されます。 DefaultAzureCredential クラスは、次の環境変数を検索し、サービス プリンシパルとして認証するときに値を使用します。

  • AZURE_CLIENT_ID - サービス プリンシパルの作成時に返されるクライアント ID。
  • AZURE_TENANT_ID - サービス プリンシパルの作成時に返されるテナント ID。
  • AZURE_CLIENT_SECRET - サービス プリンシパル用に生成されたパスワード/資格情報。

ヒント

開発時には、python-dotenv パッケージを使用してこれらの環境変数を設定することを検討してください。 python-dotenv は、.env ファイルから環境変数を読み込みます。 Python 用の標準の .gitignore ファイルでは .env ファイルが自動的に除外されるため、開発時には GitHub リポジトリにチェックインしないでください。

python-dotenv を使用して .env ファイルから環境変数を読み込んでから、DefaultAzureCredential を使用して資格情報オブジェクトを作成する例を次に示します。

from dotenv import load_dotenv

if ( os.environ['ENVIRONMENT'] == 'development'):
    print("Loading environment variables from .env file")
    load_dotenv(".env")

from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
# Check if given credential can get token successfully.
credential.get_token("https://management.azure.com/.default")

資格情報オブジェクトが作成されると、MLClient クラスを使用してワークスペースに接続します。 たとえば、次のコードでは、from_config() メソッドを使用して接続情報を読み込みます。

try:
    ml_client = MLClient.from_config(credential=credential)
except Exception as ex:
    # NOTE: Update following workspace information to contain
    #       your subscription ID, resource group name, and workspace name
    client_config = {
        "subscription_id": "<SUBSCRIPTION_ID>",
        "resource_group": "<RESOURCE_GROUP>",
        "workspace_name": "<AZUREML_WORKSPACE_NAME>",
    }

    # write and reload from config file
    import json, os

    config_path = "../.azureml/config.json"
    os.makedirs(os.path.dirname(config_path), exist_ok=True)
    with open(config_path, "w") as fo:
        fo.write(json.dumps(client_config))
    ml_client = MLClient.from_config(credential=credential, path=config_path)

print(ml_client)

サービス プリンシパルを使用して、Azure Machine Learning REST API に対する認証を行うこともできます。 Microsoft Entra ID のクライアント資格情報付与フローを使用します。これにより、自動化されたワークフローでヘッドレス認証に対するサービス間の呼び出しが許可されます。

重要

資格情報を取得するために Azure Active Directory 認証ライブラリ (ADAL) を現在使用している場合は、Microsoft Authentication Library (MSAL) に移行することをお勧めします。 ADAL のサポートは、2022 年 6 月 30 日に終了しました。

MSAL での認証の詳細とサンプルについては、次の記事を参照してください。

マネージド ID 認証を使用する

適用対象: Python SDK azure-ai-ml v2 (現行)

マネージド ID を使用した認証では、Python 用の Azure Identity パッケージが使用されます。 マネージド ID を使用して構成されている VM またはコンピューティング クラスターからワークスペースに認証するには、DefaultAzureCredential クラスを使用します。 このクラスでは、マネージド ID が使用されているかどうかを自動的に検出し、マネージド ID を使用して Azure サービスに対する認証を行います。

DefaultAzureCredential クラスを使用して資格情報オブジェクトを作成してから、MLClient クラスを使用してワークスペースに接続する例を次に示します。

from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
# Check if given credential can get token successfully.
credential.get_token("https://management.azure.com/.default")

try:
    ml_client = MLClient.from_config(credential=credential)
except Exception as ex:
    # NOTE: Update following workspace information to contain
    #       your subscription ID, resource group name, and workspace name
    client_config = {
        "subscription_id": "<SUBSCRIPTION_ID>",
        "resource_group": "<RESOURCE_GROUP>",
        "workspace_name": "<AZUREML_WORKSPACE_NAME>",
    }

    # write and reload from config file
    import json, os

    config_path = "../.azureml/config.json"
    os.makedirs(os.path.dirname(config_path), exist_ok=True)
    with open(config_path, "w") as fo:
        fo.write(json.dumps(client_config))
    ml_client = MLClient.from_config(credential=credential, path=config_path)

print(ml_client)

条件付きアクセスを使用する

管理者は、ワークスペースにユーザーがサインインするためのサインイン Microsoft Entra 条件付きアクセス ポリシーを適用できます。 たとえば、2 要素認証を要求したり、マネージド デバイスからのサインインのみを許可したりできます。 Azure Machine Learning ワークスペースに特定して条件付きアクセスを使用するには、Azure Machine Learning という名前のアプリに条件付きアクセス ポリシーを割り当てる必要があります。 アプリ ID は 0736f41a-0425-bdb5-1563eff02385 です。

次のステップ