Azure Service Bus 토픽에 메시지를 보내고 구독에서 토픽으로 메시지 받기(Python)
이 자습서에서 수행하는 단계는 다음과 같습니다.
- Azure Portal을 사용하여 Service Bus 네임스페이스를 만듭니다.
- Azure Portal을 사용하여 Service Bus 항목을 만듭니다.
- Azure Portal을 사용하여 해당 항목에 Service Bus 구독을 만듭니다.
- azure-servicebus 패키지를 사용하여 다음을 수행하는 Python 애플리케이션을 작성합니다.
- 토픽에 메시지 집합을 보냅니다.
- 구독에서 이러한 메시지를 받습니다.
참고 항목
이 빠른 시작에서는 메시지 일괄 처리를 Service Bus 토픽으로 보내고 해당 토픽의 구독에서 해당 메시지를 받는 간단한 시나리오에 대한 단계별 지침을 제공합니다. GitHub의 Python용 Azure SDK 리포지토리에서 Azure Service Bus용으로 미리 빌드된 Python 샘플을 찾을 수 있습니다.
필수 구성 요소
- Azure 구독.
- Python 3.8 이상
참고 항목
이 자습서에서는 Python을 사용하여 복사하고 실행할 수 있는 샘플을 사용합니다. Python 애플리케이션을 만드는 방법에 대한 지침은 Python 애플리케이션을 만들고 Azure 웹 사이트에 배포를 참조하세요. 이 자습서에서 사용되는 패키지를 설치하는 방법에 대한 자세한 내용은 Python 설치 가이드를 참조하세요.
Azure Portal에서 네임스페이스 만들기
Azure에서 Service Bus 메시징 엔터티 사용을 시작하려면 먼저 Azure에서 고유한 이름인 네임스페이스를 만들어야 합니다. 네임스페이스는 애플리케이션 내의 Service Bus 리소스(큐, 토픽 등)에 대한 범위 지정 컨테이너를 제공합니다.
네임스페이스를 만들려면
Azure Portal에 로그인합니다.
전체 서비스 페이지로 이동합니다.
왼쪽 탐색 모음에서 범주 목록에서 통합을 선택하고 마우스를 Service Bus 위로 가져간 다음 Service Bus 타일에서 + 단추를 선택합니다.
네임스페이스 만들기 페이지의 기본 사항 태그에서 다음 단계를 수행합니다.
구독에 대해 네임스페이스를 만들 Azure 구독을 선택합니다.
리소스 그룹에 대해 네임스페이스가 있는 기존 리소스 그룹을 선택하거나 새로 만듭니다.
네임스페이스 이름을 입력합니다. 네임스페이스 이름은 다음 명명 규칙을 따라야 합니다.
- 이름은 Azure에서 고유해야 합니다. 시스템에서 사용 가능한 이름인지 즉시 확인합니다.
- 이름 길이는 6~50자여야 합니다.
- 이름에는 문자, 숫자, "-" 하이픈만 포함될 수 있습니다.
- 이름은 문자로 시작하고 문자 또는 숫자로 끝나야 합니다.
- 이름은 "-sb" 또는 "-mgmt"로 끝나지 않습니다.
위치에 대해 네임스페이스가 호스팅되어야하는 지역을 선택합니다.
가격 책정 계층에 대해 네임스페이스에 대한 가격 책정 계층(기본, 표준 또는 프리미엄)을 선택합니다. 이 빠른 시작의 경우 표준을 선택합니다.
Important
토픽 및 구독을 사용하려면 표준 또는 프리미엄을 선택합니다. 토픽/구독은 기본 가격 책정 계층에서 지원되지 않습니다.
프리미엄 가격 책정 계층을 선택한 경우 메시징 단위 수를 지정합니다. 프리미엄 계층은 CPU 및 메모리 수준에서 리소스 격리를 제공하므로 각 워크로드가 독립적으로 실행됩니다. 이 리소스 컨테이너를 메시징 단위라고 합니다. 프리미엄 네임스페이스에는 하나 이상의 메시징 단위가 있습니다. 각 Service Bus 프리미엄 네임스페이스에 대해 1, 2, 4, 8 또는 16개의 메시징 단위를 선택할 수 있습니다. 자세한 내용은 Service Bus 프리미엄 메시징을 참조하세요.
페이지 아래쪽에서 검토 + 만들기를 선택합니다.
검토 + 만들기 페이지에서 설정을 검토하고 만들기를 선택합니다.
리소스 배포에 성공하면 배포 페이지에서 리소스로 이동을 선택합니다.
Service Bus 네임스페이스에 대한 홈페이지가 표시됩니다.
Azure Portal을 사용하여 항목 만들기
Service Bus 네임스페이스 페이지의 왼쪽 메뉴에서 항목을 선택합니다.
도구 모음에서 + 항목을 선택합니다.
항목의 이름을 입력합니다. 다른 옵션은 기본값 그대로 둡니다.
만들기를 실행합니다.
항목에 대한 구독 만들기
이전 섹션에서 만든 항목을 선택합니다.
Service Bus 토픽 페이지의 도구 모음에서 + 구독을 선택합니다.
구독 만들기 페이지에서 다음 단계를 수행합니다.
구독 이름에 S1을 입력합니다.
최대 전달 횟수에 3을 입력합니다.
그런 다음, 만들기를 선택하여 구독을 만듭니다.
Azure에 앱 인증
이 빠른 시작에서는 Azure Service Bus에 연결하는 두 가지 방법인 암호 없음과 연결 문자열을 보여줍니다.
첫 번째 옵션은 Microsoft Entra ID 및 RBAC(역할 기반 액세스 제어)의 보안 주체를 사용하여 Service Bus 네임스페이스에 연결하는 방법을 보여 줍니다. 코드, 구성 파일 또는 Azure Key Vault와 같은 보안 스토리지에 하드 코딩된 연결 문자열이 있는지 걱정할 필요가 없습니다.
두 번째 옵션은 연결 문자열을 사용하여 Service Bus 네임스페이스에 연결하는 방법을 보여줍니다. Azure를 처음 사용하는 경우 연결 문자열 옵션이 더 쉬울 수 있습니다. 실제 애플리케이션 및 프로덕션 환경에서는 암호 없는 옵션을 사용하는 것이 좋습니다. 자세한 내용은 인증 및 권한 부여를 참조하세요. 개요 페이지에서 암호 없는 인증에 대해 자세히 알아볼 수도 있습니다.
Microsoft Entra 사용자에게 역할 할당
로컬에서 개발할 때 Azure Service Bus에 연결하는 사용자 계정에 올바른 권한이 있는지 확인합니다. 메시지를 보내고 받으려면 Azure Service Bus 데이터 소유자 역할이 필요합니다. 자신에게 이 역할을 할당하려면 사용자 액세스 관리자 역할 또는 Microsoft.Authorization/roleAssignments/write
작업을 포함하는 다른 역할이 필요합니다. Azure Portal, Azure CLI 또는 Azure PowerShell을 사용하여 사용자에게 Azure RBAC 역할을 할당할 수 있습니다. 범위 개요 페이지에서 역할 할당에 사용할 수 있는 범위에 대해 자세히 알아봅니다.
다음 예에서는 Azure Service Bus 리소스에 대한 모든 권한을 제공하는 Azure Service Bus Data Owner
역할을 사용자 계정에 할당합니다. 실제 시나리오에서는 최소 권한 원칙에 따라 사용자에게 보다 안전한 프로덕션 환경에 필요한 최소한의 권한만 부여합니다.
Azure Service Bus에 대한 Azure 기본 제공 역할
Azure Service Bus의 경우 Azure Portal 및 Azure 리소스 관리 API를 통한 네임스페이스 및 관련된 모든 리소스의 관리는 이미 Azure RBAC 모델을 사용하여 보호되고 있습니다. Azure는 Service Bus 네임스페이스에 대한 액세스 권한을 부여하기 위해 아래와 같은 Azure 기본 제공 역할을 제공합니다.
- Azure Service Bus 데이터 소유자: Service Bus 네임스페이스 및 해당 엔터티(큐, 토픽, 구독 및 필터)에 대한 데이터 액세스를 사용하도록 설정합니다. 이 역할의 멤버는 큐 또는 토픽/구독에서 메시지를 보내고 받을 수 있습니다.
- Azure Service Bus 데이터 보내는 사람: 이 역할을 사용하여 Service Bus 네임스페이스 및 해당 엔터티에 대한 전송 액세스 권한을 부여합니다.
- Azure Service Bus 데이터 받는 사람: 이 역할을 사용하여 Service Bus 네임스페이스 및 해당 엔터티에 대한 수신 액세스 권한을 부여합니다.
사용자 지정 역할을 만들려면 Service Bus 작업에 필요한 권한을 참조하세요.
Azure Service Bus 소유자 역할에 Microsoft Entra 사용자 추가
Service Bus 네임스페이스 수준에서 Azure Service Bus 데이터 소유자 역할에 Microsoft Entra 사용자 이름을 추가합니다. 사용자 계정의 컨텍스트에서 실행되는 앱이 큐 또는 토픽에 메시지를 보내고 큐 또는 토픽의 구독에서 메시지를 받을 수 있습니다.
Important
대부분의 경우 역할 할당이 Azure에서 전파되는 데 1~2분이 걸립니다. 드문 경우지만 최대 8분이 소요될 수 있습니다. 코드를 처음 실행할 때 인증 오류가 발생하면 잠시 기다렸다가 다시 시도하세요.
Azure Portal에 Service Bus 네임스페이스 페이지가 열려 있지 않은 경우 기본 검색 창이나 왼쪽 탐색 모음을 사용하여 Service Bus 네임스페이스를 찾습니다.
개요 페이지의 왼쪽 메뉴에서 액세스 제어(IAM)를 선택합니다.
액세스 제어(IAM) 페이지에서 역할 할당 탭을 선택합니다.
위쪽 메뉴에서 + 추가를 선택한 다음, 드롭다운 메뉴에서 역할 할당 추가를 선택합니다.
검색 상자를 사용하여 결과를 원하는 역할로 필터링합니다. 이 예에서는
Azure Service Bus Data Owner
를 검색하고 일치하는 결과를 선택합니다. 다음을 선택합니다.다음에 대한 액세스 할당 아래에서 사용자, 그룹 또는 서비스 주체를 선택한 다음, + 멤버 선택을 선택합니다.
대화 상자에서 Microsoft Entra 사용자 이름(일반적으로 user@domain 이메일 주소)을 검색한 다음, 대화 상자 하단에서 선택을 선택합니다.
검토 + 할당을 선택하여 최종 페이지로 이동한 다음, 검토 + 할당을 다시 선택하여 프로세스를 완료합니다.
코드 설정
암호 없는 인증 및 자체 Azure 계정을 사용하여 이 빠른 시작을 진행하려면 다음을 수행합니다.
- Azure CLI를 설치합니다.
- 터미널 또는 명령 프롬프트에서
az login
을 사용하여 Azure 계정으로 로그인합니다. - 자습서의 뒷부분에서 리소스에 적절한 역할을 추가할 때 동일한 계정을 사용합니다.
- 동일한 터미널 또는 명령 프롬프트에서 자습서 코드를 실행합니다.
Important
az login
으로 로그인해야 합니다. 암호 없는 코드의 클래스는 DefaultAzureCredential
Azure CLI 자격 증명을 사용하여 Microsoft Entra ID로 인증합니다.
암호 없는 코드를 사용하려면 다음을 지정해야 합니다.
- 정규화된 Service Bus 네임스페이스(예: <service-bus-namespace>.servicebus.windows.net)
- 토픽 이름
- 구독 이름
pip를 사용하여 패키지 설치
이 Service Bus 자습서에 필요한 Python 패키지를 설치하려면 해당 경로에 Python이 있는 명령 프롬프트를 엽니다. 샘플을 저장할 폴더로 디렉터리를 변경합니다.
패키지를 설치합니다.
pip install azure-servicebus pip install azure-identity pip install aiohttp
토픽에 메시지 보내기
다음 샘플 코드에서는 Service Bus 토픽으로 메시지 일괄 처리를 보내는 방법을 보여줍니다. 자세한 내용은 코드 주석을 참조하세요.
Visual Studio Code 같은 즐겨 찾는 편집기를 열고 send.py 파일을 만든 후 다음 코드를 추가합니다.
다음
import
문을 추가합니다.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.servicebus import ServiceBusMessage from azure.identity.aio import DefaultAzureCredential
상수를 추가하고 자격 증명을 정의합니다.
FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Important
FULLY_QUALIFIED_NAMESPACE
를 Service Bus 네임스페이스의 정규화된 네임스페이스로 바꿉니다.TOPIC_NAME
을 토픽 이름으로 바꿉니다.
이전 코드에서는 Azure ID 클라이언트 라이브러리의
DefaultAzureCredential
클래스를 사용했습니다. 개발 중에 앱이 로컬로 실행되면DefaultAzureCredential
은 Azure CLI에 로그인하는 데 사용된 계정을 사용하여 Azure를 자동으로 검색하고 Azure에 인증합니다. 앱이 Azure에 배포되면DefaultAzureCredential
은 코드 변경 없이 관리 ID를 통해 Microsoft Entra ID에 앱을 인증할 수 있습니다.단일 메시지를 보내는 메서드를 추가합니다.
async def send_single_message(sender): # Create a Service Bus message message = ServiceBusMessage("Single Message") # send the message to the topic await sender.send_messages(message) print("Sent a single message")
보낸 사람은 만든 항목에 대한 클라이언트 역할을 하는 개체입니다. 나중에 만들어 이 함수에 인수로 보냅니다.
메시지 목록을 보내는 메서드를 추가합니다.
async def send_a_list_of_messages(sender): # Create a list of messages messages = [ServiceBusMessage("Message in list") for _ in range(5)] # send the list of messages to the topic await sender.send_messages(messages) print("Sent a list of 5 messages")
메시지 일괄 처리를 보내는 메서드를 추가합니다.
async def send_batch_message(sender): # Create a batch of messages async with sender: batch_message = await sender.create_message_batch() for _ in range(10): try: # Add a message to the batch batch_message.add_message(ServiceBusMessage("Message inside a ServiceBusMessageBatch")) except ValueError: # ServiceBusMessageBatch object reaches max_size. # New ServiceBusMessageBatch object can be created here to send more data. break # Send the batch of messages to the topic await sender.send_messages(batch_message) print("Sent a batch of 10 messages")
Service Bus 클라이언트를 만든 다음, 메시지를 보낼 토픽 발신자 개체를 만듭니다.
async def run(): # create a Service Bus client using the credential. async with ServiceBusClient( fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE, credential=credential, logging_enable=True) as servicebus_client: # Get a Topic Sender object to send messages to the topic sender = servicebus_client.get_topic_sender(topic_name=TOPIC_NAME) async with sender: # Send one message await send_single_message(sender) # Send a list of messages await send_a_list_of_messages(sender) # Send a batch of messages await send_batch_message(sender) # Close credential when no longer needed. await credential.close() asyncio.run(run()) print("Done sending messages") print("-----------------------")
구독에서 메시지 받기
다음 샘플 코드는 구독에서 메시지를 수신하는 방법을 보여줍니다. 이 코드는 5(max_wait_time
)초 동안 새 메시지를 수신하지 않을 때까지 계속해서 새 메시지를 받습니다.
Visual Studio Code 같은 즐겨 찾는 편집기를 열고 recv.py 파일을 만든 후 다음 코드를 추가합니다.
send 샘플과 마찬가지로
import
문을 추가하고, 고유한 값으로 대체해야 하는 상수를 정의하고, 자격 증명을 정의합니다.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.identity.aio import DefaultAzureCredential FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" SUBSCRIPTION_NAME = "SUBSCRIPTION_NAME" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
메시지를 받을 Service Bus 클라이언트 및 구독 수신자 개체를 차례로 만듭니다.
async def run(): # create a Service Bus client using the credential async with ServiceBusClient( fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE, credential=credential, logging_enable=True) as servicebus_client: async with servicebus_client: # get the Subscription Receiver object for the subscription receiver = servicebus_client.get_subscription_receiver(topic_name=TOPIC_NAME, subscription_name=SUBSCRIPTION_NAME, max_wait_time=5) async with receiver: received_msgs = await receiver.receive_messages(max_wait_time=5, max_message_count=20) for msg in received_msgs: print("Received: " + str(msg)) # complete the message so that the message is removed from the subscription await receiver.complete_message(msg) # Close credential when no longer needed. await credential.close()
run
메서드를 호출합니다.asyncio.run(run())
앱 실행
해당 경로에 Python이 있는 명령 프롬프트를 열고 토픽에서 구독에 대한 메시지를 보내고 받는 코드를 실행합니다.
python send.py; python recv.py
다음과 같은 출력이 표시됩니다.
Sent a single message
Sent a list of 5 messages
Sent a batch of 10 messages
Done sending messages
-----------------------
Received: Single Message
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Azure portal에서 Service Bus 네임스페이스로 이동합니다. 개요 페이지에서 수신 및 발신 메시지 수가 16개인지 확인합니다. 개수가 표시되지 않으면 몇 분 정도 기다린 후 페이지를 새로 고칩니다.
토픽에 대한 Service Bus 토픽 페이지를 보려면 아래쪽 창에서 토픽을 선택합니다. 이 페이지에는 메시지 차트에 세 개의 들어오고 나가는 메시지가 표시됩니다.
이 페이지에서 구독을 선택하면 Service Bus 구독 페이지로 이동합니다. 이 페이지에서는 활성 메시지 수, 전달 못한 메시지 수 등을 볼 수 있습니다. 이 예제에서는 모든 메시지가 수신되었으므로 활성 메시지 수는 0입니다.
수신 코드를 주석으로 처리하면 활성 메시지 수가 16으로 표시됩니다.
다음 단계
다음 설명서와 샘플을 참조하세요.
- Python용 Azure Service Bus 클라이언트 라이브러리
- 샘플.
- sync_samples 폴더에는 동기 방식으로 Service Bus와 상호 작용하는 방법을 보여주는 샘플이 있습니다. 이 빠른 시작에서는 이 메서드를 사용했습니다.
- async_samples 폴더에는 비동기 방식으로 Service Bus와 상호 작용하는 방법을 보여주는 샘플이 있습니다.
- azure-servicebus 참조 설명서