Terraform «Имя« xxx », используемое для службы приложений, должно быть глобально уникальным и недоступным» - PullRequest
2 голосов
/ 13 января 2020

Я применяю следующую конфигурацию в Terraform:

resource "azurerm_resource_group" "rg" {
  name     = var.resourceGroupName
  location = var.location
}

resource "azurerm_app_service_plan" "app_plan" {
  name                = var.appServicePlanName
  location            = var.location
  resource_group_name = azurerm_resource_group.rg.name

  sku {
    tier = "Free"
    size = "F1"
  }
}

resource "azurerm_app_service" "app_service" {
  name                = var.appServiceName
  location            = var.location
  resource_group_name = azurerm_resource_group.rg.name
  app_service_plan_id = azurerm_app_service_plan.app_plan.id

  app_settings = {
    "SOME_KEY" = "some-value"
  }
}

При первом запуске 'terraform apply' результат, который я ожидаю получить. Ресурсы созданы. Если я снова выполню ту же конфигурацию, я получу: Ошибка: имя «xxx», используемое для службы приложений, должно быть глобально уникальным и недоступным: имя хоста «xxx» уже существует. Пожалуйста, выберите другое имя.

Я немного запутался, поскольку ожидал, что Terraform пропустит любые изменения и просто сообщит мне, что ничего не изменилось, что я пропустил? Моя конфигурация провайдера (provider.tf) следующая:

provider "azurerm" {
  skip_provider_registration = "true"
  subscription_id = var.subscriptionId
  tenant_id       = var.tenantId
  client_id       = var.clientId
  client_secret   = var.clientSecret
}

Кроме того, у меня есть файлы terraform.tfvars

resourceGroupName = "xxx-poc1-rg"
location = "eastus"
appServicePlanName = "xxx-poc1-asp01"
appServiceName = "xxx-poc1-apsvc01"
subscriptionId = ""
tenantId = ""
clientId = ""
clientSecret = ""

и variables.tf

variable "appServiceName" {
  type        = string
  description = "The name of app service"
}

variable "appServicePlanName" {
  type        = string
  description = "The name of app service plan"
}

variable "resourceGroupName" {
  type        = string
  description = "The name of resource group"
}

variable "location" {
  type        = string
  description = "Location"
}

variable "subscriptionId" {
  type        = string
  description = "Subscription id"
}

variable "tenantId" {
  type        = string
  description = "Tenant id"
}

variable "clientId" {
  type        = string
  description = "Client id"
}

variable "clientSecret" {
  type        = string
  description = "Client secret"
}

PS Если я пытаюсь изменить конфигурацию службы приложения, добавив раздел connection_string или изменив app_settings, результат будет тот же, возникнет исключение: «Ошибка: имя« xxx », используемое для службы приложений, должно быть глобально уникальным и не t доступно: имя хоста 'xxx' уже существует. Пожалуйста, выберите другое имя. "

Вот вывод состояния terraform: D: \ alexus-git \ TerraformAppServicePlanTest [master ≡]> план terraform Обновление состояния Terraform in- память до плана ... Обновленное состояние будет использоваться для расчета этого плана, но не будет сохранено в локальном или удаленном хранилище состояний.

azurerm_resource_group.rg: Обновление состояния ... [id = / subscription /0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg] azurerm_app_service_plan.app_plan: обновление состояния ... [id = / subscription / 0f1c4 14a -...- a351876ecd47 / resourceGroups / xxx-poc1-rg / provider / Microsoft.Web / serverfarms / xxx-poc1-asp01]


План выполнения был создан и показан ниже. Действия ресурса обозначаются следующими символами: + create

Terraform выполнит следующие действия:

