자습서: 사용자 지정 토픽을 사용하여 Azure Event Grid의 MQTT 메시지를 Azure Functions로 라우팅 - Azure CLI

이 자습서에서는 다음 단계에 따라 Event Grid 사용자 지정 항목을 통해 Azure Event Grid 네임스페이스에서 받은 MQTT 메시지를 Azure 함수로 라우팅하는 방법을 알아봅니다.

Azure 구독이 없으면 평가판에 등록할 수 있습니다.

필수 조건

Visual Studio Code를 사용하여 Azure 함수 만들기의 지침을 따르지만 HTTP 트리거를 사용하는 대신 Azure Event Grid 트리거사용합니다. 다음 예제와 유사한 코드가 표시됩니다.

using System;
using Azure.Messaging;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public class MyEventGridTriggerFunc
    {
        private readonly ILogger<MyEventGridTriggerFunc> _logger;

        public MyEventGridTriggerFunc(ILogger<MyEventGridTriggerFunc> logger)
        {
            _logger = logger;
        }

        [Function(nameof(MyEventGridTriggerFunc))]
        public void Run([EventGridTrigger] CloudEvent cloudEvent)
        {
            _logger.LogInformation("Event type: {type}, Event subject: {subject}", cloudEvent.Type, cloudEvent.Subject);
        }
    }
}

이 Azure 함수는 이 자습서의 뒷부분에서 토픽의 구독에 대한 이벤트 처리기로 사용합니다.

참고 항목

  • 동일한 지역에 모든 리소스를 만듭니다.
  • 이 자습서는 .NET 8.0(격리된) 런타임 스택을 사용하는 Azure 함수로 테스트되었습니다.

Event Grid 토픽 만들기(사용자 지정 항목)

이 단계에서는 Event Grid 토픽을 만듭니다.

  1. 스크립트를 복사하여 편집기로 붙여넣습니다.
  2. 다음 값을 바꿉다.
  3. Cloud Shell 열기를 선택합니다.
  4. PowerShell에서 Bash전환합니다(Cloud Shell 창의 왼쪽 위 모서리에 있음).
  5. 편집기에서 Cloud Shell로 스크립트를 복사하여 붙여넣고 스크립트를 실행합니다.

스크립트는 Azure 리소스 그룹 및 Event Grid 사용자 지정 토픽을 만듭니다. 이 자습서의 뒷부분에서는 Event Grid 네임스페이스에 대한 라우팅을 구성하여 네임스페이스로 전송된 이벤트 또는 메시지가 사용자 지정 토픽으로 라우팅된 다음 토픽에 대한 구독을 통해 Azure 함수로 라우팅되도록 합니다.

자리 표시자 설명
RESOURCEGROUPNAME 만들 리소스 그룹의 이름입니다.
REGION 리소스 그룹 및 사용자 지정 토픽을 만들려는 지역입니다.
TOPICNAME 만들 사용자 지정 토픽의 이름입니다.

스크립트는 명령을 az eventgrid topic create 사용하여 Event Grid 토픽 또는 사용자 지정 토픽을 만듭니다. 스키마 유형은 클라우드 이벤트 스키마로 지정됩니다.

rgName="RESOURCEGROUPNAME"
location="REGION"
topicName="TOPICNAME"

az group create -n $rgName -l $location

az eventgrid topic create --name $topicName -l $location -g $rgName --input-schema cloudeventschemav1_0

참고 항목

이 자습서의 모든 위치에서 클라우드 이벤트 스키마를 사용합니다.

함수를 사용하여 토픽에 구독 추가

이 단계에서는 이전에 만든 Azure 함수를 사용하여 사용자 지정 토픽에 대한 구독을 만듭니다.

다음 값을 바꾸고 Cloud Shell에서 스크립트를 실행합니다. 스크립트는 이 az eventgrid event-subscription create 명령을 사용하여 사용자 지정 토픽에 대한 Azure 함수 구독을 만듭니다. 명령에서 원본 ID는 토픽의 리소스 ID이고 엔드포인트는 함수의 리소스 ID입니다. 엔드포인트 유형이 Azure 함수로 설정되고 이벤트 배달 스키마가 클라우드 이벤트 스키마로 지정됩니다.

자리 표시자 설명
FUNCTIONRESOURCEGROUP Azure Functions 앱이 있는 리소스 그룹의 이름입니다.
FUNCTIONSAPPNAME Azure Functions 앱의 이름입니다.
FUNCTIONNAME Azure 함수의 이름입니다.
funcAppRgName="FUNCTIONRESOURCEGROUP"
funcAppName="FUNCTIONSAPPNAME"
funcName="FUNCTIONNAME"
funcResourceId=$(az functionapp function show -g $funcAppRgName -n $funcAppName --function-name $funcName --query "{I:id}" -o tsv)

