Search code examples
azureazure-storageterraformterraform-provider-azure

Using Terraform random_id to create multiple resources not working as expected


I'm trying to combine the usage of the random_id attribute with the count meta attribute to create multiple Azure storage accounts with unique names.

Configuration code:

# Create storage accounts

resource "random_id" "storage_account_name_unique" {
  byte_length = 8
}

resource "azurerm_storage_account" "storage" {
  count                    = "${var.storage_account_count}"
  name                     = "tfsta${lower(random_id.storage_account_name_unique.hex)}"
  resource_group_name      = "${azurerm_resource_group.rg.name}"
  location                 = "${azurerm_resource_group.rg.location}"
  account_kind             = "StorageV2"
  account_tier             = "Standard"
  access_tier              = "Hot"
  account_replication_type = "${var.account_replication_type}"

  network_rules {
    ip_rules                   = ["127.0.0.1"]
    virtual_network_subnet_ids = ["${azurerm_subnet.subnet.id}"] 
  }

  tags = "${var.tags}"
  }

Problems with this code:

  1. Terraform is only generating a single random_id and uses it for all of the storage account instances created during terraform apply operation.
  2. Terraform is "fooled" into thinking it has created multiple storage accounts however only one storage account gets created

Selected Terraform Apply output:

This output shows that Terraform thinks it is creating three separate storage accounts with the same random_id. The plan is successfully applied but there is only one storage account created in Azure.

random_id.storage_account_name_unique: Creating...
  b64:         "" => "<computed>"
  b64_std:     "" => "<computed>"
  b64_url:     "" => "<computed>"
  byte_length: "" => "8"
  dec:         "" => "<computed>"
  hex:         "" => "<computed>"
random_id.storage_account_name_unique: Creation complete after 0s (ID: kYl9WvpTSso)

azurerm_storage_account.storage[2]: Creating...
  access_tier:                                           "" => "Hot"
  account_encryption_source:                             "" => "Microsoft.Storage"
  account_kind:                                          "" => "StorageV2"
  account_replication_type:                              "" => "LRS"
  account_tier:                                          "" => "Standard"
  enable_blob_encryption:                                "" => "true"
  enable_file_encryption:                                "" => "true"
  identity.#:                                            "" => "<computed>"
  location:                                              "" => "westus2"
  name:                                                  "" => "tfsta91897d5afa534aca"
  network_rules.#:                                       "" => "1"
  network_rules.0.bypass.#:                              "" => "<computed>"
  network_rules.0.ip_rules.#:                            "" => "1"
  network_rules.0.ip_rules.3619153832:                   "" => "127.0.0.1"
  network_rules.0.virtual_network_subnet_ids.#:          "" => "1"
  network_rules.0.virtual_network_subnet_ids.3223410521: "" => "/subscriptions/f6d69ee2-34d5-4ca8-a143-7a2fc1aeca55/resourceGroups/hdi-dev-rg/providers/Microsoft.Network/virtualNetworks/hdi-dev-vnet/subnets/hdinsight"
  primary_access_key:                                    "<sensitive>" => "<sensitive>"
  primary_blob_connection_string:                        "<sensitive>" => "<sensitive>"
  primary_blob_endpoint:                                 "" => "<computed>"
  primary_connection_string:                             "<sensitive>" => "<sensitive>"
  primary_file_endpoint:                                 "" => "<computed>"
  primary_location:                                      "" => "<computed>"
  primary_queue_endpoint:                                "" => "<computed>"
  primary_table_endpoint:                                "" => "<computed>"
  resource_group_name:                                   "" => "hdi-dev-rg"
  secondary_access_key:                                  "<sensitive>" => "<sensitive>"
  secondary_blob_connection_string:                      "<sensitive>" => "<sensitive>"
  secondary_blob_endpoint:                               "" => "<computed>"
  secondary_connection_string:                           "<sensitive>" => "<sensitive>"
  secondary_location:                                    "" => "<computed>"
  secondary_queue_endpoint:                              "" => "<computed>"
  secondary_table_endpoint:                              "" => "<computed>"
  tags.%:                                                "" => "3"
  tags.costcenter:                                       "" => "Unknown"
  tags.environment:                                      "" => "Dev"
  tags.project:                                          "" => "Unknown"
azurerm_storage_account.storage[1]: Creating...
  access_tier:                                           "" => "Hot"
  account_encryption_source:                             "" => "Microsoft.Storage"
  account_kind:                                          "" => "StorageV2"
  account_replication_type:                              "" => "LRS"
  account_tier:                                          "" => "Standard"
  enable_blob_encryption:                                "" => "true"
  enable_file_encryption:                                "" => "true"
  identity.#:                                            "" => "<computed>"
  location:                                              "" => "westus2"
  name:                                                  "" => "tfsta91897d5afa534aca"
  network_rules.#:                                       "" => "1"
  network_rules.0.bypass.#:                              "" => "<computed>"
  network_rules.0.ip_rules.#:                            "" => "1"
  network_rules.0.ip_rules.3619153832:                   "" => "127.0.0.1"
  network_rules.0.virtual_network_subnet_ids.#:          "" => "1"
  network_rules.0.virtual_network_subnet_ids.3223410521: "" => "/subscriptions/f6d69ee2-34d5-4ca8-a143-7a2fc1aeca55/resourceGroups/hdi-dev-rg/providers/Microsoft.Network/virtualNetworks/hdi-dev-vnet/subnets/hdinsight"
  primary_access_key:                                    "<sensitive>" => "<sensitive>"
  primary_blob_connection_string:                        "<sensitive>" => "<sensitive>"
  primary_blob_endpoint:                                 "" => "<computed>"
  primary_connection_string:                             "<sensitive>" => "<sensitive>"
  primary_file_endpoint:                                 "" => "<computed>"
  primary_location:                                      "" => "<computed>"
  primary_queue_endpoint:                                "" => "<computed>"
  primary_table_endpoint:                                "" => "<computed>"
  resource_group_name:                                   "" => "hdi-dev-rg"
  secondary_access_key:                                  "<sensitive>" => "<sensitive>"
  secondary_blob_connection_string:                      "<sensitive>" => "<sensitive>"
  secondary_blob_endpoint:                               "" => "<computed>"
  secondary_connection_string:                           "<sensitive>" => "<sensitive>"
  secondary_location:                                    "" => "<computed>"
  secondary_queue_endpoint:                              "" => "<computed>"
  secondary_table_endpoint:                              "" => "<computed>"
  tags.%:                                                "" => "3"
  tags.costcenter:                                       "" => "Unknown"
  tags.environment:                                      "" => "Dev"
  tags.project:                                          "" => "Unknown"
