Microsoft Entra ID を使用した Azure Batch サービスの認証

Azure Batch では、Microsoft のマルチテナント クラウド ベースのディレクトリおよび ID の管理サービスである Microsoft Entra ID での認証がサポートされています。 Azure では、Microsoft Entra ID を使用して、それ自体の顧客、サービス管理者、組織のユーザーを認証します。

この記事では、Azure Batch で Microsoft Entra 認証を使用する 2 つの方法について説明します:

  • 統合認証は、アプリケーションを操作しているユーザーを認証します。 アプリケーションでは、ユーザーの資格情報を収集し、それらの資格情報を使用して Batch リソースへのアクセスを承認します。

  • サービス プリンシパルは、自動実行アプリケーションを認証します。 サービス プリンシパルでは、アプリケーションのポリシーとアクセス許可を定義し、実行時に Batch リソースにアクセスするアプリケーションを示します。

Microsoft Entra ID の詳細については、「Microsoft Entra ドキュメント」を参照してください。

認証のためにエンドポイントを収集する

Microsoft Entra ID で Batch アプリケーションを認証するには、Microsoft Entra エンドポイントと Batch リソース エンドポイントをコードに含める必要があります。

Microsoft Entra エンドポイント

基本の Microsoft Entra 機関エンドポイントが https://login.microsoftonline.com/ です。 Microsoft Entra ID で認証するには、認証に使用する Microsoft Entra テナントを識別する テナント ID を指定して、このエンドポイントを使用します:

https://login.microsoftonline.com/<tenant-id>

テナント ID は、Azure portal の メイン Microsoft Entra ID ページから取得できます。 左側のナビゲーションで [プロパティ] を選んで、[プロパティ] ページに [テナント ID] を表示することもできます。

Screenshot of the Tenant ID in the Azure portal.

重要

  • サービス プリンシパルを使用して認証する場合は、テナント固有の Microsoft Entra エンドポイントが必要です。

  • 統合認証を使用して認証する場合は、テナント固有のエンドポイントをお勧めしますが、必須ではありません。 また、特定のテナントが指定されていない場合に、Microsoft Entra 共通エンドポイントを使用して、汎用的な資格情報収集インターフェイスを提供することもできます。 共通のエンドポイントは、https://login.microsoftonline.com/common です。

Azure AD エンドポイントの詳細については、「認証と認可」を参照してください。

Batch リソース エンドポイント

Batch リソース エンドポイント https://batch.core.windows.net/ を使用して、Batch サービスへの要求を認証するためのトークンを取得します。

アプリケーションをテナントに登録する

Microsoft Entra 認証を使用する際の最初の手順は、Microsoft Entra テナントにアプリケーションを登録することです。 アプリケーションを登録すると、コードから Microsoft Authentication Library (MSAL) を呼び出すことができます。 MSAL には、アプリケーションから Microsoft Entra ID で認証するための API が用意されています。 使用するのが統合認証であるかサービス プリンシパルであるかに関わらず、アプリケーションの登録は必須です。

アプリケーションの登録では、使用するアプリケーションに関する情報を Microsoft Entra ID に提供します。 Microsoft Entra ID は、実行時にアプリケーションを Microsoft Entra ID に関連付けるために使用する、アプリケーション ID (クライアント ID とも呼ばれます) を提供します。 アプリケーション ID の詳細については、「Microsoft Entra ID のアプリケーション オブジェクトとサービス プリンシパル オブジェクト」を参照してください。

Batch アプリケーションを登録するには、「アプリケーションを登録する」の手順に従います。

アプリケーションを登録すると、アプリケーションの [概要] ページでアプリケーション (クライアント) ID を確認できます。

Screenshot of the Application ID shown in the Azure portal.

統合認証を構成する

統合認証で認証するには、Batch サービス API に接続するためのアクセス許可をアプリケーションに付与する必要があります。 この手順により、アプリケーションで Microsoft Entra ID を使用して Batch サービス API の呼び出しを認証できるようになります。

