빠른 시작: .NET을 사용하여 Azure Event Hubs에서 이벤트 보내기 및 받기

이 빠른 시작에서는 Azure.Messaging.EventHubs .NET 라이브러리를 사용하여 이벤트 허브로 이벤트를 보낸 다음, 이벤트 허브에서 해당 이벤트를 수신하는 방법을 알아봅니다.

참고 항목

빠른 시작은 서비스를 빠르게 진행하는 데 도움이 됩니다. 서비스에 이미 익숙한 경우 GitHub의 .NET SDK 리포지토리에서 Event Hubs용 .NET 샘플(GitHub의 Event Hubs 샘플, GitHub의 이벤트 프로세서 샘플)을 볼 수 있습니다.

필수 조건

Azure Event Hubs를 처음 사용하는 경우 이 빠른 시작을 진행하기 전에 Event Hubs 개요를 참조하세요.

이 빠른 시작을 완료하려면 다음 필수 구성 요소가 필요합니다.

  • Microsoft Azure 구독. Azure Event Hubs를 비롯한 Azure 서비스를 사용하려면 구독이 필요합니다. 기존 Azure 계정이 없는 경우 평가판에 가입하거나 계정을 만들 때 MSDN 구독자 혜택을 사용할 수 있습니다.
  • Microsoft Visual Studio 2022. Azure Event Hubs 클라이언트 라이브러리는 C# 8.0에 도입된 새 기능을 사용합니다. 이전 C# 언어 버전으로 라이브러리를 계속 사용할 수 있지만 새 구문은 사용할 수 없습니다. 전체 구문을 사용하려면 .NET Core SDK 3.0 이상 및 latest로 설정된 언어 버전으로 컴파일하는 것이 좋습니다. Visual Studio를 사용하는 경우 Visual Studio 2022 이전 버전은 C# 8.0 프로젝트를 빌드하는 데 필요한 도구와 호환되지 않습니다. 체험판 Community 버전을 비롯한 Visual Studio 2022는 여기서 다운로드할 수 있습니다.
  • Event Hubs 네임스페이스 및 이벤트 허브 만들기 첫 단계에서는 Azure Portal을 사용하여 Event Hubs 네임스페이스를 만들고 이 네임스페이스에 이벤트 허브를 만듭니다. 그런 다음, 애플리케이션에서 이벤트 허브와 통신하는 데 필요한 관리 자격 증명을 얻습니다. 네임스페이스 및 이벤트 허브를 만들려면 빠른 시작: Azure Portal을 사용하여 이벤트 허브 만들기를 참조하세요.

Azure에 앱 인증

이 빠른 시작에서는 Azure Event Hubs에 연결하는 두 가지 방법을 보여줍니다.

  • 암호 없음(Microsoft Entra 인증)
  • Connection string

첫 번째 옵션은 Azure Active Directory 및 RBAC(역할 기반 액세스 제어)의 보안 주체를 사용하여 Event Hubs 네임스페이스에 연결하는 방법을 보여 줍니다. 코드, 구성 파일 또는 Azure Key Vault와 같은 보안 스토리지에 하드 코딩된 연결 문자열이 있는지 걱정할 필요가 없습니다.

두 번째 옵션은 연결 문자열을 사용하여 Event Hubs 네임스페이스에 연결하는 방법을 보여 줍니다. Azure를 처음 사용하는 경우 연결 문자열 옵션이 더 쉽게 따라할 수 있습니다. 실제 애플리케이션 및 프로덕션 환경에서는 암호 없는 옵션을 사용하는 것이 좋습니다. 자세한 내용은 인증 및 권한 부여를 참조하세요. 개요 페이지에서 암호 없는 인증에 대해 자세히 알아볼 수도 있습니다.

Microsoft Entra 사용자에게 역할 할당

