Skip to main content
Version: v0.4.0

Securely Receive CloudEvents

The Arcus.BackgroundJobs.CloudEvents library provides a collection of background jobs to securely receive CloudEvents.

This allows workloads to asynchronously process event from other components without exposing a public endpoint.

How does it work?

An Azure Service Bus Topic resource is required to receive CloudEvents on. CloudEvent messages on this Topic will be processed by a background job.

Automatically Invalidate Azure Key Vault Secrets

Usage

The CloudEvents background job uses the Arcus Messaging functionality to receive messages. Make sure you take a look at the documentation on message handlers to fully grasp the possibilities.

The CloudEvent background job itself can be easily registered:

using Microsoft.Extensions.DependencyInjection;

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Add CloudEvents background job with an namespace-scoped connection string.
services.AddCloudEventBackgroundJob(
topicName: "<your-topic>",
subscriptionNamePrefix: "Sub-",
serviceBusNamespaceConnectionStringSecretKey: "<secret-key-name-for-servicebus-namespace-connection-string>");

// Add CloudEvent background job with an entity-scoped connection string.
services.AddCloudEventBackgroundJob(
subscriptionNamePrefix: "Sub-",
serviceBusTopicConnectionStringSecretKey: "<secret-key-name-for-servicebus-topic-connection-string>");

// Add CloudEvent background job via Managed Identity
services.AddCloudEventBackgroundJobUsingManagedIdentity(
topicName: "<your-topic>",
subscriptionNamePrefix: "Sub-",
serviceBusNamespace: "<your-namespace>.servicebus.windows.net",
// The optional client id to authenticate for a user assigned managed identity. More information on user assigned managed identities cam be found here:
// https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview#how-a-user-assigned-managed-identity-works-with-an-azure-vm
clientId: "<your-client-id>"
);
}
}

To handle the incoming CloudEvents messages, you can register an custom IAzureServiceBusMessageHandler<CloudEvent> message handler instance:

using CloudNative.CloudEvents;
using Microsoft.Extensions.DependencyInjection;

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddCloudEventEventBackgroundJob(...)
.WithServiceBusMessageHandler<MyCloudEventMessageHandler, CloudEvent>();
}
}

Such a custom implementation could look like this:

using Arcus.Messaging.Abstractions;
using Arcus.Messaging.Abstractions.ServiceBus;
using Arcus.Messaging.Abstractions.ServiceBus.MessageHandling;
using CloudNative.CloudEvents;
using Microsoft.Extensions.Logging;

public class MyCloudEventMessageHandler : IAzureServiceBusMessageHandler<CloudEvent>
{
private readonly ILogger _logger;

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

public async Task ProcessMessageAsync(
CloudEvent message,
AzureServiceBusMessageContext messageContext,
MessageCorrelationInfo correlationInfo,
CancellationToken cancellationToken)
{
_logger.LogInformation("Processing CloudEvent message");
}
}

← back