简体   繁体   中英

Create Azure Storage Queue using ARM template

Is there a way to create Azure Storage Queues through ARM templates? I can find a way to create containers, but cannot find anything related to creation of Storage Queue through ARM.

Seems that support for it is available, but maybe not officially as of 29.07.2020. The documentation is available at: https://learn.microsoft.com/en-us/azure/templates/microsoft.storage/storageaccounts/queueservices/queues

Here is what worked for me:

"variables": {
    "storageAccountName": "[toLower(concat('sa', 'demo', parameters('environmentName')))]"
},
"resources": [
    {
        "type": "Microsoft.Storage/storageAccounts",
        "name": "[variables('storageAccountName')]",
        "location": "[parameters('location')]",
        "apiVersion": "2019-06-01",
        "sku": {
            "name": "[parameters('storageAccountType')]"
        },
        "kind": "StorageV2",
        "properties": {}
    },
    {
        "name": "[concat(variables('storageAccountName'), '/default/myqueue01')]",
        "type": "Microsoft.Storage/storageAccounts/queueServices/queues",
        "apiVersion": "2019-06-01",
        "dependsOn": [
            "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
        ],
        "properties": {
            "metadata": {}

        }
    }
],

Let me know if it works for you.

ARM gradually adds support for creation of sub-resources of storage accounts:

ARM template describing a storage account with a queue:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "environment": {
      "type": "string",
      "allowedValues": [
        "dev",
        "test",
        "prod"
      ]
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    },
    "storageAccountSkuName": {
      "type": "string",
      "defaultValue": "Standard_LRS"
    },
    "storageAccountSkuTier": {
      "type": "string",
      "defaultValue": "Standard"
    }
  },
  "variables": {
    "uniquePart": "[take(uniqueString(resourceGroup().id), 4)]",
    "storageAccountName": "[concat('mystorageaccount', variables('uniquePart'), parameters('environment'))]",
    "queueName": "myqueue"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "apiVersion": "2019-06-01",
      "sku": {
        "name": "[parameters('storageAccountSkuName')]",
        "tier": "[parameters('storageAccountSkuTier')]"
      },
      "kind": "StorageV2",
      "properties": {},
      "resources": [
        {
          "name": "[concat('default/', variables('queueName'))]",
          "type": "queueServices/queues",
          "apiVersion": "2019-06-01",
          "dependsOn": [
            "[variables('storageAccountName')]"
          ],
          "properties": {
            "metadata": {}
          }
        }
      ]
    }
  ]
}

Before the support was added , the resources could be created via other means (best to worst):

  1. during deployment of ARM templates, using tricks to execute arbitrary code
  2. during deployment overall, using Azure CLI called by the deployment tool
  3. in application startup code, using the Azure SDK

The option number two for queues uses the az storage queue create command.

You can add in the Azure CLI task in Azure DevOps, hook up the subscription and the give it an inline script like so:

 call az storage queue create -n "awesome-queue-1" --connection-string "$(storageAccountConnectionString)"

If you're using a Windows build agent then you need to include the call to ensure that multiple lines are executed. If you're on a Linux agent then call can be omitted.

That connection string can be exported from your ARM template as an output parameter and then sucked into the DevOps variables using ARM Outputs .

-- Simon Timms: Creating Storage Queues in Azure DevOps @ Western Devs

No, you can't create Azure Storage Queues through ARM templates but I doubt it is necessary because when you use eg the .NET SDK to interact with the queue, you can call the CreateIfNotExists() method to create it. Example:

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a container.
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Create the queue if it doesn't already exist
queue.CreateIfNotExists();

Source.

No, there is no way of doing this at this time. Containers were only added recently.

You can always use Azure Function hack

param storageAccountName string 

param maxAgeInSeconds int 
resource storageAcc 'Microsoft.Storage/storageAccounts@2022-05-01'existing={
  name:storageAccountName
}


resource queueServices 'Microsoft.Storage/storageAccounts/queueServices@2022-05-01' = {
  name: 'default'
  parent:storageAcc
  properties: {

    cors: {
      corsRules: [
        {
          allowedHeaders: [
            'string'
          ]
          allowedMethods: [
            'string'
          ]
          allowedOrigins: [
            'string'
          ]
          exposedHeaders: [
            'string'
          ]
          maxAgeInSeconds: maxAgeInSeconds
        }
      ]
    }
    
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM