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

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

マネージド 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 をそれぞれどのようなときに使用するかについての詳細は、ID のベスト プラクティスの推奨事項に関するページを参照してください。

DefaultAzureCredential について

マネージド ID は、通常、Azure.Identity クライアント ライブラリの DefaultAzureCredential というクラスを使用してアプリケーション コードに実装されます。 DefaultAzureCredential は複数の認証方法をサポートしており、どの方法が使用されるかは実行時に決定されます。 この方法の詳細については、DefaultAzureCredential の概要に関するページを参照してください。

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

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

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

Diagram showing the user assigned identity relationships.

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

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

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

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

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

    Screenshot showing how to assign a system assigned managed identity.

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

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

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

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

    Screenshot showing how to assign a system-assigned identity.

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

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

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

    Screenshot showing how to select a system-assigned identity.

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

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

ローカル開発の考慮事項

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

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

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

Note

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

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

プロジェクト内に、Azure.Identity NuGet パッケージへの参照を追加します。 このライブラリには、DefaultAzureCredential の実装に必要なすべてのエンティティが含まれています。 また、アプリに関連する他の Azure ライブラリも追加できます。 この例では、Blob Storage と Key Vault に接続するために、Azure.Storage.Blobs および Azure.KeyVault.Keys パッケージを追加します。

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.KeyVault.Keys

Program.cs ファイルの先頭に、次の using ステートメントを追加します。

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Security.KeyVault.Keys;

プロジェクト コードの Program.cs ファイルで、アプリを接続する、必要なサービスのインスタンスを作成します。 次の例では、対応する SDK クラスを使用して Blob Storage とサービス バスに接続します。

var blobServiceClient = new BlobServiceClient(
    new Uri("https://<your-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential(credOptions));

var serviceBusClient = new ServiceBusClient("<your-namespace>", new DefaultAzureCredential());
var sender = serviceBusClient.CreateSender("producttracking");

このアプリケーション コードをローカルで実行すると、DefaultAzureCredential では資格情報チェーンを検索して最初に使用可能な資格情報を見つけます。 ローカルで Managed_Identity_Client_ID が null の場合、ローカルの Azure CLI または Visual Studio サインインの資格情報が自動的に使用されます。 このプロセスの詳細については、Azure ID ライブラリの概要に関するページを参照してください。

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

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

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

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

Diagram showing multiple user-assigned managed identities.

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

  • 共有ユーザー割り当てマネージド ID を使用した個別のストレージ アカウントへの 2 つの接続
  • 2 つ目の共有ユーザー割り当てマネージド ID を使用した Azure Cosmos DB と Azure SQL サービスへの接続
// Get the first user-assigned managed identity ID to connect to shared storage
const clientIdStorage = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage");

// First blob storage client that using a managed identity
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });

// Second blob storage client that using a managed identity
BlobServiceClient blobServiceClient2 = new BlobServiceClient(
    new Uri("https://<contract-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });


// Get the second user-assigned managed identity ID to connect to shared databases
var clientIDdatabases = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases");

// Create an Azure Cosmos DB client
CosmosClient client = new CosmosClient(
    accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDdatabases
    });

// Open a connection to Azure SQL using a managed identity
string ConnectionString1 = @"Server=<azure-sql-hostname>.database.windows.net; User Id=ClientIDOfTheManagedIdentity; Authentication=Active Directory Default; Database=<database-name>";

using (SqlConnection conn = new SqlConnection(ConnectionString1))
{
    conn.Open();
}

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

Diagram showing user-assigned and system-assigned managed identities.

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

次の手順

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