サービス プリンシパルを使用して Azure Quantum ワークスペースで認証する方法

対話型認証を使用することや、ユーザー アカウントとして認証することが適さない場合があります。 このような状況は、Web サービス、別の worker ロール、または自動化されたシステムからジョブを送信する場合に発生する可能性があります。 オプションの 1 つは、マネージド ID を構成することで、もう 1 つのオプションは、サービス プリンシパルを使用することです。この記事では、サービス プリンシパルについて説明します。

前提条件: サービス プリンシパルとアプリケーション シークレットを作成する

サービス プリンシパルとして認証するには、まずサービス プリンシパルを作成する必要があります。

サービス プリンシパルを作成し、アクセスを割り当てて、資格情報を生成するには、次のようにします。

  1. Azure AD アプリケーションを作成します。

    Note

    リダイレクト URI を設定する必要はありません。

    1. 作成されたら、[アプリケーション (クライアント) ID][ディレクトリ (テナント) ID] をメモします。
  2. アプリケーションとしてサインインするための資格情報を作成します。

    1. アプリケーションの設定で、[説明書とシークレット] を選択します。
    2. [クライアント シークレット] で、[新しいシークレットの作成] を選択します。
    3. 説明と期間を入力し、[追加] を選択します。
    4. シークレットの値をすぐに安全な場所にコピーしてください。もう一度確認することはできません。
  3. ワークスペースにアクセスするためのサービス プリンシパルのアクセス許可を付与します。

    1. Azure Portalを開きます。
    2. 検索バーに、ワークスペースを作成したリソース グループの名前を入力します。 結果に表示されるリソース グループを選択します。
    3. リソース グループの概要で [アクセス制御 (IAM)] を選択します。
    4. [ロールの割り当ての追加] を選択します。
    5. サービス プリンシパルを検索して、選択します。
    6. [共同作成者] または [所有者] のどちらかのロールを割り当てます。

Note

リソース グループまたはワークスペースにロールの割り当てを作成するには、ロールの割り当てのスコープで "所有者" または "ユーザー アクセス管理者" である必要があります。 サブスクリプションでサービス プリンシパルを作成するアクセス許可がない場合、Azure サブスクリプションの "所有者" または "管理者" からアクセス許可をリクエストする必要があります。

リソース グループまたはワークスペース レベルでのみアクセス許可がある場合、次を使用して、共同作成者ロールでサービス プリンシパルを作成できます。

az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<SUBSCRIPTION-ID>

サービス プリンシパルとして認証する

オプション 1: 環境変数の使用: Workspace オブジェクトの作成で使用される既定の資格情報は、DefaultAzureCredential です。これによって、いくつかの種類の認証が試行されます。 最初の 1 つが EnvironmentCredential です。これを使用して、次の環境変数を介してサービス プリンシパルの資格情報を渡します。

  • AZURE_TENANT_ID: サービス プリンシパルのテナントの ID。 その "ディレクトリ" ID とも呼ばれます。
  • AZURE_CLIENT_ID: サービス プリンシパルのクライアント ID。
  • AZURE_CLIENT_SECRET: サービス プリンシパルのクライアント シークレットの 1 つ。

オプション 2: ClientSecretCredential の使用: Workspace オブジェクトのインスタンス化の間に ClientSecretCredential を渡すか、credentials プロパティを設定します。

from azure.identity import ClientSecretCredential

tenant_id = os.environ["AZURE_TENANT_ID"]
client_id = os.environ["AZURE_CLIENT_ID"]
client_secret = os.environ["AZURE_CLIENT_SECRET"]
credential = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)

workspace.credentials = credential

Note

workspace.login() メソッドは非推奨であり、不要です。 サービスが初めて呼び出されると、Workspace コンストラクターまたはその credentials プロパティで渡された資格情報を使用して、認証が試行されます。 資格情報が渡されなかった場合、DefaultAzureCredential によっていくつかの認証方法が試行されます。