로컬에서 개발할 때 Azure Event Hubs에 연결하는 사용자 계정에 올바른 권한이 있는지 확인합니다. 메시지를 보내고 받으려면 Azure Event Hubs 데이터 소유자 역할이 필요합니다. 자신에게 이 역할을 할당하려면 사용자 액세스 관리자 역할 또는 Microsoft.Authorization/roleAssignments/write 작업을 포함하는 다른 역할이 필요합니다. Azure Portal, Azure CLI 또는 Azure PowerShell을 사용하여 사용자에게 Azure RBAC 역할을 할당할 수 있습니다. 범위 개요 페이지에서 역할 할당에 사용할 수 있는 범위에 대해 자세히 알아봅니다.

다음 예에서는 Azure Event Hubs 리소스에 대한 모든 권한을 제공하는 Azure Event Hubs Data Owner 역할을 사용자 계정에 할당합니다. 실제 시나리오에서는 최소 권한 원칙에 따라 사용자에게 보다 안전한 프로덕션 환경에 필요한 최소한의 권한만 부여합니다.

Azure Event Hubs에 대한 Azure 기본 제공 역할

Azure Event Hubs의 경우 Azure Portal 및 Azure 리소스 관리 API를 통한 네임스페이스 및 관련된 모든 리소스의 관리는 이미 Azure RBAC 모델을 사용하여 보호되고 있습니다. Azure는 Event Hubs 네임스페이스에 대한 액세스 권한을 부여하기 위해 아래의 Azure 기본 제공 역할을 제공합니다.

사용자 지정 역할을 만들려면 Event Hubs 작업에 필요한 권한을 참조하세요.

Important

대부분의 경우 역할 할당이 Azure에서 전파되는 데 1~2분이 걸립니다. 드문 경우지만 최대 8분이 소요될 수 있습니다. 코드를 처음 실행할 때 인증 오류가 발생하면 잠시 기다렸다가 다시 시도하세요.

  1. Azure Portal에서 기본 검색 표시줄 또는 왼쪽 탐색을 사용하여 Event Hubs 네임스페이스를 찾습니다.

  2. 개요 페이지의 왼쪽 메뉴에서 액세스 제어(IAM)를 선택합니다.

  3. 액세스 제어(IAM) 페이지에서 역할 할당 탭을 선택합니다.

  4. 위쪽 메뉴에서 + 추가를 선택한 다음, 드롭다운 메뉴에서 역할 할당 추가를 선택합니다.

    역할을 할당하는 방법을 보여 주는 스크린샷

  5. 검색 상자를 사용하여 결과를 원하는 역할로 필터링합니다. 이 예에서는 Azure Event Hubs Data Owner를 검색하고 일치하는 결과를 선택합니다. 다음을 선택합니다.

  6. 다음에 대한 액세스 할당 아래에서 사용자, 그룹 또는 서비스 주체를 선택한 다음, + 멤버 선택을 선택합니다.

  7. 대화 상자에서 Microsoft Entra 사용자 이름(일반적으로 user@domain 이메일 주소)을 검색한 다음, 대화 상자 하단에서 선택을 선택합니다.

  8. 검토 + 할당을 선택하여 최종 페이지로 이동한 다음, 검토 + 할당을 다시 선택하여 프로세스를 완료합니다.

Visual Studio를 시작하고 Azure에 로그인

다음 단계를 사용하여 Service Bus 네임스페이스에 대한 액세스 권한을 부여할 수 있습니다.

  1. Visual Studio를 시작합니다. 시작 창이 표시되면 오른쪽 창에서 코드를 사용하지 않고 계속 링크를 선택합니다.

  2. Visual Studio의 오른쪽 위에서 로그인 단추를 선택합니다.

    Visual Studio를 사용하여 Azure에 로그인하는 단추를 보여주는 스크린샷

  3. 이전에 역할을 할당한 Microsoft Entra 계정을 사용하여 로그인합니다.

    계정 선택을 보여 주는 스크린샷

이벤트 허브로 이벤트 보내기

이 섹션에서는 사용자가 만든 이벤트 허브로 이벤트를 전송하는 .NET Core 콘솔 애플리케이션을 만드는 방법을 보여줍니다.