アプリケーションを登録したら、次の手順に従って、アプリケーションに Batch サービスへのアクセス権を付与します。

  1. Azure portal で、[アプリの登録] を検索し、選びます。
  2. [アプリの登録] ページで、お使いのアプリケーションを選びます。
  3. お使いのアプリケーションのページで、左側のナビゲーションから [API permissions] (API のアクセス許可) を選びます。
  4. [API のアクセス許可] ページで、 [アクセス許可の追加] を選択します。
  5. [Request API permissions] (API のアクセス許可の要求) ページで、[Azure Batch] を選びます。
  6. [Azure Batch] ページの [アクセス許可の選択] で、user_impersonation の横にあるチェック ボックスをオンにし、[アクセス許可の追加] を選びます。

これで、「API のアクセス許可」 ページに、Microsoft Entra アプリケーションから Microsoft GraphAzure Batch の両方にアクセスできることが示されます。 アプリを Microsoft Entra ID に登録する際に、Microsoft Graph へのアクセス許可が自動的に付与されます。

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

無人で実行するアプリケーションを認証するには、サービス プリンシパルを使用します。 アプリケーションではサービス プリンシパルを使用して認証するときに、アプリケーション ID と秘密鍵の両方を Microsoft Entra ID に送信します。

アプリケーションを登録した後、Azure portal で次の手順に従って、サービス プリンシパルを構成します。

  1. アプリケーションのシークレットを要求します。
  2. アプリケーションに Azure ロールベースのアクセス制御 (Azure RBAC) を割り当てます。

アプリケーションのシークレットを要求する

次の手順に従って、コードで使用する秘密鍵を作成し、コピーします。

  1. Azure portal で、[アプリの登録] を検索し、選びます。
  2. [アプリの登録] ページで、お使いのアプリケーションを選びます。
  3. アプリケーションのページで、左側のナビゲーションから [証明書とシークレット] を選択します。
  4. [証明書とシークレット] ページで 、[新しいクライアント シークレット] を選択 します
  5. [Add a client secret] (クライアント シークレットの追加) ページで、説明を入力し、シークレットの有効期限を選びます。
  6. [追加] を選択してシークレットを作成し、[証明書とシークレット] ページに表示します。
  7. シークレットのは、このページを離れると再度アクセスできなくなるため、安全な場所にコピーします。 キーにアクセスできなくなった場合は、新しいものを生成できます。

アプリケーションに Azure RBAC を割り当てる

アプリケーションに Azure RBAC ロールを割り当てるには、次の手順に従います。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

  1. Azure portal で、アプリケーションで使用する Batch アカウントに移動します。
  2. 左側のナビゲーションから [アクセス制御 (IAM)] を選択します。
  3. [アクセス制御 (IAM)] ページで、[ロールの割り当てを追加] を選択します。
  4. [ロールの割り当てを追加] ページで、[ロール] タブを選び、アプリに対して [共同作成者] または [閲覧者] ロールを選びます。
  5. [メンバー] タブを選び、[メンバー][メンバーを選択する] を選びます。
  6. [メンバーを選択する] 画面で、アプリケーションを検索して選んでから、[選択] を選びます。
  7. [ロールの割り当てを追加] ページで、[レビューと割り当て] を選びます。

これで、Batch アカウントの [Access control (IAM)] (アクセス制御 (IAM)) ページの [ロールの割り当て] タブにアプリケーションが表示されます。

カスタム ロールを割り当てる

カスタム ロールでは、ジョブやタスクの送信などの詳細なアクセス許可をユーザーに付与します。 カスタム ロールを使用すると、プールの作成やノードの変更など、コストに影響する操作をユーザーが実行しないようにできます。

