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 以启用身份验证和授权。
我在 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 以启用身份验证和授权。