0

I have written an ARM template to create an event subscription on an existing storage account, where I need to listen to a particular blob container's blob.created and blob.deleted events, and send them to an Azure eventgrid trigger function app.

The functionapp is already deployed in Azure https://myfunctionapp.azurewebsites.net, and I am having a hard time trying to create the event subscription through the ARM template. Please note that I have used API version 2020-01-01-preview in order to have AzureFunction as the endpoint. The template is as follows:

{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "appName": {
        "type": "string",
        "metadata": {
            "description": "Name of the function app"
        }
    },
    "functionName": {
        "type": "string",
        "defaultValue": "MyFunction",
        "metadata": {
            "description": "Name of the function"
        }
    },
    "eventSubName": {
        "type": "string",
        "defaultValue": "myfunctionappsub",
        "metadata": {
            "description": "The name of the event subscription to create."
        }
    },
    "storageName": {
        "type": "string",
        "metadata": {
            "description": "Storage account name"
        }
    },
    "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
            "description": "Storage account location"
        }
    },
    "containerNamefilter": {
        "type": "string",
        "defaultValue": "-inputblob",
        "metadata": {
            "description": "Container name filter"
        }
    }
},
"variables": {
    "functionAppName": "[resourceId('Microsoft.Web/sites/functions/', parameters('appName'), parameters('functionName'))]"
},
"resources": [
    {
        "type": "Microsoft.Storage/storageAccounts/providers/eventSubscriptions",
        "name": "[concat(parameters('storageName'), '/Microsoft.EventGrid/', parameters('eventSubName'))]",
        "apiVersion": "2020-01-01-preview",
        "dependsOn": [
            "[parameters('storageName')]"
        ],
        "properties": {
            "destination": {
                "endpointType": "AzureFunction",
                "properties": {
                    "resourceId": "[variables('functionAppName')]"
                }
            },
            "filter": {
                "subjectBeginsWith": "",
                "subjectEndsWith": "",
                "isSubjectCaseSensitive": false,
                "includedEventTypes": [
                    "Microsoft.Storage.BlobCreated",
                    "Microsoft.Storage.BlobDeleted"
                ],
                "advancedFilters": [
                    {
                        "key": "subject",
                        "operatorType": "StringContains",
                        "value": "[parameters('containerfilter')]"
                    }
                ]
            }
        }
    }
]
}

This is the error I get when I try to run it on the pipeline:

2020-04-15T11:09:11.5347864Z Starting template validation.
2020-04-15T11:09:11.5368215Z Deployment name is azuredeploy-xxxxxxx-xxxxxx-xxxx
2020-04-15T11:09:13.1700166Z Template deployment validation was completed successfully.
2020-04-15T11:09:13.1700897Z Starting Deployment.
2020-04-15T11:09:13.1703528Z Deployment name is azuredeploy-xxxxxxx-xxxxxx-xxxx
2020-04-15T11:10:02.5842880Z There were errors in your deployment. Error code: DeploymentFailed.
2020-04-15T11:10:02.5893091Z ##[error]At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.
2020-04-15T11:10:02.5910677Z ##[error]Details:
2020-04-15T11:10:02.5915877Z ##[error]Conflict: {
  "status": "Failed",
  "error": {
    "code": "ResourceDeploymentFailure",
    "message": "The resource operation completed with terminal provisioning state 'Failed'.",
    "details": [
      {
        "code": "Internal error",
        "message": "The operation failed due to an internal server error. The initial state of the impacted resources (if any) are restored. Please try again in few minutes. If error still persists, report 72c636d4-6d09-4c50-8886-7153ddf2a4ee:4/15/2020 11:09:50 AM (UTC) to our forums for assistance or raise a support ticket ."
      }
    ]
  }
}
2020-04-15T11:10:02.5918976Z ##[error]Task failed while creating or updating the template deployment.
2020-04-15T11:10:02.5953000Z ##[section]Finishing: Create or update eventsubscription in RG

Am I doing anything wrong here? I'm very new to ARM templates.

halfer
  • 19,824
  • 17
  • 99
  • 186
noobmaster007
  • 153
  • 2
  • 11
  • 1
    Please check this question, this one is similar to yours https://stackoverflow.com/questions/60207556/event-subscription-by-arm-template-for-topic-with-endpointtype-as-azurefunction – Jagrati Modi Apr 16 '20 at 05:25

1 Answers1

1

If you want to create event grid subscription for the existing storage account, please refer to the following template

{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {

    "functionGroup": {
        "type": "string",
        "defaultValue" : "jimtest",
        "metadata": {
            "description": "he group name of  function app"
        }
    },
    "appName": {
        "type": "string",
        "defaultValue" : "testfunjs",
        "metadata": {
            "description": "Name of the function app"
        }
    },
    "functionName": {
        "type": "string",
        "defaultValue": "EventGridTrigger1",
        "metadata": {
            "description": "Name of the function"
        }
    },
    "eventSubName": {
        "type": "string",
        "defaultValue": "myfunctionappsub",
        "metadata": {
            "description": "The name of the event subscription to create."
        }
    },
    "storageName": {
        "type": "string",
        "defaultValue" : "andyprivate",
        "metadata": {
            "description": "Storage account name"
        }
    },
    "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
            "description": "Storage account location"
        }
    },
    "containerNamefilter": {
        "type": "string",
        "defaultValue": "test",
        "metadata": {
            "description": "Container name filter"
        }
    }
},
"variables": {
    "functionId" :"[resourceId(parameters('functionGroup'),'Microsoft.Web/sites/functions/', parameters('appName'), parameters('functionName'))]",  
},
"resources": [
{
        "type": "Microsoft.Storage/storageAccounts/providers/eventSubscriptions",
        "name": "[concat(parameters('storageName'), '/Microsoft.EventGrid/', parameters('eventSubName'))]",
        "apiVersion": "2020-01-01-preview",
        "properties": {
            "destination": {
                "endpointType": "AzureFunction",
                "properties": {
                    "resourceId": "[variables('functionId')]"
                }
            },
            "filter": {
                "subjectBeginsWith": "",
                "subjectEndsWith": "",
                "isSubjectCaseSensitive": false,
                "includedEventTypes": [
                    "Microsoft.Storage.BlobCreated",
                    "Microsoft.Storage.BlobDeleted"
                ],
                "advancedFilters": [
                    {
                        "key": "subject",
                        "operatorType": "StringContains",
                        "value": "[parameters('containerNamefilter')]"
                    }
                ]
            }
        }
    }

]
}

enter image description here enter image description here

Jim Xu
  • 21,610
  • 2
  • 19
  • 39
  • Thank you so much @JimXu , it worked! But I noticed that the filter I'm adding is not getting set. It shows the key and the operator, but the value is not being set. Is there anything else that I should add to the template to get the filters? – noobmaster007 Apr 16 '20 at 11:48
  • Got it fixed by adding a `values` array instead of a single `value`. Thank you! Adding the azure documentation reference here for anyone who needs it. [link](https://learn.microsoft.com/en-us/azure/templates/microsoft.eventgrid/2020-01-01-preview/eventsubscriptions) – noobmaster007 Apr 17 '20 at 09:48