カスタム ロールを使用して、次の Azure Batch RBAC 操作のアクセス許可を Microsoft Entra のユーザー、グループ、サービス プリンシパルに対して付与または拒否することができます:

  • Microsoft.Batch/batchAccounts/pools/write
  • Microsoft.Batch/batchAccounts/pools/delete
  • Microsoft.Batch/batchAccounts/pools/read
  • Microsoft.Batch/batchAccounts/jobSchedules/write
  • Microsoft.Batch/batchAccounts/jobSchedules/delete
  • Microsoft.Batch/batchAccounts/jobSchedules/read
  • Microsoft.Batch/batchAccounts/jobs/write
  • Microsoft.Batch/batchAccounts/jobs/delete
  • Microsoft.Batch/batchAccounts/jobs/read
  • Microsoft.Batch/batchAccounts/certificates/write
  • Microsoft.Batch/batchAccounts/certificates/delete
  • Microsoft.Batch/batchAccounts/certificates/read
  • Microsoft.Batch/batchAccounts/read。任意の読み取り操作用
  • Microsoft.Batch/batchAccounts/listKeys/action。任意の操作用

カスタム ロールは、Batch 共有キー アカウントの資格情報向けではなく、Microsoft Entra ID によって認証されるユーザー向けです。 Batch アカウントの資格情報は、Batch アカウントに対する完全なアクセス許可を付与します。 自動プールを使用するジョブには、プール レベルのアクセス許可が必要です。

注意

特定のロールの割り当ては、actions フィールドで指定する必要がありますが、それ以外は dataActions フィールドで指定する必要があります。 詳細については、「Azure リソース プロバイダーの操作」を参照してください。

次の例は、Azure Batch カスタム ロール定義を示しています。

{
 "properties":{
    "roleName":"Azure Batch Custom Job Submitter",
    "type":"CustomRole",
    "description":"Allows a user to submit jobs to Azure Batch but not manage pools",
    "assignableScopes":[
      "/subscriptions/88888888-8888-8888-8888-888888888888"
    ],
    "permissions":[
      {
        "actions":[
          "Microsoft.Batch/*/read",
          "Microsoft.Authorization/*/read",
          "Microsoft.Resources/subscriptions/resourceGroups/read",
          "Microsoft.Support/*",
          "Microsoft.Insights/alertRules/*"
        ],
        "notActions":[

        ],
        "dataActions":[
          "Microsoft.Batch/batchAccounts/jobs/*",
          "Microsoft.Batch/batchAccounts/jobSchedules/*"
        ],
        "notDataActions":[

        ]
      }
    ]
  }
}

カスタム ロールの作成に関する詳細については、「Azure カスタム ロール」を参照してください。

コード例

このセクションの各コード例では、統合認証を使用して、またはサービス プリンシパルを使用して、Microsoft Entra ID で認証する方法を示します。 コード例では .NET と Python を使用していますが、他の言語でも概念はほぼ同じです。

Note

Microsoft Entra 認証トークンは 1 時間に期限が切れます。 有効期間の長い BatchClient オブジェクトを使用する場合は、すべての要求に対して MSAL からトークンを取得し、常に有効なトークンが存在するようにするのが最善です。

.NET でこれを行うには、Microsoft Entra ID からトークンを取得するメソッドを記述し、このメソッドをデリゲートとして BatchTokenCredentials オブジェクトに渡します。 Batch サービスに対するすべての要求でこのデリゲート メソッドが呼び出され、有効なトークンが確実に提供されます。 既定では MSAL でトークンがキャッシュされるため、新しいトークンは必要な場合にのみ Microsoft Entra から取得されます。 Microsoft Entra ID のトークンの詳細については、「セキュリティ トークン」を参照してください。

コード例: Batch .NET で Microsoft Entra 統合認証を使用する