Будет создан # azurerm_app_service.app_service + ресурс "azurerm_app_service" "app_service" {+ app_service_plan_id = " /subscription/0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg/providers/Microsoft.Web/serverfarms/xxx-poc1-asp01 "+ app_settings = {+" SOME_KEY "=" some-value "} + client_affen = (известно после применения) + default_site_hostname = (известно после применения) + enabled = true + https_only = false + id = (известно после применения) + location = "eastus" + name = "xxx-poc1-apsvc01" + outbound_ip_addresses = ( известный после применения) + возможный_отклоненный_ip_addresses = (известный после применения) + resource_group_name = "xxx-poc1-rg" + site_credential = (известный после применения) + source_control = (известный после применения) + теги = (известный после применения)

  + auth_settings {
      + additional_login_params        = (known after apply)
      + allowed_external_redirect_urls = (known after apply)
      + default_provider               = (known after apply)
      + enabled                        = (known after apply)
      + issuer                         = (known after apply)
      + runtime_version                = (known after apply)
      + token_refresh_extension_hours  = (known after apply)
      + token_store_enabled            = (known after apply)
      + unauthenticated_client_action  = (known after apply)

      + active_directory {
          + allowed_audiences = (known after apply)
          + client_id         = (known after apply)
          + client_secret     = (sensitive value)
        }

      + facebook {
          + app_id       = (known after apply)
          + app_secret   = (sensitive value)
          + oauth_scopes = (known after apply)
        }

      + google {
          + client_id     = (known after apply)
          + client_secret = (sensitive value)
          + oauth_scopes  = (known after apply)
        }

      + microsoft {
          + client_id     = (known after apply)
          + client_secret = (sensitive value)
          + oauth_scopes  = (known after apply)
        }

      + twitter {
          + consumer_key    = (known after apply)
          + consumer_secret = (sensitive value)
        }
    }

  + connection_string {
      + name  = (known after apply)
      + type  = (known after apply)
      + value = (sensitive value)
    }

  + identity {
      + identity_ids = (known after apply)
      + principal_id = (known after apply)
      + tenant_id    = (known after apply)
      + type         = (known after apply)
    }

  + logs {
      + application_logs {
          + azure_blob_storage {
              + level             = (known after apply)
              + retention_in_days = (known after apply)
              + sas_url           = (sensitive value)
            }
        }

      + http_logs {
          + azure_blob_storage {
              + retention_in_days = (known after apply)
              + sas_url           = (sensitive value)
            }

          + file_system {
              + retention_in_days = (known after apply)
              + retention_in_mb   = (known after apply)
            }
        }
    }

  + site_config {
      + always_on                 = (known after apply)
      + app_command_line          = (known after apply)
      + auto_swap_slot_name       = (known after apply)
      + default_documents         = (known after apply)
      + dotnet_framework_version  = (known after apply)
      + ftps_state                = (known after apply)
      + http2_enabled             = (known after apply)
      + ip_restriction            = (known after apply)
      + java_container            = (known after apply)
      + java_container_version    = (known after apply)
      + java_version              = (known after apply)
      + linux_fx_version          = (known after apply)
      + local_mysql_enabled       = (known after apply)
      + managed_pipeline_mode     = (known after apply)
      + min_tls_version           = (known after apply)
      + php_version               = (known after apply)
      + python_version            = (known after apply)
      + remote_debugging_enabled  = (known after apply)
      + remote_debugging_version  = (known after apply)
      + scm_type                  = (known after apply)
      + use_32_bit_worker_process = (known after apply)
      + virtual_network_name      = (known after apply)
      + websockets_enabled        = (known after apply)
      + windows_fx_version        = (known after apply)

      + cors {
          + allowed_origins     = (known after apply)
          + support_credentials = (known after apply)
        }
    }

  + storage_account {
      + access_key   = (sensitive value)
      + account_name = (known after apply)
      + mount_path   = (known after apply)
      + name         = (known after apply)
      + share_name   = (known after apply)
      + type         = (known after apply)
    }
}

План: 1 добавить, 0 изменить, 0 уничтожить.

1 Ответ

2 голосов
/ 31 января 2020

Проблема в том, что вы не предоставили резервную копию для использования azurerm, поэтому ваш файл состояния не сохраняется. Чтобы это исправить, вы можете добавить backend в существующий файл .tf или создать новый, например, backend.tf с содержимым:

terraform { backend "azurerm" { } }

...