The azure-native:eventgrid:EventSubscription resource, part of the Pulumi Azure Native provider, defines an Event Grid event subscription that routes events from a source to a destination endpoint. This guide focuses on three capabilities: destination configuration, subject-based filtering, and dead letter handling.
Event subscriptions connect Event Grid topics or event sources to destination resources. The examples are intentionally small. Combine them with your own Event Grid topics, destination endpoints, and filtering logic.
Route events to Event Hub with subject filtering
Event-driven architectures often route events from Event Grid topics to Event Hubs, where downstream consumers process them at scale.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const eventSubscription = new azure_native.eventgrid.EventSubscription("eventSubscription", {
destination: {
endpointType: "EventHub",
resourceId: "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.EventHub/namespaces/ContosoNamespace/eventhubs/EH1",
},
eventSubscriptionName: "examplesubscription1",
filter: {
isSubjectCaseSensitive: false,
subjectBeginsWith: "ExamplePrefix",
subjectEndsWith: "ExampleSuffix",
},
scope: "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
import pulumi
import pulumi_azure_native as azure_native
event_subscription = azure_native.eventgrid.EventSubscription("eventSubscription",
destination={
"endpoint_type": "EventHub",
"resource_id": "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.EventHub/namespaces/ContosoNamespace/eventhubs/EH1",
},
event_subscription_name="examplesubscription1",
filter={
"is_subject_case_sensitive": False,
"subject_begins_with": "ExamplePrefix",
"subject_ends_with": "ExampleSuffix",
},
scope="subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
package main
import (
eventgrid "github.com/pulumi/pulumi-azure-native-sdk/eventgrid/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := eventgrid.NewEventSubscription(ctx, "eventSubscription", &eventgrid.EventSubscriptionArgs{
Destination: &eventgrid.EventHubEventSubscriptionDestinationArgs{
EndpointType: pulumi.String("EventHub"),
ResourceId: pulumi.String("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.EventHub/namespaces/ContosoNamespace/eventhubs/EH1"),
},
EventSubscriptionName: pulumi.String("examplesubscription1"),
Filter: &eventgrid.EventSubscriptionFilterArgs{
IsSubjectCaseSensitive: pulumi.Bool(false),
SubjectBeginsWith: pulumi.String("ExamplePrefix"),
SubjectEndsWith: pulumi.String("ExampleSuffix"),
},
Scope: pulumi.String("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var eventSubscription = new AzureNative.EventGrid.EventSubscription("eventSubscription", new()
{
Destination = new AzureNative.EventGrid.Inputs.EventHubEventSubscriptionDestinationArgs
{
EndpointType = "EventHub",
ResourceId = "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.EventHub/namespaces/ContosoNamespace/eventhubs/EH1",
},
EventSubscriptionName = "examplesubscription1",
Filter = new AzureNative.EventGrid.Inputs.EventSubscriptionFilterArgs
{
IsSubjectCaseSensitive = false,
SubjectBeginsWith = "ExamplePrefix",
SubjectEndsWith = "ExampleSuffix",
},
Scope = "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.eventgrid.EventSubscription;
import com.pulumi.azurenative.eventgrid.EventSubscriptionArgs;
import com.pulumi.azurenative.eventgrid.inputs.EventSubscriptionFilterArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var eventSubscription = new EventSubscription("eventSubscription", EventSubscriptionArgs.builder()
.destination(EventHubEventSubscriptionDestinationArgs.builder()
.endpointType("EventHub")
.resourceId("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.EventHub/namespaces/ContosoNamespace/eventhubs/EH1")
.build())
.eventSubscriptionName("examplesubscription1")
.filter(EventSubscriptionFilterArgs.builder()
.isSubjectCaseSensitive(false)
.subjectBeginsWith("ExamplePrefix")
.subjectEndsWith("ExampleSuffix")
.build())
.scope("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
.build());
}
}
resources:
eventSubscription:
type: azure-native:eventgrid:EventSubscription
properties:
destination:
endpointType: EventHub
resourceId: /subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.EventHub/namespaces/ContosoNamespace/eventhubs/EH1
eventSubscriptionName: examplesubscription1
filter:
isSubjectCaseSensitive: false
subjectBeginsWith: ExamplePrefix
subjectEndsWith: ExampleSuffix
scope: subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1
When events arrive at the topic, Event Grid evaluates the filter. The subjectBeginsWith and subjectEndsWith properties match against the event’s subject field. Only matching events flow to the Event Hub specified in destination.resourceId. The scope property identifies the Event Grid topic that generates events.
Invoke Azure Functions with dead letter handling
Serverless workflows trigger Azure Functions in response to events. When delivery fails repeatedly, dead letter destinations capture undeliverable events.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const eventSubscription = new azure_native.eventgrid.EventSubscription("eventSubscription", {
deadLetterDestination: {
blobContainerName: "contosocontainer",
endpointType: "StorageBlob",
resourceId: "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
destination: {
endpointType: "AzureFunction",
resourceId: "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Web/sites/ContosoSite/funtions/ContosoFunc",
},
eventSubscriptionName: "examplesubscription1",
filter: {
isSubjectCaseSensitive: false,
subjectBeginsWith: "ExamplePrefix",
subjectEndsWith: "ExampleSuffix",
},
scope: "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
import pulumi
import pulumi_azure_native as azure_native
event_subscription = azure_native.eventgrid.EventSubscription("eventSubscription",
dead_letter_destination={
"blob_container_name": "contosocontainer",
"endpoint_type": "StorageBlob",
"resource_id": "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
destination={
"endpoint_type": "AzureFunction",
"resource_id": "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Web/sites/ContosoSite/funtions/ContosoFunc",
},
event_subscription_name="examplesubscription1",
filter={
"is_subject_case_sensitive": False,
"subject_begins_with": "ExamplePrefix",
"subject_ends_with": "ExampleSuffix",
},
scope="subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
package main
import (
eventgrid "github.com/pulumi/pulumi-azure-native-sdk/eventgrid/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := eventgrid.NewEventSubscription(ctx, "eventSubscription", &eventgrid.EventSubscriptionArgs{
DeadLetterDestination: &eventgrid.StorageBlobDeadLetterDestinationArgs{
BlobContainerName: pulumi.String("contosocontainer"),
EndpointType: pulumi.String("StorageBlob"),
ResourceId: pulumi.String("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg"),
},
Destination: &eventgrid.AzureFunctionEventSubscriptionDestinationArgs{
EndpointType: pulumi.String("AzureFunction"),
ResourceId: pulumi.String("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Web/sites/ContosoSite/funtions/ContosoFunc"),
},
EventSubscriptionName: pulumi.String("examplesubscription1"),
Filter: &eventgrid.EventSubscriptionFilterArgs{
IsSubjectCaseSensitive: pulumi.Bool(false),
SubjectBeginsWith: pulumi.String("ExamplePrefix"),
SubjectEndsWith: pulumi.String("ExampleSuffix"),
},
Scope: pulumi.String("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var eventSubscription = new AzureNative.EventGrid.EventSubscription("eventSubscription", new()
{
DeadLetterDestination = new AzureNative.EventGrid.Inputs.StorageBlobDeadLetterDestinationArgs
{
BlobContainerName = "contosocontainer",
EndpointType = "StorageBlob",
ResourceId = "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
Destination = new AzureNative.EventGrid.Inputs.AzureFunctionEventSubscriptionDestinationArgs
{
EndpointType = "AzureFunction",
ResourceId = "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Web/sites/ContosoSite/funtions/ContosoFunc",
},
EventSubscriptionName = "examplesubscription1",
Filter = new AzureNative.EventGrid.Inputs.EventSubscriptionFilterArgs
{
IsSubjectCaseSensitive = false,
SubjectBeginsWith = "ExamplePrefix",
SubjectEndsWith = "ExampleSuffix",
},
Scope = "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.eventgrid.EventSubscription;
import com.pulumi.azurenative.eventgrid.EventSubscriptionArgs;
import com.pulumi.azurenative.eventgrid.inputs.StorageBlobDeadLetterDestinationArgs;
import com.pulumi.azurenative.eventgrid.inputs.EventSubscriptionFilterArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var eventSubscription = new EventSubscription("eventSubscription", EventSubscriptionArgs.builder()
.deadLetterDestination(StorageBlobDeadLetterDestinationArgs.builder()
.blobContainerName("contosocontainer")
.endpointType("StorageBlob")
.resourceId("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg")
.build())
.destination(AzureFunctionEventSubscriptionDestinationArgs.builder()
.endpointType("AzureFunction")
.resourceId("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Web/sites/ContosoSite/funtions/ContosoFunc")
.build())
.eventSubscriptionName("examplesubscription1")
.filter(EventSubscriptionFilterArgs.builder()
.isSubjectCaseSensitive(false)
.subjectBeginsWith("ExamplePrefix")
.subjectEndsWith("ExampleSuffix")
.build())
.scope("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
.build());
}
}
resources:
eventSubscription:
type: azure-native:eventgrid:EventSubscription
properties:
deadLetterDestination:
blobContainerName: contosocontainer
endpointType: StorageBlob
resourceId: /subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg
destination:
endpointType: AzureFunction
resourceId: /subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Web/sites/ContosoSite/funtions/ContosoFunc
eventSubscriptionName: examplesubscription1
filter:
isSubjectCaseSensitive: false
subjectBeginsWith: ExamplePrefix
subjectEndsWith: ExampleSuffix
scope: subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1
Event Grid attempts to deliver events to the Azure Function specified in destination.resourceId. If delivery fails after all retries, the event moves to the Storage Blob container specified in deadLetterDestination. The blobContainerName and resourceId properties identify where failed events are stored for later analysis.
Deliver to Service Bus Queue with dead letter backup
Service Bus queues provide reliable message delivery with built-in retry and dead letter handling.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const eventSubscription = new azure_native.eventgrid.EventSubscription("eventSubscription", {
deadLetterDestination: {
blobContainerName: "contosocontainer",
endpointType: "StorageBlob",
resourceId: "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
destination: {
endpointType: "ServiceBusQueue",
resourceId: "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.ServiceBus/namespaces/ContosoNamespace/queues/SBQ",
},
eventSubscriptionName: "examplesubscription1",
filter: {
isSubjectCaseSensitive: false,
subjectBeginsWith: "ExamplePrefix",
subjectEndsWith: "ExampleSuffix",
},
scope: "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
import pulumi
import pulumi_azure_native as azure_native
event_subscription = azure_native.eventgrid.EventSubscription("eventSubscription",
dead_letter_destination={
"blob_container_name": "contosocontainer",
"endpoint_type": "StorageBlob",
"resource_id": "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
destination={
"endpoint_type": "ServiceBusQueue",
"resource_id": "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.ServiceBus/namespaces/ContosoNamespace/queues/SBQ",
},
event_subscription_name="examplesubscription1",
filter={
"is_subject_case_sensitive": False,
"subject_begins_with": "ExamplePrefix",
"subject_ends_with": "ExampleSuffix",
},
scope="subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
package main
import (
eventgrid "github.com/pulumi/pulumi-azure-native-sdk/eventgrid/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := eventgrid.NewEventSubscription(ctx, "eventSubscription", &eventgrid.EventSubscriptionArgs{
DeadLetterDestination: &eventgrid.StorageBlobDeadLetterDestinationArgs{
BlobContainerName: pulumi.String("contosocontainer"),
EndpointType: pulumi.String("StorageBlob"),
ResourceId: pulumi.String("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg"),
},
Destination: &eventgrid.ServiceBusQueueEventSubscriptionDestinationArgs{
EndpointType: pulumi.String("ServiceBusQueue"),
ResourceId: pulumi.String("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.ServiceBus/namespaces/ContosoNamespace/queues/SBQ"),
},
EventSubscriptionName: pulumi.String("examplesubscription1"),
Filter: &eventgrid.EventSubscriptionFilterArgs{
IsSubjectCaseSensitive: pulumi.Bool(false),
SubjectBeginsWith: pulumi.String("ExamplePrefix"),
SubjectEndsWith: pulumi.String("ExampleSuffix"),
},
Scope: pulumi.String("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var eventSubscription = new AzureNative.EventGrid.EventSubscription("eventSubscription", new()
{
DeadLetterDestination = new AzureNative.EventGrid.Inputs.StorageBlobDeadLetterDestinationArgs
{
BlobContainerName = "contosocontainer",
EndpointType = "StorageBlob",
ResourceId = "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
Destination = new AzureNative.EventGrid.Inputs.ServiceBusQueueEventSubscriptionDestinationArgs
{
EndpointType = "ServiceBusQueue",
ResourceId = "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.ServiceBus/namespaces/ContosoNamespace/queues/SBQ",
},
EventSubscriptionName = "examplesubscription1",
Filter = new AzureNative.EventGrid.Inputs.EventSubscriptionFilterArgs
{
IsSubjectCaseSensitive = false,
SubjectBeginsWith = "ExamplePrefix",
SubjectEndsWith = "ExampleSuffix",
},
Scope = "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.eventgrid.EventSubscription;
import com.pulumi.azurenative.eventgrid.EventSubscriptionArgs;
import com.pulumi.azurenative.eventgrid.inputs.StorageBlobDeadLetterDestinationArgs;
import com.pulumi.azurenative.eventgrid.inputs.EventSubscriptionFilterArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var eventSubscription = new EventSubscription("eventSubscription", EventSubscriptionArgs.builder()
.deadLetterDestination(StorageBlobDeadLetterDestinationArgs.builder()
.blobContainerName("contosocontainer")
.endpointType("StorageBlob")
.resourceId("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg")
.build())
.destination(ServiceBusQueueEventSubscriptionDestinationArgs.builder()
.endpointType("ServiceBusQueue")
.resourceId("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.ServiceBus/namespaces/ContosoNamespace/queues/SBQ")
.build())
.eventSubscriptionName("examplesubscription1")
.filter(EventSubscriptionFilterArgs.builder()
.isSubjectCaseSensitive(false)
.subjectBeginsWith("ExamplePrefix")
.subjectEndsWith("ExampleSuffix")
.build())
.scope("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
.build());
}
}
resources:
eventSubscription:
type: azure-native:eventgrid:EventSubscription
properties:
deadLetterDestination:
blobContainerName: contosocontainer
endpointType: StorageBlob
resourceId: /subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg
destination:
endpointType: ServiceBusQueue
resourceId: /subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.ServiceBus/namespaces/ContosoNamespace/queues/SBQ
eventSubscriptionName: examplesubscription1
filter:
isSubjectCaseSensitive: false
subjectBeginsWith: ExamplePrefix
subjectEndsWith: ExampleSuffix
scope: subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1
Events flow to the Service Bus Queue specified in destination.resourceId. The deadLetterDestination configuration ensures that events which cannot be delivered after all retries are written to the specified Storage Blob container. This pattern separates event delivery from failure handling.
Queue events in Azure Storage with dead letter handling
Storage Queues offer simple, cost-effective message queuing for event-driven workloads.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const eventSubscription = new azure_native.eventgrid.EventSubscription("eventSubscription", {
deadLetterDestination: {
blobContainerName: "contosocontainer",
endpointType: "StorageBlob",
resourceId: "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
destination: {
endpointType: "StorageQueue",
queueName: "queue1",
resourceId: "/subscriptions/d33c5f7a-02ea-40f4-bf52-07f17e84d6a8/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
eventSubscriptionName: "examplesubscription1",
filter: {
isSubjectCaseSensitive: false,
subjectBeginsWith: "ExamplePrefix",
subjectEndsWith: "ExampleSuffix",
},
scope: "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
import pulumi
import pulumi_azure_native as azure_native
event_subscription = azure_native.eventgrid.EventSubscription("eventSubscription",
dead_letter_destination={
"blob_container_name": "contosocontainer",
"endpoint_type": "StorageBlob",
"resource_id": "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
destination={
"endpoint_type": "StorageQueue",
"queue_name": "queue1",
"resource_id": "/subscriptions/d33c5f7a-02ea-40f4-bf52-07f17e84d6a8/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
event_subscription_name="examplesubscription1",
filter={
"is_subject_case_sensitive": False,
"subject_begins_with": "ExamplePrefix",
"subject_ends_with": "ExampleSuffix",
},
scope="subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
package main
import (
eventgrid "github.com/pulumi/pulumi-azure-native-sdk/eventgrid/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := eventgrid.NewEventSubscription(ctx, "eventSubscription", &eventgrid.EventSubscriptionArgs{
DeadLetterDestination: &eventgrid.StorageBlobDeadLetterDestinationArgs{
BlobContainerName: pulumi.String("contosocontainer"),
EndpointType: pulumi.String("StorageBlob"),
ResourceId: pulumi.String("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg"),
},
Destination: &eventgrid.StorageQueueEventSubscriptionDestinationArgs{
EndpointType: pulumi.String("StorageQueue"),
QueueName: pulumi.String("queue1"),
ResourceId: pulumi.String("/subscriptions/d33c5f7a-02ea-40f4-bf52-07f17e84d6a8/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg"),
},
EventSubscriptionName: pulumi.String("examplesubscription1"),
Filter: &eventgrid.EventSubscriptionFilterArgs{
IsSubjectCaseSensitive: pulumi.Bool(false),
SubjectBeginsWith: pulumi.String("ExamplePrefix"),
SubjectEndsWith: pulumi.String("ExampleSuffix"),
},
Scope: pulumi.String("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var eventSubscription = new AzureNative.EventGrid.EventSubscription("eventSubscription", new()
{
DeadLetterDestination = new AzureNative.EventGrid.Inputs.StorageBlobDeadLetterDestinationArgs
{
BlobContainerName = "contosocontainer",
EndpointType = "StorageBlob",
ResourceId = "/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
Destination = new AzureNative.EventGrid.Inputs.StorageQueueEventSubscriptionDestinationArgs
{
EndpointType = "StorageQueue",
QueueName = "queue1",
ResourceId = "/subscriptions/d33c5f7a-02ea-40f4-bf52-07f17e84d6a8/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg",
},
EventSubscriptionName = "examplesubscription1",
Filter = new AzureNative.EventGrid.Inputs.EventSubscriptionFilterArgs
{
IsSubjectCaseSensitive = false,
SubjectBeginsWith = "ExamplePrefix",
SubjectEndsWith = "ExampleSuffix",
},
Scope = "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.eventgrid.EventSubscription;
import com.pulumi.azurenative.eventgrid.EventSubscriptionArgs;
import com.pulumi.azurenative.eventgrid.inputs.StorageBlobDeadLetterDestinationArgs;
import com.pulumi.azurenative.eventgrid.inputs.EventSubscriptionFilterArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var eventSubscription = new EventSubscription("eventSubscription", EventSubscriptionArgs.builder()
.deadLetterDestination(StorageBlobDeadLetterDestinationArgs.builder()
.blobContainerName("contosocontainer")
.endpointType("StorageBlob")
.resourceId("/subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg")
.build())
.destination(StorageQueueEventSubscriptionDestinationArgs.builder()
.endpointType("StorageQueue")
.queueName("queue1")
.resourceId("/subscriptions/d33c5f7a-02ea-40f4-bf52-07f17e84d6a8/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg")
.build())
.eventSubscriptionName("examplesubscription1")
.filter(EventSubscriptionFilterArgs.builder()
.isSubjectCaseSensitive(false)
.subjectBeginsWith("ExamplePrefix")
.subjectEndsWith("ExampleSuffix")
.build())
.scope("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
.build());
}
}
resources:
eventSubscription:
type: azure-native:eventgrid:EventSubscription
properties:
deadLetterDestination:
blobContainerName: contosocontainer
endpointType: StorageBlob
resourceId: /subscriptions/55f3dcd4-cac7-43b4-990b-a139d62a1eb2/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg
destination:
endpointType: StorageQueue
queueName: queue1
resourceId: /subscriptions/d33c5f7a-02ea-40f4-bf52-07f17e84d6a8/resourceGroups/TestRG/providers/Microsoft.Storage/storageAccounts/contosostg
eventSubscriptionName: examplesubscription1
filter:
isSubjectCaseSensitive: false
subjectBeginsWith: ExamplePrefix
subjectEndsWith: ExampleSuffix
scope: subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1
The destination.queueName property specifies which queue receives events within the Storage Account identified by destination.resourceId. The deadLetterDestination captures failed deliveries in a separate Storage Blob container. This configuration provides basic queuing with failure tracking.
Push events to webhook endpoints
Webhooks provide an HTTP-based integration point for external systems. Event Grid validates webhook endpoints during subscription creation.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const eventSubscription = new azure_native.eventgrid.EventSubscription("eventSubscription", {
destination: {
endpointType: "WebHook",
endpointUrl: "https://azurefunctionexample.azurewebsites.net/runtime/webhooks/EventGrid?functionName=EventGridTrigger1&code=PASSWORDCODE",
},
eventSubscriptionName: "examplesubscription1",
filter: {
isSubjectCaseSensitive: false,
subjectBeginsWith: "ExamplePrefix",
subjectEndsWith: "ExampleSuffix",
},
scope: "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
import pulumi
import pulumi_azure_native as azure_native
event_subscription = azure_native.eventgrid.EventSubscription("eventSubscription",
destination={
"endpoint_type": "WebHook",
"endpoint_url": "https://azurefunctionexample.azurewebsites.net/runtime/webhooks/EventGrid?functionName=EventGridTrigger1&code=PASSWORDCODE",
},
event_subscription_name="examplesubscription1",
filter={
"is_subject_case_sensitive": False,
"subject_begins_with": "ExamplePrefix",
"subject_ends_with": "ExampleSuffix",
},
scope="subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
package main
import (
eventgrid "github.com/pulumi/pulumi-azure-native-sdk/eventgrid/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := eventgrid.NewEventSubscription(ctx, "eventSubscription", &eventgrid.EventSubscriptionArgs{
Destination: &eventgrid.WebHookEventSubscriptionDestinationArgs{
EndpointType: pulumi.String("WebHook"),
EndpointUrl: pulumi.String("https://azurefunctionexample.azurewebsites.net/runtime/webhooks/EventGrid?functionName=EventGridTrigger1&code=PASSWORDCODE"),
},
EventSubscriptionName: pulumi.String("examplesubscription1"),
Filter: &eventgrid.EventSubscriptionFilterArgs{
IsSubjectCaseSensitive: pulumi.Bool(false),
SubjectBeginsWith: pulumi.String("ExamplePrefix"),
SubjectEndsWith: pulumi.String("ExampleSuffix"),
},
Scope: pulumi.String("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var eventSubscription = new AzureNative.EventGrid.EventSubscription("eventSubscription", new()
{
Destination = new AzureNative.EventGrid.Inputs.WebHookEventSubscriptionDestinationArgs
{
EndpointType = "WebHook",
EndpointUrl = "https://azurefunctionexample.azurewebsites.net/runtime/webhooks/EventGrid?functionName=EventGridTrigger1&code=PASSWORDCODE",
},
EventSubscriptionName = "examplesubscription1",
Filter = new AzureNative.EventGrid.Inputs.EventSubscriptionFilterArgs
{
IsSubjectCaseSensitive = false,
SubjectBeginsWith = "ExamplePrefix",
SubjectEndsWith = "ExampleSuffix",
},
Scope = "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.eventgrid.EventSubscription;
import com.pulumi.azurenative.eventgrid.EventSubscriptionArgs;
import com.pulumi.azurenative.eventgrid.inputs.EventSubscriptionFilterArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var eventSubscription = new EventSubscription("eventSubscription", EventSubscriptionArgs.builder()
.destination(WebHookEventSubscriptionDestinationArgs.builder()
.endpointType("WebHook")
.endpointUrl("https://azurefunctionexample.azurewebsites.net/runtime/webhooks/EventGrid?functionName=EventGridTrigger1&code=PASSWORDCODE")
.build())
.eventSubscriptionName("examplesubscription1")
.filter(EventSubscriptionFilterArgs.builder()
.isSubjectCaseSensitive(false)
.subjectBeginsWith("ExamplePrefix")
.subjectEndsWith("ExampleSuffix")
.build())
.scope("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1")
.build());
}
}
resources:
eventSubscription:
type: azure-native:eventgrid:EventSubscription
properties:
destination:
endpointType: WebHook
endpointUrl: https://azurefunctionexample.azurewebsites.net/runtime/webhooks/EventGrid?functionName=EventGridTrigger1&code=PASSWORDCODE
eventSubscriptionName: examplesubscription1
filter:
isSubjectCaseSensitive: false
subjectBeginsWith: ExamplePrefix
subjectEndsWith: ExampleSuffix
scope: subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg/providers/Microsoft.EventGrid/topics/exampletopic1
Event Grid delivers events via HTTP POST to the URL specified in destination.endpointUrl. The endpoint must respond to validation requests during subscription creation. The filter properties control which events are delivered based on subject matching.
Subscribe to resource group events
Resource group subscriptions capture events from all resources within a group, enabling centralized monitoring.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const eventSubscription = new azure_native.eventgrid.EventSubscription("eventSubscription", {
destination: {
endpointType: "WebHook",
endpointUrl: "https://requestb.in/15ksip71",
},
eventSubscriptionName: "examplesubscription2",
filter: {
isSubjectCaseSensitive: false,
subjectBeginsWith: "ExamplePrefix",
subjectEndsWith: "ExampleSuffix",
},
scope: "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg",
});
import pulumi
import pulumi_azure_native as azure_native
event_subscription = azure_native.eventgrid.EventSubscription("eventSubscription",
destination={
"endpoint_type": "WebHook",
"endpoint_url": "https://requestb.in/15ksip71",
},
event_subscription_name="examplesubscription2",
filter={
"is_subject_case_sensitive": False,
"subject_begins_with": "ExamplePrefix",
"subject_ends_with": "ExampleSuffix",
},
scope="subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg")
package main
import (
eventgrid "github.com/pulumi/pulumi-azure-native-sdk/eventgrid/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := eventgrid.NewEventSubscription(ctx, "eventSubscription", &eventgrid.EventSubscriptionArgs{
Destination: &eventgrid.WebHookEventSubscriptionDestinationArgs{
EndpointType: pulumi.String("WebHook"),
EndpointUrl: pulumi.String("https://requestb.in/15ksip71"),
},
EventSubscriptionName: pulumi.String("examplesubscription2"),
Filter: &eventgrid.EventSubscriptionFilterArgs{
IsSubjectCaseSensitive: pulumi.Bool(false),
SubjectBeginsWith: pulumi.String("ExamplePrefix"),
SubjectEndsWith: pulumi.String("ExampleSuffix"),
},
Scope: pulumi.String("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var eventSubscription = new AzureNative.EventGrid.EventSubscription("eventSubscription", new()
{
Destination = new AzureNative.EventGrid.Inputs.WebHookEventSubscriptionDestinationArgs
{
EndpointType = "WebHook",
EndpointUrl = "https://requestb.in/15ksip71",
},
EventSubscriptionName = "examplesubscription2",
Filter = new AzureNative.EventGrid.Inputs.EventSubscriptionFilterArgs
{
IsSubjectCaseSensitive = false,
SubjectBeginsWith = "ExamplePrefix",
SubjectEndsWith = "ExampleSuffix",
},
Scope = "subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.eventgrid.EventSubscription;
import com.pulumi.azurenative.eventgrid.EventSubscriptionArgs;
import com.pulumi.azurenative.eventgrid.inputs.EventSubscriptionFilterArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var eventSubscription = new EventSubscription("eventSubscription", EventSubscriptionArgs.builder()
.destination(WebHookEventSubscriptionDestinationArgs.builder()
.endpointType("WebHook")
.endpointUrl("https://requestb.in/15ksip71")
.build())
.eventSubscriptionName("examplesubscription2")
.filter(EventSubscriptionFilterArgs.builder()
.isSubjectCaseSensitive(false)
.subjectBeginsWith("ExamplePrefix")
.subjectEndsWith("ExampleSuffix")
.build())
.scope("subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg")
.build());
}
}
resources:
eventSubscription:
type: azure-native:eventgrid:EventSubscription
properties:
destination:
endpointType: WebHook
endpointUrl: https://requestb.in/15ksip71
eventSubscriptionName: examplesubscription2
filter:
isSubjectCaseSensitive: false
subjectBeginsWith: ExamplePrefix
subjectEndsWith: ExampleSuffix
scope: subscriptions/5b4b650e-28b9-4790-b3ab-ddbd88d727c4/resourceGroups/examplerg
The scope property references a resource group rather than a specific topic. Event Grid delivers events from all resources in that group to the webhook destination. This pattern enables monitoring across multiple resource types without individual subscriptions.
Beyond these examples
These snippets focus on specific event subscription features: destination types, subject-based filtering, and dead letter handling with Storage Blob. They’re intentionally minimal rather than full event-driven architectures.
The examples reference pre-existing infrastructure such as Event Grid topics or event sources, destination resources like Event Hubs and Azure Functions, and Storage accounts for dead letter destinations. They focus on configuring the subscription rather than provisioning the surrounding infrastructure.
To keep things focused, common subscription patterns are omitted, including:
- Retry policies (maxDeliveryAttempts, eventTimeToLiveInMinutes)
- Managed identity authentication (deliveryWithResourceIdentity, deadLetterWithResourceIdentity)
- Event delivery schemas (CloudEventSchemaV1_0, CustomInputSchema)
- Advanced filters (numeric, boolean, string array operators)
- Expiration time configuration
- Labels for subscription organization
These omissions are intentional: the goal is to illustrate how each subscription feature is wired, not provide drop-in event routing modules. See the EventSubscription resource reference for all available configuration options.
Let's configure Azure Event Grid Subscriptions
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Configuration & Destinations
EventHub, AzureFunction, HybridConnection, ServiceBusQueue, ServiceBusTopic, StorageQueue, and WebHook. Each destination type requires an endpointType and resourceId (or endpointUrl for WebHook).scope can be a subscription (/subscriptions/{subscriptionId}/), resource group (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}), specific resource, or EventGrid topic. The scope determines which resource’s events the subscription receives.eventDeliverySchema is EventGridSchema. You can change this when creating the subscription to use a different schema format.Event Filtering
filter property with subjectBeginsWith and subjectEndsWith to match event subjects. Use isSubjectCaseSensitive (defaults to false) to control whether matching is case-sensitive.Error Handling & Reliability
deadLetterDestination uses Azure Event Grid’s identity to authenticate with the dead letter destination, while deadLetterWithResourceIdentity uses the managed identity configured on the parent resource (topic or domain). The same distinction applies to destination vs deliveryWithResourceIdentity.deadLetterDestination is optional. However, most examples include it to handle events that cannot be delivered. Without it, failed events may be lost after retry attempts are exhausted.retryPolicy property to configure the maximum number of delivery attempts and time to live for events. This controls how Event Grid handles delivery failures.Immutability & Limitations
scope and eventSubscriptionName are immutable. To change either value, you must delete and recreate the event subscription.API Versions
pulumi package add azure-native eventgrid [ApiVersion].