Batch .NET から統合認証で認証するには、次のようにします。

  1. Azure Batch .NET および MSAL NuGet パッケージをインストールします。

  2. コードで次の using ステートメントを宣言します。

    using Microsoft.Azure.Batch;
    using Microsoft.Azure.Batch.Auth;
    using Microsoft.Identity.Client;
    
  3. テナント ID を含む Microsoft Entra エンドポイントを参照します。 テナント ID は、Azure portal の Microsoft Entra ID「概要」ページから取得できます。

    private const string AuthorityUri = "https://login.microsoftonline.com/<tenant-id>";
    
  4. Batch サービスのリソース エンドポイントを次のように参照します。

    private const string BatchResourceUri = "https://batch.core.windows.net/";
    
  5. Batch アカウントを次のように参照します。

    private const string BatchAccountUrl = "https://<myaccount>.<mylocation>.batch.azure.com";
    
  6. アプリケーションのアプリケーション (クライアント) ID を指定します。 アプリケーション ID は、Azure portal 内にあるお使いのアプリケーションの [概要] ページから取得できます。

    private const string ClientId = "<application-id>";
    
  7. アプリケーションを登録したときに入力したリダイレクト URI を指定します。

    private const string RedirectUri = "https://<redirect-uri>";
    
  8. Microsoft Entra ID から認証トークンを取得するコールバック メソッドを記述します。 次の例では、MSAL を呼び出して、アプリケーションを操作しているユーザーを認証します。 MSAL の IConfidentialClientApplication.AcquireTokenByAuthorizationCode メソッドにより、ユーザーは資格情報の入力を求められます。 ユーザーが資格情報を入力すると、アプリケーションは続行します。

    authorizationCode パラメーターは、ユーザーの認証後に承認サーバーから取得される承認コードです。 WithRedirectUri は、認証後に承認サーバーがユーザーをリダイレクトするリダイレクト URI を指定します。

    public static async Task<string> GetTokenUsingAuthorizationCode(string authorizationCode, string redirectUri, string[] scopes)
    {
        var app = ConfidentialClientApplicationBuilder.Create(ClientId)
                    .WithAuthority(AuthorityUri)
                    .WithRedirectUri(RedirectUri)
                    .Build();
    
        var authResult = await app.AcquireTokenByAuthorizationCode(scopes, authorizationCode).ExecuteAsync();
        return authResult.AccessToken;
    }
    
  9. このメソッドを次のコードで呼び出します。<authorization-code> は、承認サーバーから取得した承認コードに置き換えてください。 .default スコープは、ユーザーがリソースのすべてのスコープにアクセスするためのアクセス許可を持っていることを保証します。

    
    var token = await GetTokenUsingAuthorizationCode("<authorization-code>", "RedirectUri", new string[] { "BatchResourceUri/.default" });
    
  10. デリゲートをパラメーターとして受け取る BatchTokenCredentials オブジェクトを作成します。 これらの資格情報を使用して BatchClient オブジェクトを開きます。 その後、Batch サービスに対する以降の操作に BatchClient オブジェクトを使用します。

    public static void PerformBatchOperations()
    {
        Func<Task<string>> tokenProvider = () => GetTokenUsingAuthorizationCode();
    
        using (var client = BatchClient.Open(new BatchTokenCredentials(BatchAccountUrl, tokenProvider)))
        {
            client.JobOperations.ListJobs();
        }
    }
    

コード例: Batch .NET で Microsoft Entra サービス プリンシパルを使用する

