Microsoft Entra ID を使って Event Hubs リソースにアクセスするためのマネージド ID を認証する

Azure Event Hubs では、Azure リソースのマネージド ID を使用した Microsoft Entra 認証がサポートされています。 Azure リソースのマネージド ID では、Azure Virtual Machines (VMs)、Function Apps、Virtual Machine Scale Sets などのサービスで実行されているアプリケーションから Event Hubs リソースへのアクセスを、Microsoft Entra 資格情報を使用して認可することができます。 Azure リソースのマネージド ID を Microsoft Entra 認証と一緒に使用することで、クラウドで動作するアプリケーションに資格情報を保存することを避けることができます。 この記事では、Azure VM からイベント ハブへのアクセスを、マネージド ID を使用して承認する方法について示します。

VM 上のマネージド ID を有効にする

Azure リソース用マネージド ID を使ってご利用の VM から Event Hubs リソースにアクセスするには、最初に VM 上で Azure リソースのマネージド ID を有効にする必要があります。 Azure リソースに対してマネージド ID を有効にする方法を確認するには、「Azure VM 上でのマネージド ID の構成」を参照してください。

Microsoft Entra ID のマネージド ID にアクセス許可を付与する

アプリケーション内でマネージド ID からの Event Hubs サービスへの要求を承認するには、まずそのマネージド ID に対するロールベースのアクセス制御 (RBAC) 設定を構成します。 Azure Event Hubs は、Event Hubs との間でイベントを送受信するためのアクセス許可を含む Azure ロールを定義します。 Azure ロールがマネージド ID に割り当てられると、そのマネージド ID には適切なスコープの Event Hubs データへのアクセス権が付与されます。 Azure ロールの割り当ての詳細については、Microsoft Entra ID を使用して認証し、Event Hubs リソースにアクセスすることに関するページを参照してください。

サンプル アプリケーション

このセクションの手順では、マネージド ID で実行され Event Hubs リソースにアクセスするシンプルなアプリケーションを使用します。

ここでは、Azure App Service でホストされているサンプル Web アプリケーションを使用します。 Web アプリケーションを作成するための詳細な手順については、Azure に ASP.NET Core Web アプリを作成するに関する記事を参照してください

アプリケーションが作成されたら、次の手順を行います。

  1. [設定] に移動し、 [ID] を選択します。

  2. [状態] を選択して [オン] にします。

  3. [保存] を選択して設定を保存します。

    [オン] に設定されたシステム割り当て ID の状態を示す [ID] ページのスクリーンショット。

  4. 情報メッセージで [はい] を選択します。

    この設定を有効にすると、ご利用の Microsoft Entra ID に新しいサービス ID が作成され、App Service ホストに構成されます。

    次に、このサービス ID をご利用の Event Hubs リソースの必要なスコープ内のロールに割り当てます。

Azure portal を使用して Azure ロールを割り当てるには

目的のスコープ (Event Hubs 名前空間、リソース グループ、サブスクリプション) で、いずれかの Event Hubs ロールを管理対象 ID に割り当てます。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

Note

マネージド ID をサポートするサービスの一覧については、「Azure リソースのマネージド ID をサポートするサービス」を参照してください。

Web アプリケーションをテストする

  1. Event Hubs 名前空間とイベント ハブを作成します。
  2. Web アプリを Azure にデプロイする。 GitHub 上のサンプル Web アプリケーションへのリンクは、次のタブ付きセクションを参照してください。
  3. SendReceive.aspxがWeb アプリのデフォルトドキュメントとして設定されていることを確認します。
  4. Web アプリのIDを有効にします。
  5. このIDを名前空間レベルまたはイベント ハブ レベルでEvent Hubs データ所有者の役割に割り当てます。
  6. Webアプリケーションを実行し、名前空間名とイベント ハブ名、およびメッセージを入力し、送信を選択します。 イベントを受信するには、受信を選択します。

GitHub リポジトリには、Event Hubs リソースとの間でデータの送受信を行うサンプル Web アプリケーションがあります。

NuGetから最新のパッケージをインストールし、EventHubProducerClientを使用してEvent Hubs にイベントの送信を開始し、EventHubConsumerClientを使用してイベントの受信を開始します。

注意

マネージド ID を使用してイベント ハブにイベントを発行する Java サンプルについては、GitHub 上での Azure ID サンプルを使ったイベントの発行に関するページを参照してください。

protected async void btnSend_Click(object sender, EventArgs e)
{
    await using (EventHubProducerClient producerClient = new EventHubProducerClient(txtNamespace.Text, txtEventHub.Text, new DefaultAzureCredential()))
    {
        // create a batch
        using (EventDataBatch eventBatch = await producerClient.CreateBatchAsync())
        {

            // add events to the batch. only one in this case. 
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes(txtData.Text)));

            // send the batch to the event hub
            await producerClient.SendAsync(eventBatch);
        }

        txtOutput.Text = $"{DateTime.Now} - SENT{Environment.NewLine}{txtOutput.Text}";
    }
}
protected async void btnReceive_Click(object sender, EventArgs e)
{
    await using (var consumerClient = new EventHubConsumerClient(EventHubConsumerClient.DefaultConsumerGroupName, $"{txtNamespace.Text}.servicebus.windows.net", txtEventHub.Text, new DefaultAzureCredential()))
    {
        int eventsRead = 0;
        try
        {
            using CancellationTokenSource cancellationSource = new CancellationTokenSource();
            cancellationSource.CancelAfter(TimeSpan.FromSeconds(5));

            await foreach (PartitionEvent partitionEvent in consumerClient.ReadEventsAsync(cancellationSource.Token))
            {
                txtOutput.Text = $"Event Read: { Encoding.UTF8.GetString(partitionEvent.Data.Body.ToArray()) }{ Environment.NewLine}" + txtOutput.Text;
                eventsRead++;
            }
        }
        catch (TaskCanceledException ex)
        {
            txtOutput.Text = $"Number of events read: {eventsRead}{ Environment.NewLine}" + txtOutput.Text;
        }
    }
}

Kafka 用の Event Hubs

Apache Kafka アプリケーションを使用すると、マネージド ID OAuth を使用して Azure Event Hubs との間でメッセージを送受信することができます。 GitHub の次のサンプルを参照してください: Kafka 用の Event Hubs - マネージド ID OAuth を使用したメッセージの送受信

サンプル