topicResourceId=$(az eventgrid topic show --name $topicName -g $rgName --query id --output tsv)
eventSubscriptionName="EVENTSUBSCRIPTIONNAME"
az eventgrid event-subscription create --name $eventSubscriptionName --source-resource-id $topicResourceId  --endpoint-type azurefunction --endpoint $funcResourceId --event-delivery-schema cloudeventschemav1_0

네임스페이스, 클라이언트, 토픽 공간 및 권한 바인딩 만들기

빠른 시작의 지침을 따릅니다. Azure CLI 를 사용하여 Event Grid 네임스페이스의 MQTT 메시지를 게시하고 구독하여 다음을 수행합니다.

  1. Event Grid 네임스페이스를 만듭니다.
  2. 두 개의 클라이언트를 만듭니다.
  3. 토픽 공간을 만듭니다.
  4. 게시자 및 구독자 권한 바인딩을 만듭니다.
  5. MQTTX 앱을 사용하여 테스트하여 클라이언트가 메시지를 보내고 받을 수 있는지 확인합니다.

네임스페이스에 대한 관리 ID 사용

다음 값을 바꾸고 스크립트를 실행하여 Event Grid 네임스페이스에 대해 시스템 할당 관리 ID를 사용하도록 설정합니다.

자리 표시자 설명
EVENTGRIDNAMESPACENAME Event Grid 네임스페이스의 이름입니다.

스크립트는 ID로 az eventgrid namespace update identity 설정된 SystemAssigned 명령을 사용합니다.

nsName="EVENTGRIDNAMESPACENAME"
az eventgrid namespace update -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled}" --identity "{type:SystemAssigned}"

그런 다음, 네임스페이스가 메시지를 사용자 지정 토픽으로 보내거나 라우팅할 수 있도록 이전에 만든 Event Grid 사용자 지정 토픽에 대한 보내기 권한을 네임스페이스의 관리 ID에 부여합니다. 이렇게 하려면 사용자 지정 항목의 Event Grid 데이터 발신자 역할에 관리 ID를 추가합니다.

egNamespaceServicePrincipalObjectID=$(az ad sp list --display-name $nsName --query [].id -o tsv)
topicResourceId=$(az eventgrid topic show --name $topicName -g $rgName --query id --output tsv)
az role assignment create --assignee $egNamespaceServicePrincipalObjectID --role "EventGrid Data Sender" --scope $topicResourceId

스크립트는 네임스페이 az role assignment create 스의 관리 ID 및 사용자 지정 항목의 ID와 함께 명령을 사용하고 사용자 지정 항목의 네임스페이스의 관리 ID에 Event Grid 데이터 발신자 역할을 할당합니다.

사용자 지정 토픽을 통해 Azure 함수로 라우팅 메시지 구성

이 단계에서는 받은 메시지가 사용자가 만든 사용자 지정 토픽으로 라우팅되도록 Event Grid 네임스페이스에 대한 라우팅을 구성합니다.

az eventgrid namespace update -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled,'routeTopicResourceId':$topicResourceId,'routingIdentityInfo':{type:SystemAssigned}}"

스크립트는 명령을 사용하여 az eventgrid namespace update 라우팅 토픽과 이벤트를 토픽으로 라우팅하는 데 사용할 관리 ID 유형을 설정합니다.

MQTTX를 사용하여 테스트 MQTT 메시지 보내기

테스트 MQTT 메시지를 네임스페이스로 보내고 함수가 메시지를 받는지 확인합니다.

게시의 지침에 따라 MQTTX 앱 문서를 사용하여 메시지를 구독하여 Event Grid 네임스페이스에 몇 가지 테스트 메시지를 보냅니다.

이벤트 또는 메시지의 흐름은 다음과 같습니다.

  1. MQTTX는 Event Grid 네임스페이스의 토픽 공간으로 메시지를 보냅니다.

  2. 메시지는 구성한 사용자 지정 토픽으로 라우팅됩니다.

  3. 메시지는 Azure 함수인 이벤트 구독으로 전달됩니다.

  4. 로깅 기능을 사용하여 함수가 이벤트를 수신했는지 확인합니다.

    Azure 함수의 로그 스트림 페이지를 보여 주는 스크린샷

다음 단계

이 GitHub 리포지토리의 코드 샘플을 참조하세요.