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 を有効にする方法については、次の記事のいずれかを参照してください。

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

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

マネージド ID で Event Hubs を使用する

マネージド ID と共に Event Hubs を使うには、適切なスコープで Event Hubs の RBAC ロールを ID に割り当てます。 このセクションの手順では、マネージド ID で実行され Event Hubs リソースにアクセスするシンプルなアプリケーションを使用します。

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

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

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

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

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

    Screenshot of the Identity page showing the status of system-assigned identity set to ON.

  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アプリケーションを実行し、名前空間名とイベント ハブ名、およびメッセージを入力し、送信を選択します。 イベントを受信するには、受信を選択します。

これで Web アプリケーションを起動し、ブラウザーで aspx のサンプル ページを参照できるようになりました。 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 を使用したメッセージの送受信

サンプル

次のステップ