Batch .NET からサービス プリンシパルで認証するには、次のようにします。

  1. Azure Batch .NET および MSAL NuGet パッケージをインストールします。

  2. コードで次の using ステートメントを宣言します。

    using Microsoft.Azure.Batch;
    using Microsoft.Azure.Batch.Auth;
    using Microsoft.Identity.Client;
    
  3. テナント ID を含む Microsoft Entra エンドポイントを参照します。 サービス プリンシパルを使用する場合は、テナント固有のエンドポイントを指定する必要があります。 テナント ID は、Azure portal の Microsoft Entra ID「概要」ページから取得できます。

    private const string AuthorityUri = "https://login.microsoftonline.com/<tenant-id>";
    
  4. Batch サービスのリソース エンドポイントを次のように参照します。

    private const string BatchResourceUri = "https://batch.core.windows.net/";
    
  5. Batch アカウントを次のように参照します。

    private const string BatchAccountUrl = "https://<myaccount>.<mylocation>.batch.azure.com";
    
  6. アプリケーションのアプリケーション (クライアント) ID を指定します。 アプリケーション ID は、Azure portal 内にあるお使いのアプリケーションの [概要] ページから取得できます。

    private const string ClientId = "<application-id>";
    
  7. Azure portal からコピーした秘密鍵を指定します。

    private const string ClientKey = "<secret-key>";
    
  8. Microsoft Entra ID から認証トークンを取得するコールバック メソッドを記述します。 次の ConfidentialClientApplicationBuilder.Create メソッドは、自動実行認証のために MSAL を呼び出します。

    public static async Task<string> GetAccessToken(string[] scopes)
    {
        var app = ConfidentialClientApplicationBuilder.Create(clientId)
                    .WithClientSecret(ClientKey)
                    .WithAuthority(new Uri(AuthorityUri))
                    .Build();
    
        var result = await app.AcquireTokenForClient(scopes).ExecuteAsync();
        return result.AccessToken;
    }
    
  9. 次のコードを使用して、このメソッドを呼び出します。 .default スコープは、アプリケーションがリソースのすべてのスコープにアクセスするためのアクセス許可を持っていることを保証します。

       var token = await GetAccessToken(new string[] { "BatchResourceId/.default" });
    
  10. デリゲートをパラメーターとして受け取る BatchTokenCredentials オブジェクトを作成します。 これらの資格情報を使用して BatchClient オブジェクトを開きます。 その後、Batch サービスに対する以降の操作に BatchClient オブジェクトを使用します。

    public static void PerformBatchOperations()
    {
        Func<Task<string>> tokenProvider = () => GetAccessToken();
    
        using (var client = BatchClient.Open(new BatchTokenCredentials(BatchAccountUrl, tokenProvider)))
        {
            client.JobOperations.ListJobs();
        }
    }
    

コード例: Batch Python で Microsoft Entra サービス プリンシパルを使用する

Batch Python からサービス プリンシパルで認証するには、次のようにします。

  1. azure-batch および azure-common Python モジュールをインストールします。

  2. 次のモジュールを参照します。

    from azure.batch import BatchServiceClient
    from azure.common.credentials import ServicePrincipalCredentials
    
  3. サービス プリンシパルを使用するには、テナント固有のエンドポイントを指定します。 テナント ID は、Azure portal の Microsoft Entra ID「概要」ページまたは「プロパティ」ページから取得できます。

    TENANT_ID = "<tenant-id>"
    
  4. Batch サービスのリソース エンドポイントを次のように参照します。

    RESOURCE = "https://batch.core.windows.net/"
    
  5. Batch アカウントを次のように参照します。

    BATCH_ACCOUNT_URL = "https://<myaccount>.<mylocation>.batch.azure.com"
    
  6. アプリケーションのアプリケーション (クライアント) ID を指定します。 アプリケーション ID は、Azure portal 内にあるお使いのアプリケーションの [概要] ページから取得できます。

    CLIENT_ID = "<application-id>"
    
  7. Azure Portal からコピーした秘密キーを次のように指定します。

    SECRET = "<secret-key>"
    
  8. ServicePrincipalCredentials オブジェクトを作成します。

    credentials = ServicePrincipalCredentials(
        client_id=CLIENT_ID,
        secret=SECRET,
        tenant=TENANT_ID,
        resource=RESOURCE
    )
    
  9. サービス プリンシパルの資格情報を使用して、BatchServiceClient オブジェクトを開きます。 その後、Batch サービスに対する以降の操作に BatchServiceClient オブジェクトを使用します。

        batch_client = BatchServiceClient(
        credentials,
        batch_url=BATCH_ACCOUNT_URL
    )
    

Microsoft Entra トークンを使用して認証される Batch クライアントを作成する方法を示す Python の例については、「Python スクリプトを使用した Azure Batch カスタム イメージのデプロイのサンプル」を参照してください。

次のステップ