콘솔 애플리케이션 만들기

  1. Visual Studio 2022가 이미 열려 있는 경우 메뉴에서 파일을 선택하고 새로 만들기를 선택한 다음, 프로젝트를 선택합니다. 그렇지 않으면 Visual Studio 2022를 시작하고 팝업 창이 표시되면 새 프로젝트 만들기를 선택합니다.

  2. 새 프로젝트 만들기 대화 상자에서 다음 단계를 수행합니다. 이 대화 상자가 표시되지 않으면 메뉴에서 파일을 선택하고 새로 만들기를 선택한 다음, 프로젝트를 선택합니다.

    1. 프로그래밍 언어로 C#을 선택합니다.

    2. 애플리케이션 유형으로 콘솔을 선택합니다.

    3. 결과 목록에서 콘솔 애플리케이션을 선택합니다.

    4. 그런 후에 다음을 선택합니다.

      새 프로젝트 대화 상자를 보여 주는 이미지

  3. 프로젝트 이름으로 EventHubsSender, 솔루션 이름으로 EventHubsQuickStart를 입력한 다음, 다음을 선택합니다.

    솔루션 및 프로젝트 이름을 입력하는 페이지를 보여 주는 이미지

  4. 추가 정보 페이지에서 만들기를 선택합니다.

프로젝트에 NuGet 패키지 추가

  1. 메뉴에서 도구>NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

  2. 다음 명령을 실행하여 Azure.Messaging.EventHubsAzure.Identity NuGet 패키지를 설치합니다. ENTER를 눌러 두 번째 명령을 실행합니다.

    Install-Package Azure.Messaging.EventHubs
    Install-Package Azure.Identity
    

코드를 작성하여 이벤트 허브에 이벤트 보내기

  1. Program.cs 파일의 기존 코드를 다음 샘플 코드로 바꿉니다. 그런 다음, EventHubProducerClient 매개 변수의 <EVENT_HUB_NAMESPACE><HUB_NAME> 자리 표시자 값을 Event Hubs 네임스페이스 및 이벤트 허브의 이름으로 바꿉니다. 예: "spehubns0309.servicebus.windows.net""spehub"

    다음은 코드의 중요한 단계입니다.

    1. 네임스페이스 및 이벤트 허브 이름을 사용하여 EventHubProducerClient 개체를 만듭니다.
    2. EventHubProducerClient 개체에서 CreateBatchAsync 메서드를 호출하여 EventDataBatch 개체를 만듭니다.
    3. EventDataBatch.TryAdd 메서드를 사용하여 일괄 처리에 이벤트를 추가합니다.
    4. EventHubProducerClient.SendAsync 메서드를 사용하여 일괄 메시지를 이벤트 허브로 보냅니다.
    using Azure.Identity;
    using Azure.Messaging.EventHubs;
    using Azure.Messaging.EventHubs.Producer;
    using System.Text;
    
    // number of events to be sent to the event hub
    int numOfEvents = 3;
    
    // The Event Hubs client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when events are being published or read regularly.
    // TODO: Replace the <EVENT_HUB_NAMESPACE> and <HUB_NAME> placeholder values
    EventHubProducerClient producerClient = new EventHubProducerClient(
        "<EVENT_HUB_NAMESPACE>.servicebus.windows.net",
        "<HUB_NAME>",
        new DefaultAzureCredential());
    
    // Create a batch of events 
    using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();
    
    for (int i = 1; i <= numOfEvents; i++)
    {
        if (!eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes($"Event {i}"))))
        {
            // if it is too large for the batch
            throw new Exception($"Event {i} is too large for the batch and cannot be sent.");
        }
    }
    
    try
    {
        // Use the producer client to send the batch of events to the event hub
        await producerClient.SendAsync(eventBatch);
        Console.WriteLine($"A batch of {numOfEvents} events has been published.");
        Console.ReadLine();
    }
    finally
    {
        await producerClient.DisposeAsync();
    }
    
  1. 프로그램을 빌드하고 오류가 없는지 확인합니다.

  2. 프로그램을 실행하고 확인 메시지가 나타날 때까지 기다립니다.

    A batch of 3 events has been published.
    

    Important

    암호 없는(Azure Active Directory의 역할 기반 액세스 제어) 인증을 사용하는 경우 도구를 선택한 다음 옵션을 선택합니다. 옵션 창에서 Azure 서비스 인증을 확장하고 계정 선택을 선택합니다. Event Hubs 네임스페이스의 Azure Event Hubs 데이터 소유자 역할에 추가된 계정을 사용하고 있는지 확인합니다.

  3. Azure Portal의 Event Hubs 네임스페이스 페이지에서 메시지 차트에 들어오는 메시지 세 개가 표시됩니다. 필요한 경우 페이지를 새로 고쳐 차트를 업데이트합니다. 메시지가 수신되었다는 내용이 표시될 때까지 몇 초 정도 걸릴 수 있습니다.

    이벤트 허브가 이벤트를 받았는지 확인하는 Azure Portal 페이지의 이미지

    참고 항목

    정보 제공을 위한 주석을 비롯한 전체 소스 코드는 GitHub의 이 파일을 참조하세요.

