1
votes

I have an Azure Function that fires anytime a message is placed on an IoT hub. I want the function to extract some information from the message and then place it on another event hub. Here is my code:

#r "Microsoft.ServiceBus"
using System;
using System.Text;
using Microsoft.ServiceBus.Messaging;

public static void Run(EventData eventData, out string outputEventHubMessage, TraceWriter log)
{
    // Get some system properties from the SystemProperties dictionary
    var deviceId = eventData.SystemProperties["iothub-connection-device-id"].ToString();
    var messageSource = eventData.SystemProperties["iothub-message-source"].ToString();
    var enqueuedTime = eventData.SystemProperties["iothub-enqueuedtime"].ToString();
    var sequenceNumber = eventData.SystemProperties["SequenceNumber"].ToString();
    var offset = eventData.SystemProperties["Offset"].ToString();

    var data = Encoding.UTF8.GetString(eventData.GetBytes());
    var message = string.Format("Message Source: {0}; Enqueued Time: {1}; Sequence Number: {2}; Offset: {3}; DeviceId: {4}; Data: {5}", messageSource, enqueuedTime, sequenceNumber, offset, deviceId, data);

    outputEventHubMessage = message;

    log.Info($"{message}");
}

The 'outputEventHubMessage' is defined as an output parameter pointing to an event hub I have setup for this purpose. I am getting the following error when the function fires:

2018-04-11T14:23:50.295 [Error] Exception while executing function: Functions.MonitorHub. Microsoft.Azure.WebJobs.Host: Error while handling parameter outputEventHubMessage after function returned:. 
    Microsoft.ServiceBus: Unauthorized access. 'Send' claim(s) are required to perform this operation. Resource: 'sb://iothub-ns-monitorhub-419050-c0a1f3eb71.servicebus.windows.net/monitorhub'. TrackingId:cd503b7c674e4806a64b592bfa3d51f2_G9, SystemTracker:gateway5, Timestamp:4/11/2018 2:23:50 PM.

I don't have any clue what this means or why Azure wouldn't have set this up for me when I created the output parameter

1
Looks like your connection string doesn't have Send permission?Mikhail Shilkov
@Mikhail - Maybe you could turn this into an answer and show how this is done? It would help anyone new at this (like me).Randy Minder
Where do you actually send the message to the event hub?There has to be a connection string containing an access key name somewhere and it seems the corresponding access policy does not have Send permissions (as @Mikhail pointed out).Onkel Toob

1 Answers

3
votes

It looks like the connection string that you are using does not have Send permission.

To check that, go to your Event Hubs namespace -> Settings -> Shared access policies and make sure that Send is listed against the policy that you use:

enter image description here