带有Azure的Terraform提供了循环依赖性

带有Azure的Terraform提供了循环依赖性,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,我正在尝试使用Azure提供商来配置基础架构。我已经通过AzureCLI完成了相同的过程,但我想转移到Terraform 不幸的是,我遇到了一个循环依赖,似乎无法解决。我有下列物品 具有生成的API密钥的认知服务 具有系统分配标识的AppService 密钥库,具有(2)中指定的身份,具有读取权限 使用(1)中生成的API密钥的Keyvault secret (2)中的AppService需要使用(3)中生成的机密Id进行更新问题 现在:我需要将AppService的配置设置为引用添加到vaul

我正在尝试使用Azure提供商来配置基础架构。我已经通过AzureCLI完成了相同的过程,但我想转移到Terraform

不幸的是,我遇到了一个循环依赖,似乎无法解决。我有下列物品

  • 具有生成的API密钥的认知服务
  • 具有系统分配标识的AppService
  • 密钥库,具有(2)中指定的身份,具有读取权限
  • 使用(1)中生成的API密钥的Keyvault secret
  • (2)中的AppService需要使用(3)中生成的机密Id进行更新问题
  • 现在:我需要将AppService的配置设置为引用添加到vault时生成的机密Id,但我不能

    是否有办法编辑这些值,以便在零件中设置配置?ie条款x然后修改

    编辑:我的地形文件如下:

    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})"
    
    因此,它引用了密钥保险库机密,在
    地形平面图
    操作期间,我得到以下错误:

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

    对于您的问题,正如错误所示,这是一个关于循环依赖性的问题

    当您更改资源
    azurerm\u app\u服务中的
    appsettings
    时,如下所示:

    "ASPNETCORE_AzureComputerVisionApiKey" = "@Microsoft.KeyVault(${azurerm_key_vault_secret.keyvault-apikey.id})"
    
    然后依赖项将如下所示:

    "ASPNETCORE_AzureComputerVisionApiKey" = "@Microsoft.KeyVault(${azurerm_key_vault_secret.keyvault-apikey.id})"
    
    azurerm\u key\u vault\u secret依赖于azurerm\u key\u vault

    azurerm_密钥库依赖于azurerm_应用程序服务

    azurerm\u应用程序服务依赖于azurerm\u密钥库

    因此,它显示错误,无法创建所有资源

    解决方案是更改创建资源的顺序,如下所示:

    "ASPNETCORE_AzureComputerVisionApiKey" = "@Microsoft.KeyVault(${azurerm_key_vault_secret.keyvault-apikey.id})"
    
  • azurerm_认知账户
  • 没有访问策略的azurerm_key_vault
  • azurerm_钥匙_保险库_秘密
  • azurerm_应用程序_服务
  • azurerm\u密钥\u保险库\u访问\u策略

  • 只需将密钥库和密钥库访问策略分开,循环依赖关系就会消失。

    您可以共享您目前编写的地形代码吗?如果它实际上是一个循环依赖错误,那么发布完整的错误也会帮助人们帮助你。谢谢@ydaetskcoR,我已经用这两个更新了我的问题。谢谢@Charles Xu。这很有效。我正忙于寻找修改应用程序服务节点的方法,因此我没有检查密钥库设置的分离。很好的解决方案-但我发现,在TF创建密钥库机密时,将密钥库访问策略与密钥库分离会导致错误(azurerm\u密钥库\u机密)。发生这种情况是因为它试图在服务主体的访问策略存在之前创建一个秘密来创建它。如果访问策略是在密钥库中定义的,则它可以工作,但当定义为单独的资源(竞争条件?)时,它就不能工作。不公平地说,terraform似乎不喜欢密钥库资源和密钥库访问策略资源中的访问策略的混合。@FrancisDean是的,策略首先是秘密,然后是秘密。Terraform将正确地对其排序。@CharlesXu我发现在将访问策略定义为独立资源时,Terraform无法始终工作,并且在创建机密资源时,Terraform经常出错,因为访问策略没有使用密钥库(在密钥库资源块中定义)创建。您的解决方案在原则上是绝对正确的(帮助了我!)。我所描述的问题是terraform bug/监督/访问策略创建延迟。一旦terraform允许组合密钥库资源中的访问策略和单独的密钥库访问资源(请参阅TF文档),它将解决我的问题。@FrancisDean,正如我所说,您需要创建策略以允许您使用的服务主体具有正确的权限。无论在一起还是分开。如果分开,您可能需要设置依赖项。