이벤트 허브에서 이벤트 받기

이 섹션에서는 이벤트 프로세서를 사용하여 이벤트 허브에서 이벤트를 받는 .NET Core 콘솔 애플리케이션을 작성하는 방법을 보여 줍니다. 이벤트 프로세서는 이벤트 허브로부터 이벤트 수신을 간소화합니다.

Azure Storage 계정 및 Blob 컨테이너 만들기

이 빠른 시작에서는 Azure Storage를 검사점 저장소로 사용합니다. 다음 단계에 따라 Azure Storage 계정을 만듭니다.

  1. Azure Storage 계정 만들기
  2. Blob 컨테이너 만들기
  3. Microsoft Entra ID(암호 없는) 인증 또는 네임스페이스에 대한 연결 문자열을 사용하여 Blob 컨테이너에 인증합니다.

Azure Blob Storage를 검사점 저장소로 사용할 때 다음 권장 사항을 따릅니다.

  • 각 소비자 그룹에 대해 별도의 컨테이너를 사용합니다. 동일한 스토리지 계정을 사용할 수 있지만 각 그룹당 하나의 컨테이너를 사용합니다.
  • 컨테이너를 다른 용도로 사용하지 말고 스토리지 계정을 다른 용도로 사용하지 마세요.
  • 스토리지 계정은 배포된 애플리케이션이 있는 지역과 동일한 지역에 있어야 합니다. 애플리케이션이 온-프레미스인 경우 가능한 가장 가까운 지역을 선택해 보세요.

Azure Portal에서 Storage 계정 페이지의 Blob service 섹션에서 다음 설정을 사용하지 않도록 설정해야 합니다.

  • 계층 구조 네임스페이스
  • Blob 일시 삭제
  • 버전 관리

로컬로 개발하는 경우 Blob 데이터에 액세스하는 사용자 계정에 올바른 권한이 있는지 확인합니다. Blob 데이터를 읽고 쓰려면 Storage Blob 데이터 참가자가 필요합니다. 이 역할을 자신에게 할당하려면 사용자 액세스 관리자 역할 또는 Microsoft.Authorization/roleAssignments/write 작업을 포함하는 다른 역할이 필요합니다. Azure Portal, Azure CLI 또는 Azure PowerShell을 사용하여 사용자에게 Azure RBAC 역할을 할당할 수 있습니다. 범위 개요 페이지에서 역할 할당에 사용할 수 있는 범위에 대해 자세히 알아볼 수 있습니다.

이 시나리오에서는 최소 권한 원칙을 따르기 위해 범위가 스토리지 계정으로 지정된 사용자 계정에 권한을 할당합니다. 이 방법은 사용자에게 필요한 최소 권한만 부여하고 더 안전한 프로덕션 환경을 만듭니다.

다음 예제에서는 스토리지 계정의 Blob 데이터에 대한 읽기 및 쓰기 액세스를 모두 제공하는 Storage Blob 데이터 참가자 역할을 사용자 계정에 할당합니다.

Important

