Azure DevOps 版本 - Terraform 导入失败 'Authenticate using a Service Principal'

Azure DevOps Release - terraform import fails with 'Authenticate using a Service Principal'

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

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

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

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 导入命令失败:

'Authenticate using a Service Principal' To authenticate to Azure using a Service Principal, you can use the separate auth method - instructions for which can be found here:'

我的 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 应该根据上面块中的凭据或特定的环境变量(也存在......)选择正在使用的身份验证方法,但不知何故 Terraform 仍然认为我我正在尝试通过 Azure Cli 而不是服务主体进行身份验证。

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

object_id = azurerm_app_service.app.identity.0.principal_id

Web 应用如下创建托管身份

KV如下

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

下面的 Azure 管道服务连接进行身份验证工作正常,但您需要通过管道传递参数。

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

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