Невозможно использовать первичный ключ доступа и вторичный ключ доступа учетной записи хранения, созданной с помощью Terraform

Я публикую это после многих бесплодных исследований и анализа, я пишу код Terraform для создания кластера служебной фабрики, и предварительные условия для этого - сначала создать масштабируемый набор виртуальных машин и учетную запись хранения.

Ниже приведен мой код для создания масштабируемого набора виртуальных машин и установки расширения Service Fabric:

resource "azurerm_virtual_machine_scale_set" "sf_scale_set_app" {
  count               = "${var.is_sf_cluster_required}"
  name                = "app"
  location            = "${var.location}"
  resource_group_name = "${azurerm_resource_group.fusion.name}"

  automatic_os_upgrade = true
  upgrade_policy_mode  = "Automatic"
  health_probe_id = "${azurerm_lb_probe.sf_lb_probe_gateway_app.id}"

  sku {
    name     = "${var.sf_scale_set_app_config["name"]}"
    tier     = "${var.sf_scale_set_app_config["tier"]}"
    capacity = "${var.sf_scale_set_app_config["capacity"]}"
  }

  storage_profile_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04"
    version   = "6.0.12"
  }

  storage_profile_os_disk {
    name              = ""
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }

  os_profile_secrets = [
    {
      source_vault_id = "${var.sf_vault_id}"

      vault_certificates = [
        {
          certificate_url   = "${var.sf_vault_url}"
          certificate_store = "My"
        },
      ]
    },
  ]

  storage_profile_data_disk {
    lun           = 0
    caching       = "ReadWrite"
    create_option = "Empty"
    disk_size_gb  = 40
  }

  os_profile {
    computer_name_prefix = "app"
    admin_username       = "someuser"
    custom_data          = "${data.template_file.cloud_init_config_app.rendered}"
  }

  os_profile_linux_config {
    disable_password_authentication = true

    ssh_keys {
      path     = "/home/someuser/.ssh/authorized_keys"
      key_data = "${file("sshkeys/someuser.pub")}"
    }
  }

  network_profile {
    name    = "sf-vm-net-profile-${terraform.workspace}"
    primary = true

    ip_configuration {
      name                                   = "sf-ip-config-app-${terraform.workspace}"
      primary                                = true
      subnet_id                              = "${azurerm_subnet.sf_vnet_subnet.id}"
      load_balancer_backend_address_pool_ids = ["${azurerm_lb_backend_address_pool.sf_lb_be_app.id}"]
      load_balancer_inbound_nat_rules_ids    = ["${element(azurerm_lb_nat_pool.sf_nat_app.*.id, count.index)}"]
    }
  }

  extension {
    name                 = "sf-scale-set-extension-${terraform.workspace}"
    publisher            = "Microsoft.Azure.ServiceFabric"
    type                 = "ServiceFabricLinuxNode"
    type_handler_version = "1.0"
    settings             = "{  \"certificate\": { \"thumbprint\": \"${var.cert_thumbprint}\", \"x509StoreName\": \"My\" } , \"clusterEndpoint\": \"${azurerm_service_fabric_cluster.sf_service.cluster_endpoint}\", \"nodeTypeRef\": \"app\", \"durabilityLevel\": \"${var.sf_reliability}\",\"nicPrefixOverride\": \"${azurerm_subnet.sf_vnet_subnet.address_prefix}\",\"enableParallelJobs\": \"true\"}"
    protected_settings   = "{\"StorageAccountKey1\": \"${azurerm_storage_account.sf_storage.primary_access_key}\", \"StorageAccountKey2\": \"${azurerm_storage_account.sf_storage.secondary_access_key}\"}"
  }

data "template_file" "cloud_init_config_app" {
  count    = "${var.is_sf_cluster_required}"
  template = "${file("customscripts/cloud_init.sh")}"

  vars {
    azure_tenant_id     = "771c9c47-7f24-44dc-958e-34f8713a8394"
    azure_client_id     = "${var.client_id}"
    azure_client_secret = "${var.client_secret}"
  }
}

В защищенных настройках раздела расширений я ссылаюсь на первичный и вторичный ключ учетной записи хранения, которая создается с использованием следующего кода:

resource "azurerm_storage_account" "sf_storage" {
  count                    = "${var.is_sf_cluster_required}"
  name                     = "${replace(replace(lower(terraform.workspace), "-", ""), " ", "")}-sf-diag-${substr(random_id.server.hex,0,4)}"
  resource_group_name      = "${azurerm_resource_group.fusion.name}"
  location                 = "${azurerm_resource_group.fusion.location}"
  account_tier             = "Standard"
  account_kind             = "StorageV2"
  account_replication_type = "LRS"
}

Переменная: var.is_sf_cluster_required установлена ​​в 1, и когда я пытаюсь запустить Terraform, я каждый раз получаю следующую ошибку:

------------------------------------------------------------------------

Error: Error running plan: 2 error(s) occurred:

* azurerm_virtual_machine_scale_set.sf_scale_set_app: 1 error(s) occurred:

* azurerm_virtual_machine_scale_set.sf_scale_set_app: Resource 'azurerm_storage_account.sf_storage' not found for variable 'azurerm_storage_account.sf_storage.primary_access_key'

Я не понимаю, почему Terraform не может найти ресурс: azurerm_storage_account.sf_storage, хотя он должен создать его с помощью блока кода создания учетной записи хранения.

Я был бы очень признателен за любую помощь здесь.


person Spaniard89    schedule 17.07.2019    source источник
comment
Не уверен, возможно, вы можете попробовать использовать явные зависимости, который зависит от учетной записи хранения в azurerm_virtual_machine_scale_set. Также вы можете проверить формат вашего кода терраформы.   -  person Charles Xu    schedule 17.07.2019
comment
@CharlesXu Большое спасибо за ответ. Я нашел настоящую проблему и добавлю ответ ниже.   -  person Spaniard89    schedule 17.07.2019


Ответы (1)


Я обнаружил реальную проблему, связанную с именем учетной записи хранения. Учетная запись хранения не должна состоять из каких-либо специальных символов, и в приведенном выше коде я использовал "-" в имени. Кроме того, существует ограничение на количество разрешенных символов. Изменение имени учетной записи хранения с

 name= "${replace(replace(lower(terraform.workspace), "-", ""), " ", "")}-sf-diag-${substr(random_id.server.hex,0,4)}"

to:

 name= "sfdiag${substr(random_id.server.hex,0,4)}"

Проблема решена, но также обнаруживается тот факт, что обработка исключений в Terraform для поставщика Azure требует некоторой работы. Я открою для этого еще одну ошибку Github.

person Spaniard89    schedule 17.07.2019