azure - 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 而不是服务主体。
解决方案
您可以在 terraform 的 keyvault 中使用管理身份,如下所示。
object_id = azurerm_app_service.app.identity.0.principal_id
Web 应用程序如下创建托管标识
KV如下
顺序应该是创建具有托管标识的 Web 应用程序,然后是 KV,然后是 KV 访问策略。
对于使用 Azure 管道服务进行身份验证,下面的连接可以正常工作,但您需要通过管道传递参数。
有关更多信息,请在此处查看此博客
此处解释了使用 Azure DevOps 管道调用 terraform 的完整基于 PowerShell 的实现。此实现可防止任何 azure 资源作为改造前的先决条件。唯一的先决条件是创建 SPN 以启用身份验证和授权。
推荐阅读
- c# - Viewmodel 无法正常工作 MVC 错误
- rust - 在具有通用生命周期参数的 impl 块中借用可变引用
- google-apps-script - 如何使用工作表名称作为条件将数据从一个 Google 工作表复制到同一文件中的另一个工作表并根据过滤条件查找工作表
- java - JVM 堆大小 Docker
- python - 在 Sphinx 中,如何在目录树中过滤掉当前页面的父级?
- image - 使用整个图像叠加作为链接 Sp 页面构建器
- math - 将比例因子转换为音符移调值
- python - 这个公式在做什么
- javascript - 在 Javascript 中处理嵌套对象——不完全理解概念
- python - Pandas:如何随机更改特定的行值?