Azure Active Directory を使用して Event Hubs リソースにアクセスするためのマネージド ID を認証する

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

この記事では、Azure VM からイベント ハブへのアクセスを、マネージド ID を使用して承認する方法について示します。

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

Azure リソースのマネージド ID を使用してご利用の VM から Event Hubs リソースへのアクセスを承認するには、最初に VM 上で Azure リソースのマネージド ID を有効にする必要があります。 Azure リソースのマネージド ID を有効にする方法については、次の記事のいずれかを参照してください。

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

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

Azure ロールの割り当ての詳細については、Azure Active Directory を使用して認証し、Event Hubs リソースにアクセスすることに関するページを参照してください。

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

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

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

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

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

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

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

    Web アプリのマネージド ID

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

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

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

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

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

注意

マネージド 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 を使用したメッセージの送受信

サンプル

次のステップ