0

I am looking for solution where I can create multiple storage accounts and create child resources like blob for each storage accounts using loops in Bicep.I was able to deploy multiple storage accounts but not getting good examples or documentation on how to create child resources for iterated resources in bicep

@allowed([
  'CACN'
  'CAEA'
  'USE2'
  'USCN'
])
param regionCode string
param mandatoryTags object
param sku object = {
  name: 'Standard_LRS'
  tier: 'Standard'
}
param identity object = {
  type: 'SystemAssigned'
}
@allowed([
  'None'
  'Logging'
  'Metrics'
  'AzureServices'
])
param bypass string = 'AzureServices'

// array of storage account names
param storageAccounts array

// variables 
var kind = 'StorageV2'
var varHTTPSOnly = true 
var varEnableNFSv3 = false
var varAllowBlobPublicAccess = false
var tlsVersion = 'TLS1_2'
var enableADLSgen2 = false

resource storageAccountResources 'Microsoft.Storage/storageAccounts@2021-02-01' = [for storageName in storageAccounts: {
  name: storageName
  location: resourceGroup().location
  kind: kind
  sku: sku
  tags: mandatoryTags
  identity: identity 
  properties: {
    accessTier: 'Hot'
    supportsHttpsTrafficOnly: varHTTPSOnly
    isHnsEnabled: enableADLSgen2
    minimumTlsVersion: tlsVersion
    isNfsV3Enabled: varEnableNFSv3
    allowBlobPublicAccess: varAllowBlobPublicAccess
    // network security controls
    networkAcls: {
      bypass: bypass     
      defaultAction: 'Deny'
      resourceAccessRules: []
      virtualNetworkRules: []
      ipRules: []
    } 
    routingPreference: {
      routingChoice: 'MicrosoftRouting'
      publishMicrosoftEndpoints: false
      publishInternetEndpoints: false
    }
    encryption: {
      services: {
        blob: {
          enabled: true
          keyType: 'Account'
        }
        file: {
          enabled: true
          keyType: 'Account'
        }
        table: {
          enabled: true
          keyType: 'Account'
        }
        queue: {
          enabled: true
          keyType: 'Account'
        }
      }
      keySource: 'Microsoft.Storage'
  }
  }
}]
output stgOutput array = [for (name, i) in storageAccounts: {
  name: storageAccounts[i].name
}]

resource ${storageName}_default 'Microsoft.Storage/storageAccounts/blobServices@2021-04-01' = {
    name: 'default'
    properties: {
      changeFeed: {
        enabled: false
      }
      restorePolicy : {
        enabled: false
      }
      containerDeleteRetentionPolicy: {
        enabled: true
        days: 7
      }
      cors: {
        corsRules: []
      }
      deleteRetentionPolicy: {
        enabled: true
        days: 7        
      }
      isVersioningEnabled: true
    }
  } 
Thomas
  • 24,234
  • 6
  • 81
  • 125
anuj khosla
  • 43
  • 1
  • 1
  • 6

1 Answers1

0

Looking at the documentation (Iteration for a child resource), you should be able to use an iterator :

resource blobServices 'Microsoft.Storage/storageAccounts/blobServices@2021-04-01' = [for i in range(0, length(storageAccounts)): {
  name: '${storageAccountResources[i].name}/default'
  properties: {
    changeFeed: {
      enabled: false
    }
    restorePolicy: {
      enabled: false
    }
    containerDeleteRetentionPolicy: {
      enabled: true
      days: 7
    }
    cors: {
      corsRules: []
    }
    deleteRetentionPolicy: {
      enabled: true
      days: 7
    }
    isVersioningEnabled: true
  }
}]

For complex arrays, you can use this syntax as well:

resource blobServices 'Microsoft.Storage/storageAccounts/blobServices@2021-04-01' = [for (storageAccount, i) in storageAccounts: {
  name: '${storageAccountResources[i].name}/default'
  properties: {
    changeFeed: {
      enabled: storageAccount.changeFeed
    }
    restorePolicy: {
      enabled: storageAccount.restorePolicy
    }
    ...
  }
}]

Thomas
  • 24,234
  • 6
  • 81
  • 125