次の方法で共有


複数の Azure アプリとサービス間のパスワードレス接続を構成する

アプリケーションでは多くの場合、複数の Azure サービス間にセキュリティで保護された接続が同時に必要になります。 たとえば、エンタープライズ Azure App Service インスタンスで、複数の異なるストレージ アカウント、Azure SQL データベース インスタンス、Service Bus などに接続する場合があります。

マネージド ID は、Azure リソース間の安全なパスワードレス接続に推奨されている認証オプションです。 マネージド ID では、開発者がさまざまなシークレットを手動で追跡して管理する必要はありません。これらのタスクのほとんどは Azure によって内部で処理されるためです。 このチュートリアルでは、マネージド ID と Azure ID クライアント ライブラリを使用して複数のサービス間の接続を管理する方法について説明します。

マネージド ID の種類を比較する

Azure には、次の種類のマネージド ID が用意されています。

  • システム割り当てマネージド ID は、1 つの Azure リソースに直接関連付けられます。 サービスでシステム割り当てマネージド ID を有効にすると、Azure によってリンクされた ID が作成され、その ID の管理タスクが内部で処理されます。 Azure リソースが削除されると、ID も削除されます。
  • ユーザー割り当てマネージド ID は、管理者によって作成され、1 つ以上の Azure リソースに関連付けることができる独立した ID です。 ID のライフサイクルは、それらのリソースから独立しています。

ベスト プラクティスと、システム割り当ておよびユーザー割り当てマネージド ID をそれぞれどのようなときに使用するかについての詳細は、マネージド ID のベスト プラクティスの推奨事項を参照してください。

DefaultAzureCredential について

マネージド ID は、Azure ID クライアント ライブラリの DefaultAzureCredential というクラスを使用して、アプリケーション コードに最も簡単に実装されます。 DefaultAzureCredential は複数の認証メカニズムをサポートしています。どれが実行時に使用されるかは自動的に決定されます。 DefaultAzureCredential の詳細については、次のエコシステムを確認してください。

Azure でホストされているアプリを複数の Azure サービスに接続する

パスワードレス接続を使用して、既存のアプリを複数の Azure サービスとデータベースに接続する作業をしているとします。 このアプリケーションは Azure App Service でホストされている ASP.NET Core Web API ですが、以下の手順は、Azure Spring Apps、Virtual Machines、Container Apps、AKS などの他の Azure ホスティング環境にも適用されます。

このチュートリアルは次のアーキテクチャに適用されますが、最小限の構成変更で、他の多くのシナリオにも適応できます。

ユーザー割り当て ID の関係を示す図。

次の手順では、システム割り当てマネージド ID とローカル開発アカウントを使用して複数の Azure サービスに接続するように、アプリを構成する方法を示します。

システム割り当てマネージド ID を作成する

  1. Azure portal で、他のサービスに接続する、ホストされたアプリケーションに移動します。

  2. サービスの概要ページで、[ID] を選択します。

  3. [状態] の設定を [オン] に切り替えて、サービスのシステム割り当てマネージド ID を有効にします。

    システム割り当てマネージド ID の割り当て方法を示すスクリーンショット。

接続されている各サービスのマネージド ID にロールを割り当てる

  1. お使いの ID にアクセスを許可するストレージ アカウントの概要ページに移動します。

  2. ストレージ アカウントのナビゲーションから [アクセス制御 (IAM)] を選択します。

  3. [+ 追加][ロールの割り当ての追加] の順に選択します。

    システム割り当てマネージド ID にロールを割り当てるための Azure portal セクションを見つける方法を示すスクリーンショット。

  4. [ロール] 検索ボックスで、[ストレージ BLOB データ共同作成者] を検索します。これは、BLOB データに対する読み取りと書き込みの操作を実行するためのアクセス許可を付与します。 ユース ケースに合った適切なロールであれば何でも割り当てることができます。 一覧から [ストレージ BLOB データ共同作成者] を選択し、[次へ] を選択します。

  5. [ロールの割り当てを追加] 画面の [アクセスの割り当て先] オプションで [マネージド ID] を選択します。 次に、[+ メンバーの選択] を選択します。

  6. ポップアップで、App Service の名前を入力して、作成したマネージド ID を検索します。 システム割り当て ID を選択し、[選択] を選択してポップアップ メニューを閉じます。

    Azure portal でシステム割り当てマネージド ID にロールを割り当てる方法を示すスクリーンショット。

  7. [次へ] を何度か選択して [レビューと割り当て] を選択すれば、ロールの割り当ては完了です。

  8. 接続する他のサービスでこのプロセスを繰り返します。

ローカル開発の考慮事項

また、マネージド ID にロールを割り当てたときと同じ方法でユーザー アカウントにロールを割り当て、ローカル開発用の Azure リソースにアクセスできるようにすることもできます。

  1. マネージド ID に [ストレージ BLOB データ共同作成者] ロールを割り当てたら、[アクセスの割り当て先] で、今度は [User, group or service principal] (ユーザー、グループ、またはサービス プリンシパル) を選択します。 [+ メンバーを選択する] を選択してポップアップ メニューをもう一度開きます。

  2. メール アドレスまたは名前でアクセス権を付与する user@domain アカウントまたは Microsoft Entra セキュリティ グループを検索し、それを選択します。 これは、Visual Studio や Azure CLI などの、ローカル開発ツールへのサインインに使用するアカウントと同じであることが必要です。

Note

複数の開発者がいるチームで作業している場合は、これらのロールを Microsoft Entra セキュリティ グループに割り当てることもできます。 そのうえで、アプリをローカルで開発するアクセス権が必要な開発者を、そのグループに入れることができます。

アプリケーション コードを実装する

  1. プロジェクトで Azure.Identity パッケージをインストールします。 このライブラリには DefaultAzureCredential があります。 また、アプリに関連する他の Azure ライブラリも追加できます。 この例では、Azure.Storage.Blobs および Azure.Messaging.ServiceBus パッケージがそれぞれ、Blob Storage と Service Bus に接続するために追加されています。

    dotnet add package Azure.Identity
    dotnet add package Azure.Messaging.ServiceBus
    dotnet add package Azure.Storage.Blobs
    
  2. アプリが接続する必要がある Azure サービスのサービス クライアントのインスタンスを作成します。 次のサンプル コードでは、対応するサービス クライアントを使用して、Blob Storage と Service Bus を操作します。

    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    using Azure.Storage.Blobs;
    
    // Create DefaultAzureCredential instance that uses system-assigned managed identity
    // in the underlying ManagedIdentityCredential.
    DefaultAzureCredential credential = new();
    
    BlobServiceClient blobServiceClient = new(
        new Uri("https://<your-storage-account>.blob.core.windows.net"),
        credential);
    
    ServiceBusClient serviceBusClient = new("<your-namespace>", credential);
    ServiceBusSender sender = serviceBusClient.CreateSender("producttracking");
    

このコードがローカルで実行されると、DefaultAzureCredential ではその資格情報チェーンを検索し、最初に使用可能な資格情報を見つけます。 Managed_Identity_Client_ID 環境変数がローカルで null 値の場合は、ローカルにインストールされた開発者ツールに対応する資格情報が使用されます。 たとえば、Azure CLI や Visual Studio です。 このプロセスの詳細については、「DefaultAzureCredential について」を参照してください。

アプリケーションが Azure にデプロイされると、DefaultAzureCredential によって App Service 環境から自動的に Managed_Identity_Client_ID 変数が取得されます。 この値は、マネージド ID がアプリに関連付けられると使用できるようになります。

この全体的なプロセスにより、コード変更を行わなくても、アプリをローカルおよび Azure で安全に実行できます。

複数のマネージド ID を使用して複数のアプリを接続する

前の例のアプリでは同じサービス アクセス要件を共有していましたが、たいていの場合、実際の環境はそれぞれ微妙に異なります。 複数のアプリが同じストレージ アカウントに接続していますが、アプリのうち 2 つは異なるサービスまたはデータベースにもアクセスするというシナリオについて考えます。

複数のユーザー割り当てマネージド ID を示す図。

コードでこのセットアップを構成するには、アプリケーションで、それぞれのストレージ アカウントまたはデータベースに接続するために個別のサービス クライアントを登録する必要があります。 DefaultAzureCredential を構成するときは、各サービスの正しいマネージド ID クライアント ID を参照します。 次のサンプル コードでは、これらの Azure サービス接続を構成します。

  • 共有ユーザー割り当てマネージド ID を使用した個別のストレージ アカウントへの 2 つの接続
  • 2 つ目のユーザー割り当てマネージド ID を使用した Azure Cosmos DB と Azure SQL サービスへの接続。 このマネージド ID は、Azure SQL クライアント ドライバーで許可されている場合に共有されます。 詳細については、コードのコメントを参照してください。
  1. プロジェクトで、必要なパッケージをインストールします。 Azure ID ライブラリには DefaultAzureCredential があります。

    dotnet add package Azure.Identity
    dotnet add package Azure.Storage.Blobs
    dotnet add package Microsoft.Azure.Cosmos
    dotnet add package Microsoft.Data.SqlClient
    
  2. コードに次の内容を追加します。

    using Azure.Core;
    using Azure.Identity;
    using Azure.Storage.Blobs;
    using Microsoft.Azure.Cosmos;
    using Microsoft.Data.SqlClient;
    
    string clientIdStorage =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialStorage = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdStorage,
        });
    
    // First Blob Storage client
    BlobServiceClient blobServiceClient1 = new(
        new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    // Second Blob Storage client
    BlobServiceClient blobServiceClient2 = new(
        new Uri("https://<contract-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    string clientIdDatabases =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialDatabases = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdDatabases,
        });
    
    // Create an Azure Cosmos DB client
    CosmosClient cosmosClient = new(
        Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
        credentialDatabases);
    
    // Open a connection to Azure SQL
    string connectionString =
        $"Server=<azure-sql-hostname>.database.windows.net;User Id={clientIdDatabases};Authentication=Active Directory Default;Database=<database-name>";
    
    using (SqlConnection connection = new(connectionString)
    {
        AccessTokenCallback = async (authParams, cancellationToken) =>
        {
            const string defaultScopeSuffix = "/.default";
            string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
                ? authParams.Resource
                : $"{authParams.Resource}{defaultScopeSuffix}";
            AccessToken token = await credentialDatabases.GetTokenAsync(
                new TokenRequestContext([scope]),
                cancellationToken);
    
            return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
        }
    })
    {
        connection.Open();
    }
    

ユーザー割り当てマネージド ID とシステム割り当てマネージド ID を同時にリソースに関連付けることもできます。 これは、すべてのアプリで同じ共有サービスにアクセスする必要がありますが、アプリの 1 つが追加のサービスへの固有の依存関係を持っているというシナリオで役立ちます。 システム割り当てマネージド ID を使用すると、アプリが削除されたときに、その特定のアプリに関連付けられている ID も削除されます。これによって環境がクリーンに保たれます。

ユーザー割り当てとシステム割り当てのマネージド ID を示す図。

これらの種類のシナリオの詳細については、「マネージド ID のベスト プラクティスに関する推奨事項」を参照してください。

次のステップ

このチュートリアルでは、アプリケーションをパスワードレス接続に移行する方法について説明しました。 この記事で説明されている概念の詳細については、次のリソースを参照してください。