首页 > 解决方案 > Azure DevOps 版本 - terraform 导入失败并显示“使用服务主体进行身份验证”

问题描述

我有一个在 Azure DevOps 上运行的项目,该项目需要创建一个 KeyVault 并为一系列托管 AppService 身份提供对该保管库中机密的访问权限。

由于 Terraform 无法为其自己的服务连接访问密钥库(这是某种错误),我被迫在 Terraform 之前创建具有 SP 访问权限的 ResourceGroup 和 Keyvault。

terraform import通过 PowerShell 任务在资源组和 Keyvault 上运行时:

terraform init
$state = terraform state list
if ($state -like '*azurerm_resource_group.instancerg*' -and '*azurerm_key_vault.instancekeyvault*') {
    Write-Host "Resources have already been imported!"
}
else {
    terraform import azurerm_resource_group.instancerg /subscriptions/$(subscriptionid)/resourceGroups/rgname
    terraform import azurerm_key_vault.instancekeyvault /subscriptions/$(subscriptionid)/resourceGroups/rgname/providers/Microsoft.KeyVault/vaults/keyvaultname
}

terraform import 命令失败:

'使用服务主体进行身份验证'要使用服务主体对 Azure 进行身份验证,您可以使用单独的身份验证方法 - 可在此处找到相关说明:'

我的 main.tf 包含:

provider "azurerm" { 
  version = "=2.7.0"

  subscription_id = var.subscriptionid
  client_id       = var.devopsserviceconnectionaid
  client_secret   = var.devopsserviceconnectionpw
  tenant_id       = var.tennantid

  features {}
}

这些变量都与正确的凭据相关联。

据我了解,Terraform 应该根据上面块中的凭据或特定的 env 变量(也存在......)来了解正在使用的身份验证方法,但不知何故 Terraform 仍然认为我正在尝试进行身份验证通过 Azure Cli 而不是服务主体。

标签: azureazure-devopsterraformterraform-provider-azureazure-devops-extensions

解决方案


您可以在 terraform 的 keyvault 中使用管理身份,如下所示。

object_id = azurerm_app_service.app.identity.0.principal_id

在此处输入图像描述

Web 应用程序如下创建托管标识

在此处输入图像描述

KV如下

在此处输入图像描述

顺序应该是创建具有托管标识的 Web 应用程序,然后是 KV,然后是 KV 访问策略。

对于使用 Azure 管道服务进行身份验证,下面的连接可以正常工作,但您需要通过管道传递参数。 在此处输入图像描述

有关更多信息,请在此处查看此博客

此处解释了使用 Azure DevOps 管道调用 terraform 的完整基于 PowerShell 的实现。此实现可防止任何 azure 资源作为改造前的先决条件。唯一的先决条件是创建 SPN 以启用身份验证和授权。


推荐阅读