Terraform CLI 出现错误:ID 缺少“slots”元素

Fel*_*olz 8 runtime-error azure terraform azure-web-app-service terraform-provider-azure

我在 Windows 上执行terraform.exe apply并收到错误:

\n
azurerm_subnet.subnet: Refreshing state... [id=<...>]\nazurerm_app_service_plan.service_plan: Refreshing state... [id=<...>]\nazurerm_app_service.app: Refreshing state... [id=<...>]\nazurerm_app_service_virtual_network_swift_connection.test: Refreshing state... [id=<...>]\nazurerm_app_service_slot.production: Refreshing state... [id=<...>]\nazurerm_app_service_slot.staging: Refreshing state... [id=<...>]\n\nError: ID was missing the `slots` element\n
Run Code Online (Sandbox Code Playgroud)\n

我正在尝试使用 terraform 构建具有不同插槽和 docker 图像的 Azure WebApp。它应该根据 Dockerfile 映像部署具有不同插槽的 Azure WebApp。

\n

第一次运行没有错误。当我刷新资源时收到错误消息。

\n

我正在使用 azurerm 提供程序版本 2.1.0 和 azurerm 后端。

\n

请参阅以下 terraform 文件:

\n
terraform {\n  backend "azurerm" {\n    resource_group_name  = "..."\n    storage_account_name = "..."\n    container_name       = "..."\n    key                  = "..."\n\n    subscription_id      = "..."\n    tenant_id            = "..."\n\n    sas_token            = "...."\n  }\n}\n\nprovider "azurerm" {\n  version = "~>2.1.0"\n  features {}\n}\n\nvariable "environment" {\n  default = "production"\n}\nvariable "resource_group" {}\nvariable "location" {\n  default = "West Europe"\n}\nvariable "app_name" {}\nvariable "network" {}\nvariable "subnet_prefix" {}\n\nresource "azurerm_app_service_plan" "service_plan" {\n  name                = var.app_name\n  location            = var.location\n  resource_group_name = var.resource_group\n\n  kind = "Linux"\n  reserved = true\n\n  sku {\n    tier = "Standard"\n    size = "S1"\n  }\n\n  tags = {\n    Environment = var.environment\n    Cost        = "\xe2\x82\xac0,081/Stunde"\n  }\n}\n\nresource "azurerm_app_service" "app" {\n  name                = var.app_name\n  location            = var.location\n  resource_group_name = var.resource_group\n  app_service_plan_id = azurerm_app_service_plan.service_plan.id\n  depends_on = [azurerm_app_service_plan.service_plan]\n\n  site_config {\n    linux_fx_version = "DOCKER|<...>.azurecr.io/<...>:0.0.1-95"\n    always_on        = "true"\n  }\n\n  app_settings = {\n    ...\n  }\n\n  storage_account {\n    access_key = "..."\n    account_name = "..."\n    name = "certs"\n    share_name = "certs"\n    type = "AzureBlob"\n    mount_path = "/var/certs"\n  }\n\n  tags = {\n    Environment = var.environment\n  }\n}\n\nresource "azurerm_app_service_slot" "production" {\n  name                = var.app_name\n  app_service_name    = azurerm_app_service.app.name\n  location            = azurerm_app_service.app.location\n  resource_group_name = var.resource_group\n  app_service_plan_id = azurerm_app_service_plan.service_plan.id\n\n  depends_on = [azurerm_app_service.app]\n\n  site_config {\n    linux_fx_version = "DOCKER|<...>.azurecr.io/<...>:0.0.1-95"\n    always_on        = "true"\n\n  }\n\n  app_settings = {\n    "SOME_KEY" = "some-value"\n  }\n}\n\nresource "azurerm_app_service_slot" "staging" {\n  name                = "staging"\n  app_service_name    = azurerm_app_service.app.name\n  location            = azurerm_app_service.app.location\n  resource_group_name = var.resource_group\n  app_service_plan_id = azurerm_app_service_plan.service_plan.id\n\n  depends_on = [azurerm_app_service.app]\n\n  site_config {\n    linux_fx_version = "DOCKER|<...>.azurecr.io/<...>:latest"\n    always_on        = "true"\n  }\n}\n\nresource "azurerm_subnet" "subnet" {\n  name                 = var.app_name\n  resource_group_name  = var.resource_group\n  virtual_network_name = var.network\n  address_prefix       = var.subnet_prefix\n\n  delegation {\n    name = var.app_name\n\n    service_delegation {\n      name    = "Microsoft.Web/serverFarms"\n      actions = [\n        "Microsoft.Network/networkinterfaces/*",\n        "Microsoft.Network/virtualNetworks/subnets/action",\n        "Microsoft.Network/virtualNetworks/subnets/join/action",\n        "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action",\n        "Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action"\n      ]\n    }\n  }\n}\n\nresource "azurerm_app_service_virtual_network_swift_connection" "test" {\n  app_service_id = azurerm_app_service.app.id\n  subnet_id      = azurerm_subnet.subnet.id\n  depends_on = [\n    azurerm_app_service.app,\n    azurerm_subnet.subnet\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,缺少插槽元素意味着什么?

\n

Tea*_*man 6

Terraform 将资源标识符视为区分大小写,但 azure 则不然。

在你的状态文件中的某个地方,你可能有一个 id ,/Slots/而不是/slots/.

我认为您可以使用terraform state pullterraform state push手动编辑您的状态文件。通常不推荐,但 TF 验证坚持强制区分大小写,而 azure 门户本身会向您显示大小写不一致的资源 ID:/