대부분의 경우 Azure에서 역할 할당이 전파되는 데 1~2분이 걸리지만 드문 경우이지만 최대 8분이 걸릴 수 있습니다. 코드를 처음 실행할 때 인증 오류가 발생하면 잠시 기다렸다가 다시 시도하세요.

  1. Azure Portal에서 기본 검색 창 또는 왼쪽 탐색 영역을 사용하여 스토리지 계정을 찾습니다.

  2. 스토리지 계정 개요 페이지의 왼쪽 메뉴에서 액세스 제어(IAM)를 선택합니다.

  3. 액세스 제어(IAM) 페이지에서 역할 할당 탭을 선택합니다.

  4. 위쪽 메뉴에서 + 추가를 선택한 다음, 드롭다운 메뉴에서 역할 할당 추가를 선택합니다.

    스토리지 계정 역할을 할당하는 방법을 보여 주는 스크린샷.

  5. 검색 상자를 사용하여 결과를 원하는 역할로 필터링합니다. 이 예에서는 Storage Blob 데이터 기여자를 검색하고, 일치하는 결과를 선택하고, 다음을 선택합니다.

  6. 다음에 대한 액세스 할당 아래에서 사용자, 그룹 또는 서비스 주체를 선택한 다음, + 멤버 선택을 선택합니다.

  7. 대화 상자에서 Microsoft Entra 사용자 이름(일반적으로 user@domain 이메일 주소)을 검색한 다음, 대화 상자 하단에서 선택을 선택합니다.

  8. 검토 + 할당을 선택하여 최종 페이지로 이동한 다음, 검토 + 할당을 다시 선택하여 프로세스를 완료합니다.

수신기에 대한 프로젝트 만들기

  1. 솔루션 탐색기 창에서 EventHubQuickStart 솔루션을 마우스 오른쪽 단추로 클릭하고, 추가를 가리키고, 새 프로젝트를 선택합니다.
  2. 콘솔 애플리케이션을 선택하고 다음을 선택합니다.
  3. 프로젝트 이름EventHubsReceiver를 입력하고 만들기를 선택합니다.
  4. 솔루션 탐색기 창에서 EventHubsReceiver를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.

프로젝트에 NuGet 패키지 추가

  1. 메뉴에서 도구>NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

  2. 패키지 관리자 콘솔 창에서 기본 프로젝트EventHubsReceiver가 선택되어 있는지 확인합니다. 그렇지 않은 경우 드롭다운 목록을 사용하여 EventHubsReceiver를 선택합니다.

  3. 다음 명령을 실행하여 Azure.Messaging.EventHubsAzure.Identity NuGet 패키지를 설치합니다. ENTER를 눌러 마지막 명령을 실행합니다.

    Install-Package Azure.Messaging.EventHubs
    Install-Package Azure.Messaging.EventHubs.Processor
    Install-Package Azure.Identity
    

코드 업데이트

