我有一个在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导入命令发生故障:
“使用服务主体进行身份验证”以对Azure进行身份验证 使用服务主体,您可以使用单独的auth方法- 有关说明,请参见此处:'
我的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而非服务主体进行身份验证。
答案 0 :(得分:0)
如下所示,您可以在Terrav的Keyvault中使用管理身份。
object_id = azurerm_app_service.app.identity.0.principal_id
Web应用程序如下所示创建托管身份
KV如下
订单应该是创建具有托管身份的Web应用,然后是KV,然后是KV访问策略。
对于使用Azure管道进行身份验证,下面的服务连接可以正常工作,但是您需要通过管道传递参数。
有关更多信息,请查看此博客here
使用here说明了使用Azure DevOps管道调用Terraform的基于PowerShell的完整实现。此实现可防止在地形化之前将任何天蓝色资源作为先决条件。只有先决条件是创建SPN才能启用身份验证和授权。