用于应用服务的 Terraform "The name "xxx”需要全局唯一且不可用”
Terraform "The name "xxx" used for the App Service needs to be globally unique and isn't available"
我在 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' 已存在。请select一个不同的名字。
我有点困惑,因为我希望 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"
}
P.S。如果我尝试通过添加 connection_string 部分或修改 app_settings 来修改应用服务配置,结果是相同的,抛出异常“错误:应用服务使用的名称 "xxx"需要全局唯一且不可用:主机名 'xxx' 已存在。请 select 一个不同的名称。"
这是地形状态输出:
D:\alexus-git\TerraformAppServicePlanTest [master ≡]> 地形图
在计划之前刷新内存中的 Terraform 状态...
刷新状态将用于计算此计划,但不会
保存到本地或远程状态存储。
azurerm_resource_group.rg: 刷新状态... [id=/subscriptions/0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg]
azurerm_app_service_plan.app_plan: 刷新状态... [id=/subscriptions/0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg/providers/Microsoft.Web/serverfarms/xxx-poc1-asp01]
执行计划已经生成,如下图所示。
资源操作用以下符号表示:
+ 创建
Terraform 将执行以下操作:
# azurerm_app_service.app_service 将被创建
+ 资源 "azurerm_app_service" "app_service" {
+ app_service_plan_id = "/subscriptions/0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg/providers/Microsoft.Web/serverfarms/xxx-poc1-asp01"
+ app_settings = {
+ "SOME_KEY" = "some-value"
}
+ client_affinity_enabled =(申请后知道)
+ default_site_hostname =(申请后知道)
+ 启用 = 真
+ https_only = 错误
+ id =(申请后知道)
+ 位置 = "eastus"
+ 名字 = "xxx-poc1-apsvc01"
+ outbound_ip_addresses =(申请后知道)
+ possible_outbound_ip_addresses =(申请后知道)
+ resource_group_name = "xxx-poc1-rg"
+ site_credential =(申请后知道)
+ source_control =(申请后知道)
+ tags =(应用后已知)
+ 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个销毁。
问题是您没有提供使用 azurerm 的支持,因此您的状态文件不会被保存。
要解决此问题,您可以在现有的 .tf
文件中添加 backend
或创建一个新文件,例如backend.tf
内容:
terraform {
backend "azurerm" {
}
}
我在 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' 已存在。请select一个不同的名字。
我有点困惑,因为我希望 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"
}
P.S。如果我尝试通过添加 connection_string 部分或修改 app_settings 来修改应用服务配置,结果是相同的,抛出异常“错误:应用服务使用的名称 "xxx"需要全局唯一且不可用:主机名 'xxx' 已存在。请 select 一个不同的名称。"
这是地形状态输出: D:\alexus-git\TerraformAppServicePlanTest [master ≡]> 地形图 在计划之前刷新内存中的 Terraform 状态... 刷新状态将用于计算此计划,但不会 保存到本地或远程状态存储。
azurerm_resource_group.rg: 刷新状态... [id=/subscriptions/0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg] azurerm_app_service_plan.app_plan: 刷新状态... [id=/subscriptions/0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg/providers/Microsoft.Web/serverfarms/xxx-poc1-asp01]
执行计划已经生成,如下图所示。 资源操作用以下符号表示: + 创建
Terraform 将执行以下操作:
# azurerm_app_service.app_service 将被创建 + 资源 "azurerm_app_service" "app_service" { + app_service_plan_id = "/subscriptions/0f1c414a-...-a351876ecd47/resourceGroups/xxx-poc1-rg/providers/Microsoft.Web/serverfarms/xxx-poc1-asp01" + app_settings = { + "SOME_KEY" = "some-value" } + client_affinity_enabled =(申请后知道) + default_site_hostname =(申请后知道) + 启用 = 真 + https_only = 错误 + id =(申请后知道) + 位置 = "eastus" + 名字 = "xxx-poc1-apsvc01" + outbound_ip_addresses =(申请后知道) + possible_outbound_ip_addresses =(申请后知道) + resource_group_name = "xxx-poc1-rg" + site_credential =(申请后知道) + source_control =(申请后知道) + tags =(应用后已知)
+ 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个销毁。
问题是您没有提供使用 azurerm 的支持,因此您的状态文件不会被保存。
要解决此问题,您可以在现有的 .tf
文件中添加 backend
或创建一个新文件,例如backend.tf
内容:
terraform {
backend "azurerm" {
}
}