Program.cs의 내용을 다음 코드로 바꿉니다.

  1. Program.cs 파일의 기존 코드를 다음 샘플 코드로 바꿉니다. 그런 다음, BlobContainerClient URI에 대한 <STORAGE_ACCOUNT_NAME><BLOB_CONTAINER_NAME> 자리 표시자 값을 바꿉니다. EventProcessorClient에 대한 <EVENT_HUB_NAMESPACE><HUB_NAME> 자리 표시자 값도 바꿉니다.

    다음은 코드의 중요한 단계입니다.

    1. Event Hubs 네임스페이스 및 이벤트 허브 이름을 사용하여 EventProcessorClient 개체를 만듭니다. 앞서 만든 Azure Storage의 컨테이너에 대한 BlobContainerClient 개체를 빌드해야 합니다.
    2. EventProcessorClient 개체의 ProcessEventAsyncProcessErrorAsync 이벤트에 대한 처리기를 지정합니다.
    3. EventProcessorClient 개체에서 StartProcessingAsync를 호출하여 이벤트 처리를 시작합니다.
    4. EventProcessorClient 개체에서 StopProcessingAsync를 호출하여 30초 후에 이벤트 처리를 중지합니다.
    using Azure.Identity;
    using Azure.Messaging.EventHubs;
    using Azure.Messaging.EventHubs.Consumer;
    using Azure.Messaging.EventHubs.Processor;
    using Azure.Storage.Blobs;
    using System.Text;
    
    // Create a blob container client that the event processor will use
    // TODO: Replace <STORAGE_ACCOUNT_NAME> and <BLOB_CONTATINAER_NAME> with actual names
    BlobContainerClient storageClient = new BlobContainerClient(
        new Uri("https://<STORAGE_ACCOUNT_NAME>.blob.core.windows.net/<BLOB_CONTAINER_NAME>"),
        new DefaultAzureCredential());
    
    // Create an event processor client to process events in the event hub
    // TODO: Replace the <EVENT_HUBS_NAMESPACE> and <HUB_NAME> placeholder values
    var processor = new EventProcessorClient(
        storageClient,
        EventHubConsumerClient.DefaultConsumerGroupName,
        "<EVENT_HUB_NAMESPACE>.servicebus.windows.net",
        "<HUB_NAME>",
        new DefaultAzureCredential());
    
    // Register handlers for processing events and handling errors
    processor.ProcessEventAsync += ProcessEventHandler;
    processor.ProcessErrorAsync += ProcessErrorHandler;
    
    // Start the processing
    await processor.StartProcessingAsync();
    
    // Wait for 30 seconds for the events to be processed
    await Task.Delay(TimeSpan.FromSeconds(30));
    
    // Stop the processing
    await processor.StopProcessingAsync();
    
    Task ProcessEventHandler(ProcessEventArgs eventArgs)
    {
        // Write the body of the event to the console window
        Console.WriteLine("\tReceived event: {0}", Encoding.UTF8.GetString(eventArgs.Data.Body.ToArray()));
        Console.ReadLine();
        return Task.CompletedTask;
    }
    
    Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs)
    {
        // Write details about the error to the console window
        Console.WriteLine($"\tPartition '{eventArgs.PartitionId}': an unhandled exception was encountered. This was not expected to happen.");
        Console.WriteLine(eventArgs.Exception.Message);
        Console.ReadLine();
        return Task.CompletedTask;
    }
    
  1. 프로그램을 빌드하고 오류가 없는지 확인합니다.

    참고 항목

    정보 제공을 위한 주석을 비롯한 전체 소스 코드는 GitHub의 이 파일을 참조하세요.

  2. 수신기 애플리케이션을 실행합니다.

  3. 이벤트가 수신되었다는 메시지가 표시됩니다. 수신된 이벤트 메시지를 확인한 후 Enter 키를 누릅니다.

    Received event: Event 1
    Received event: Event 2
    Received event: Event 3    
    

    이러한 이벤트는 앞에서 송신기 프로그램을 실행하여 이벤트 허브로 보낸 세 개 이벤트입니다.

  4. Azure Portal에서는 Event Hubs가 수신 애플리케이션에 보낸 3개의 나가는 메시지가 있는지 확인할 수 있습니다. 페이지를 새로 고쳐 차트를 업데이트합니다. 메시지가 수신되었다는 내용이 표시될 때까지 몇 초 정도 걸릴 수 있습니다.

    이벤트 허브가 수신 앱에 이벤트를 보냈는지 확인하는 Azure Portal 페이지의 이미지

Event Hubs SDK 기반 애플리케이션에 대한 스키마 유효성 검사

Event Hubs SDK 기반 애플리케이션으로 데이터를 스트리밍할 때 Azure 스키마 레지스트리를 사용하여 스키마 유효성 검사를 수행할 수 있습니다. Event Hubs의 Azure 스키마 레지스트리는 스키마를 관리하기 위한 중앙 집중식 리포지토리를 제공하며 신규 또는 기존 애플리케이션을 스키마 레지스트리와 원활하게 연결할 수 있습니다.

자세한 내용은 Event Hubs SDK를 사용하여 스키마 유효성 검사를 참조하세요.

샘플 및 참조

이 빠른 시작에서는 이벤트 일괄 처리를 이벤트 허브로 보낸 다음, 받는 시나리오를 구현하기 위한 단계별 지침을 제공합니다. 더 많은 샘플을 보려면 다음 링크를 선택합니다.

전체 .NET 라이브러리 참조는 SDK 설명서를 참조하세요.

리소스 정리

Event Hubs 네임스페이스가 있는 리소스 그룹을 삭제하거나 리소스 그룹을 유지하려는 경우 네임스페이스만 삭제합니다.

다음 자습서를 참조하세요.