빠른 시작: Azure CLI를 사용하여 Event Grid 네임스페이스에서 MQTT 메시지 게시 및 구독
Azure Event Grid MQTT 브로커 기능은 MQTT 프로토콜을 사용하여 메시징을 지원합니다. 클라이언트(디바이스 및 클라우드 애플리케이션 모두)는 대규모 브로드캐스트 및 명령 및 제어와 같은 시나리오에 대해 유연한 계층적 토픽을 통해 MQTT 메시지를 게시하고 구독할 수 있습니다.
이 문서에서는 Azure CLI를 사용하여 다음을 수행합니다.
- Event Grid 네임스페이스를 만들고 MQTT 브로커를 사용하도록 설정합니다.
- 클라이언트, 클라이언트 그룹 및 토픽 공간과 같은 하위 리소스를 만듭니다.
- 토픽 공간을 게시하고 구독할 수 있는 액세스 권한을 클라이언트에 부여합니다.
- MQTT 메시지를 게시하고 받습니다.
Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.
필수 조건
- Event Grid를 처음 사용하는 경우 이 자습서를 시작하기 전에 Event Grid 개요를 읽어 보세요.
- Event Grid 리소스 공급자 등록의 단계에 따라 Event Grid 리소스 공급자를 등록합니다.
- 방화벽에서 포트 8883이 열려 있는지 확인합니다. 이 자습서의 샘플은 포트 8883을 통해 통신하는 MQTT 프로토콜을 사용합니다. 이 포트는 일부 회사 및 교육용 네트워크 환경에서 차단될 수 있습니다.
- Azure Cloud Shell에서 Bash 환경을 사용합니다. 자세한 내용은 Azure Cloud Shell의 Bash에 대한 빠른 시작을 참조하세요.
- CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치합니다. Windows 또는 macOS에서 실행 중인 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI를 실행을 참조하세요.
- 로컬 설치를 사용하는 경우
az login
명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 나타나는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 로그인을 참조하세요. - 메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI에서 확장 사용을 참조하세요.
- az version을 실행하여 설치된 버전과 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.
- 이 문서대로 하려면 Azure CLI 버전 2.53.1 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.
- 지문을 생성하고 클라이언트 연결을 인증하려면 X.509 클라이언트 인증서가 필요합니다.
- Event Grid 네임스페이스 CLI 설명서를 검토합니다.
샘플 클라이언트 인증서 및 지문 생성
인증서가 아직 없는 경우 step CLI를 사용하여 샘플 인증서를 만들 수 있습니다. Windows용으로 수동으로 설치하는 것이 좋습니다.
step CLI를 사용하여 성공적으로 설치한 후 사용자 프로필 폴더에서 명령 프롬프트를 엽니다(Win+R에서 %USERPROFILE% 입력).
루트 및 중간 인증서를 만들려면 다음 명령을 실행합니다. 다음 단계에서 사용해야 하므로 암호를 기억하세요.
step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
생성된 CA(인증 기관) 파일을 사용하여 클라이언트에 대한 인증서를 만듭니다. 명령에서 인증서 및 비밀 파일에 올바른 경로를 사용해야 합니다.
step certificate create client1-authnID client1-authnID.pem client1-authnID.key --ca .step/certs/intermediate_ca.crt --ca-key .step/secrets/intermediate_ca_key --no-password --insecure --not-after 2400h
지문을 보려면 step 명령을 실행합니다.
step certificate fingerprint client1-authnID.pem
네임스페이스 만들기
명령을 사용하여 네임스페이스를 만듭니다. 리소스 그룹 및 네임스페이스 이름으로 명령을 업데이트합니다.
az eventgrid namespace create -g {Resource Group} -n {Namespace Name} --topic-spaces-configuration "{state:Enabled}"
빠른 시작을 단순하게 유지하려면 최소한의 속성으로 네임스페이스를 만듭니다. 마법사의 다른 페이지에서 네트워크, 보안 및 기타 설정을 구성하는 방법에 대한 자세한 단계는 네임스페이스 만들기 및 관리를 참조하세요.
클라이언트 만들기
명령을 사용하여 클라이언트를 만듭니다. 리소스 그룹 및 네임스페이스 이름으로 명령을 업데이트합니다.
az eventgrid namespace client create -g {Resource Group} --namespace-name {Namespace Name} -n {Client Name} --authentication-name client1-authnID --client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[Client Thumbprint]}"
- 빠른 시작을 단순하게 유지하기 위해 인증에 지문 일치를 사용합니다. 클라이언트 인증에 X.509 CA 인증서 체인을 사용하는 방법에 대한 단계는 인증서 체인을 사용하여 클라이언트 인증을 참조하세요.
- 이 연습에서는 네임스페이스의 모든 클라이언트를 포함하는 기본
$all client
그룹을 사용합니다. 클라이언트 특성을 사용하여 사용자 지정 클라이언트 그룹을 만클라이언트드는 방법에 대한 자세한 내용은 클라이언트 그룹을 참조하세요.
토픽 공간 만들기
명령을 사용하여 토픽 공간을 만듭니다. 리소스 그룹, 네임스페이스 이름 및 토픽 공간 이름으로 명령을 업데이트합니다.
az eventgrid namespace topic-space create -g {Resource Group} --namespace-name {Namespace Name} -n {Topicspace Name} --topic-templates ['contosotopics/topic1']
권한 바인딩 만들기
az eventgrid
명령을 사용하여 게시자 권한에 대한 첫 번째 권한 바인딩을 만듭니다. 리소스 그룹, 네임스페이스 이름 및 권한 바인딩 이름으로 명령을 업데이트합니다.
az eventgrid namespace permission-binding create -g {Resource Group} --namespace-name {Namespace Name} -n {Permission Binding Name} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}
명령을 사용하여 두 번째 권한 바인딩을 만듭니다. 리소스 그룹, 네임스페이스 이름 및 권한 바인딩 이름으로 명령을 업데이트합니다. 이 권한 바인딩은 구독자를 위한 것입니다.
az eventgrid namespace permission-binding create -g {Resource Group} --namespace-name {Namespace Name} -n {Name of second Permission Binding} --client-group-name '$all' --permission subscriber --topic-space-name {Topicspace Name}
MQTT 메시지 게시 및 구독
다음 샘플 코드는 네임스페이스에 연결 및 게시를 시도하고 MQTT 토픽을 구독하는 간단한 .NET 게시자입니다. 코드를 사용하여 요구 사항에 따라 수정하고 Visual Studio 또는 원하는 도구에서 코드를 실행할 수 있습니다.
이 코드를 실행하려면 NuGet에서 MQTTnet 패키지(버전 4.1.4.563)를 설치해야 합니다. Visual Studio의 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭한 후 NuGet 패키지 관리로 이동하고 MQTTnet을 검색합니다. MQTTnet 패키지를 선택하고 설치합니다.)
참고 항목
다음 샘플 코드는 데모용으로만 제공되며 프로덕션 용도로 사용될 수 없습니다.
클라이언트를 연결하고, 게시하고, 토픽의 MQTT 메시지를 구독하는 샘플 C# 코드
Important
클라이언트 인증서 파일의 위치에 따라 클라이언트 인증서 및 키 pem 파일 경로를 업데이트합니다. 또한 클라이언트 인증 이름 및 토픽 정보가 구성과 일치하는지 확인합니다.
using MQTTnet.Client;
using MQTTnet;
using System.Security.Cryptography.X509Certificates;
string hostname = "{Your Event Grid namespace MQTT hostname}";
string clientId = "client1-session1"; //client ID can be the session identifier. A client can have multiple sessions using username and clientId.
string x509_pem = @" client certificate cer.pem file path\client.cer.pem"; //Provide your client certificate .cer.pem file path
string x509_key = @"client certificate key.pem file path\client.key.pem"; //Provide your client certificate .key.pem file path
var certificate = new X509Certificate2(X509Certificate2.CreateFromPemFile(x509_pem, x509_key).Export(X509ContentType.Pkcs12));
var mqttClient = new MqttFactory().CreateMqttClient();
var connAck = await mqttClient!.ConnectAsync(new MqttClientOptionsBuilder()
.WithTcpServer(hostname, 8883)
.WithClientId(clientId)
.WithCredentials("client1-authnID", "") //use client authentication name in the username
.WithTls(new MqttClientOptionsBuilderTlsParameters()
{
UseTls = true,
Certificates = new X509Certificate2Collection(certificate)
})
.Build());
Console.WriteLine($"Client Connected: {mqttClient.IsConnected} with CONNACK: {connAck.ResultCode}");
mqttClient.ApplicationMessageReceivedAsync += async m => await Console.Out.WriteAsync($"Received message on topic: '{m.ApplicationMessage.Topic}' with content: '{m.ApplicationMessage.ConvertPayloadToString()}'\n\n");
var suback = await mqttClient.SubscribeAsync("contosotopics/topic1");
suback.Items.ToList().ForEach(s => Console.WriteLine($"subscribed to '{s.TopicFilter.Topic}' with '{s.ResultCode}'"));
while (true)
{
var puback = await mqttClient.PublishStringAsync("contosotopics/topic1", "hello world!");
Console.WriteLine(puback.ReasonString);
await Task.Delay(1000);
}
여러 클라이언트가 클라이언트 간에 게시 및 구독할 수 있도록 동일한 코드를 복제하고 수정할 수 있습니다.