Terraform с Azure дает круговую зависимость - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь использовать провайдера Azure для предоставления инфраструктуры. У меня такой же процесс работает через AzureCLI, но я хочу перейти на Terraform.

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

  1. Когнитивный сервис с сгенерированным ключом API
  2. AppService с идентификатором SystemAssigned;
  3. Keyvault, с идентификатором, назначенным в (2), предоставлен доступ для чтения;
  4. Keyvault secret с ключом API, сгенерированным в (1).
  5. AppService в (2) необходимо обновить с помощью секретного идентификатора, сгенерированного в (3). - проблема.

Теперь: мне нужно установить конфигурацию AppService для ссылки на секретный идентификатор, который я генерирую при добавлении в хранилище, но не могу.

Есть ли способ отредактировать эти значения, чтобы конфигурация могла быть настроена по частям? то есть положение х затем изменить?

Редактировать: Мой файл Terraform находится ниже:

provider "azurerm" {
    version = "=1.28.0"
}

variable "TENANT_ID" {
  type = string
}

resource "azurerm_resource_group" "test" {
    name = "resourceGroup1"
    location = "australiaeast"
}

resource "azurerm_app_service_plan" "plan" {
  name = "resourceGroup1"
  location = "${azurerm_resource_group.test.location}"
  resource_group_name = "${azurerm_resource_group.test.name}"
  kind = "Linux"

  sku {
    tier = "Basic"
    size = "B1"
  }
}

resource "azurerm_cognitive_account" "cognitive" {
  name = "resourceGroup1-cognitive"
  location = "${azurerm_resource_group.test.location}"
  resource_group_name = "${azurerm_resource_group.test.name}"
  kind = "ComputerVision"

  sku {
    name = "S0"
    tier = "Standard"
  }
}

resource "azurerm_key_vault" "keyvault" {
  name = "resourceGroup1-keyvault"
  location = "${azurerm_resource_group.test.location}"
  resource_group_name = "${azurerm_resource_group.test.name}"
  tenant_id = var.TENANT_ID

  sku {
    name = "standard"
  }

  access_policy {
    tenant_id = "${azurerm_app_service.api.identity.0.tenant_id}"
    object_id = "${azurerm_app_service.api.identity.0.principal_id}"

    secret_permissions = [ "get" ]
  }
}

resource "azurerm_key_vault_secret" "keyvault-apikey" {
  name = "AzureComputerVisionApiKey"
  value = "${azurerm_cognitive_account.cognitive.primary_access_key}"
  key_vault_id = "${azurerm_key_vault.keyvault.id}"
}

resource "azurerm_app_service" "api" {
  name = "resourceGroup1-api"
  location = "${azurerm_resource_group.test.location}"
  resource_group_name = "${azurerm_resource_group.test.name}"
  app_service_plan_id = "${azurerm_app_service_plan.plan.id}"

  identity {
    type = "SystemAssigned"
  }

  app_settings = {
    "ASPNETCORE_AzureComputerVisionApiKey" = "THIS IS A NORMAL SECRET VALUE"
  }
}

Если я изменю значение для строки «ASPNETCORE_AzureComputerVisionApiKey» на:

    "ASPNETCORE_AzureComputerVisionApiKey" = "@Microsoft.KeyVault(${azurerm_key_vault_secret.keyvault-apikey.id})"

Чтобы он ссылался на секрет хранилища ключей, во время операции terraform plan я получаю следующую ошибку:

Error: Cycle: azurerm_app_service.api, azurerm_key_vault.keyvault, azurerm_key_vault_secret.keyvault-apikey

1 Ответ

1 голос
/ 09 июля 2019

Для вашей проблемы, как показывает ошибка, это проблема циклической зависимости.

Когда вы изменяете appsettings в ресурсе azurerm_app_service следующим образом:

"ASPNETCORE_AzureComputerVisionApiKey" = "@Microsoft.KeyVault(${azurerm_key_vault_secret.keyvault-apikey.id})"

Тогда зависимость будет выглядеть так:

azurerm_key_vault_secret зависимость от azurerm_key_vault

azurerm_key_vault зависимость от azurerm_app_service

azurerm_app_service зависит от azurerm_key_vault

Таким образом, он показывает ошибку и не может создать все ресурсы.

Решение состоит в том, чтобы изменить последовательность создания ресурсов следующим образом:

  1. azurerm_cognitive_account
  2. azurerm_key_vault без политики доступа
  3. azurerm_key_vault_secret
  4. azurerm_app_service
  5. azurerm_key_vault_access_policy

Просто разделите хранилище ключей и политику доступа к хранилищу ключей, и циклическая зависимость исчезнет.

...