azurerm_storage_account.storage[0]: Creating...
  access_tier:                                           "" => "Hot"
  account_encryption_source:                             "" => "Microsoft.Storage"
  account_kind:                                          "" => "StorageV2"
  account_replication_type:                              "" => "LRS"
  account_tier:                                          "" => "Standard"
  enable_blob_encryption:                                "" => "true"
  enable_file_encryption:                                "" => "true"
  identity.#:                                            "" => "<computed>"
  location:                                              "" => "westus2"
  name:                                                  "" => "tfsta91897d5afa534aca"
  network_rules.#:                                       "" => "1"
  network_rules.0.bypass.#:                              "" => "<computed>"
  network_rules.0.ip_rules.#:                            "" => "1"
  network_rules.0.ip_rules.3619153832:                   "" => "127.0.0.1"
  network_rules.0.virtual_network_subnet_ids.#:          "" => "1"
  network_rules.0.virtual_network_subnet_ids.3223410521: "" => "/subscriptions/f6d69ee2-34d5-4ca8-a143-7a2fc1aeca55/resourceGroups/hdi-dev-rg/providers/Microsoft.Network/virtualNetworks/hdi-dev-vnet/subnets/hdinsight"
  primary_access_key:                                    "<sensitive>" => "<sensitive>"
  primary_blob_connection_string:                        "<sensitive>" => "<sensitive>"
  primary_blob_endpoint:                                 "" => "<computed>"
  primary_connection_string:                             "<sensitive>" => "<sensitive>"
  primary_file_endpoint:                                 "" => "<computed>"
  primary_location:                                      "" => "<computed>"
  primary_queue_endpoint:                                "" => "<computed>"
  primary_table_endpoint:                                "" => "<computed>"
  resource_group_name:                                   "" => "hdi-dev-rg"
  secondary_access_key:                                  "<sensitive>" => "<sensitive>"
  secondary_blob_connection_string:                      "<sensitive>" => "<sensitive>"
  secondary_blob_endpoint:                               "" => "<computed>"
  secondary_connection_string:                           "<sensitive>" => "<sensitive>"
  secondary_location:                                    "" => "<computed>"
  secondary_queue_endpoint:                              "" => "<computed>"
  secondary_table_endpoint:                              "" => "<computed>"
  tags.%:                                                "" => "3"
  tags.costcenter:                                       "" => "Unknown"
  tags.environment:                                      "" => "Dev"
  tags.project:                                          "" => "Unknown"
azurerm_storage_account.storage[0]: Creation complete after 21s (ID: /subscriptions/f6d69ee2-34d5-4ca8-a143-.../storageAccounts/tfsta91897d5afa534aca)
azurerm_storage_account.storage[2]: Creation complete after 22s (ID: /subscriptions/f6d69ee2-34d5-4ca8-a143-.../storageAccounts/tfsta91897d5afa534aca)
azurerm_storage_account.storage[1]: Creation complete after 23s (ID: /subscriptions/f6d69ee2-34d5-4ca8-a143-.../storageAccounts/tfsta91897d5afa534aca)

Solution

  • Your issue here is your use of the random string, you've only made one string and reused the same string in each name. If you want to have a random string element as part of your storage account name you'll need multiple random strings. The sample below demonstrates using and creating multiple random strings in a resource.

    resource "random_id" "storage_account_name_unique" {
      count = "${var.storage_account_count}"
      byte_length = 8
    }
    
    output "random"{
    value=["${random_id.storage_account_name_unique.*.hex}"]
    }
    
    provider "random" {
      version="2.0"
    }
    
    resource "null_resource" "echo" {
      count = "${var.storage_account_count}"
      provisioner "local-exec" {     
        command = 
          "echo ${element(random_id.storage_account_name_unique.*.hex, count.index)}"
      }
    }
    

    This gives you:

    null_resource.echo[0]: Creating...
    null_resource.echo[1]: Creating...
    null_resource.echo[0]: Provisioning with 'local-exec'...
    null_resource.echo[1]: Provisioning with 'local-exec'...
    null_resource.echo[1] (local-exec): Executing: ["cmd" "/C" "echo e5ddcf9fb82798f2"]
    null_resource.echo[0] (local-exec): Executing: ["cmd" "/C" "echo ceb231a41c8cdb24"]
    null_resource.echo[1] (local-exec): e5ddcf9fb82798f2
    null_resource.echo[0] (local-exec): ceb231a41c8cdb24
    null_resource.echo[1]: Creation complete after 0s (ID: 3289535031294242492)
    null_resource.echo[0]: Creation complete after 0s (ID: 4611439113584915035)
    
    Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    random = [
        ceb231a41c8cdb24,
        e5ddcf9fb82798f2
    ]