You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terragrunt DRY部署Azure资源组与Key Vault报错求助

Terragrunt部署Azure资源组时的路径错误问题

作为Terragrunt新手,我希望利用其DRY(Don't Repeat Yourself)特性实现代码复用,仓库计划支持AWS、GCP、Azure三大云厂商,当前聚焦Azure场景,目标是部署包含Key Vault的资源组。

我通过tenant.hcl、subscription.hcl和env.hcl文件避免重复修改租户、订阅及环境相关值,但执行部署时遇到路径相关错误。在IaC/deployments/azure/subscription-test-1/dev/client-test/目录下运行terragrunt plan时出现如下错误:

系统找不到指定的路径。
time=2023-03-30T09:26:00+02:00 level=error msg=Unable to determine underlying exit code, so Terragrunt will exit with error code 1

仓库目录结构

IaC/
├─ deployments/
│  ├─ azure/
│  │  ├─ subscription-test-1/
│  │  │  ├─ dev/
│  │  │  │  ├─ client-test/
│  │  │  │  │  ├─ terragrunt.hcl
│  │  │  │  ├─ env.hcl
│  │  │  ├─ ppd/
│  │  │  ├─ subscription.hcl
│  │  ├─ subscription-test-2/
│  │  │  ├─ dev/
│  │  │  ├─ ppd/
│  │  ├─ subscription-test-3/
│  │  │  ├─ prd/
│  │  │  ├─ sbx/
│  ├─ aws/
│  ├─ gcp/
│  ├─ tenant.hcl
├─ modules/
│  ├─ aws/
│  ├─ azuread/
│  │  ├─ security-groups/
│  │  ├─ spn/
│  ├─ azurerm/
│  │  ├─ akv/
│  │  │  ├─ main.tf
│  │  │  ├─ variables.tf
│  │  ├─ rg/
│  │  │  ├─ main.tf
│  │  │  ├─ variables.tf
│  ├─ databricks/
│  ├─ gcp/
├─ project-templates/
│  ├─ aws/
│  ├─ azure/
│  │  ├─ project-template-solution-1/
│  │  │  ├─ akv.tf
│  │  │  ├─ main.tf
│  │  │  ├─ rg.tf
│  │  │  ├─ variables.tf
│  │  │  ├─ terragrunt.hcl
│  │  ├─ project-template-solution-2/
│  │  ├─ project-template-solution-3/
│  ├─ gcp/
├─ terragrunt.hcl

关键代码文件

IaC/terragrunt.hcl

locals {
  # 自动加载订阅变量
  subscription_vars = read_terragrunt_config(find_in_parent_folders("subscription.hcl"))

  # 自动加载租户级变量
  tenant_var = read_terragrunt_config(find_in_parent_folders("tenant.hcl"))

  # 自动加载环境级变量
  env_vars = read_terragrunt_config(find_in_parent_folders("env.hcl"))
  
  environment       = local.env_vars.locals.environment
  subscription_id   = local.subscription_vars.locals.subscription_id
}

IaC/modules/azurerm/akv/main.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.42.0"
    }
  }
}

# 配置Azure资源管理提供商
provider "azurerm" {
    subscription_id = var.azure_subscription_id
    tenant_id = var.azure_tenant_id
    features {
    key_vault {
      purge_soft_delete_on_destroy    = true
      recover_soft_deleted_key_vaults = true
    }
  }
}

# 创建Azure Key Vault
resource "azurerm_key_vault" "akv" {
  name                        = lower("${var.azure_project_code}-${var.azure_env_code}-akv-01")
  location                    = var.azure_resource_group_location
  resource_group_name         = var.azure_rg_name
  enabled_for_disk_encryption = true
  tenant_id                   = var.azure_tenant_id
  soft_delete_retention_days  = 7
  purge_protection_enabled    = false
  sku_name = "standard"
}

IaC/modules/azurerm/akv/variables.tf

variable "azure_subscription_id" {
  type        = string
  description = "Azure订阅ID"
}

variable "azure_tenant_id" {
  type        = string
  description = "Azure租户ID"
}

variable "azure_rg_name" {
  type        = string
  description = "Azure资源组名称"
}

variable "azure_resource_group_location" {
  default = "west europe"
  description   = "资源组所在区域"
}

variable "azure_env_code" {
  type        = string
  description = "Azure环境代码"
}

variable "azure_project_code" {
  type        = string
  description = "Azure项目代码"
}

IaC/modules/azurerm/rg/main.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.42.0"
    }
  }
}

provider "azurerm" {
    subscription_id = var.azure_subscription_id
    tenant_id = var.azure_tenant_id
    features {
    resource_group {
      prevent_deletion_if_contains_resources = false
    }
  }
}

# 创建Azure资源组
resource "azurerm_resource_group" "rg" {
  name     = var.azure_rg_name
  location = var.azure_resource_group_location
}

IaC/modules/azurerm/rg/variables.tf

variable "azure_subscription_id" {
  type        = string
  description = "Azure订阅ID"
}

variable "azure_tenant_id" {
  type        = string
  description = "Azure租户ID"
}

variable "azure_rg_name" {
  type        = string
  description = "Azure资源组名称"
}

variable "azure_resource_group_location" {
  default = "west europe"
  description   = "资源组所在区域"
}

IaC/project-templates/azure/project-template-solution-1/terragrunt.hcl

include {
  path = find_in_parent_folders()
}

IaC/project-templates/azure/project-template-solution-1/akv.tf

module "akv" {
    source                          ="../../modules/azurerm/akv/"
    azure_subscription_id           = var.azure_subscription_id
    azure_tenant_id                 = var.azure_tenant_id
    azure_rg_name                   = var.azure_rg_name
    azure_resource_group_location   = var.azure_resource_group_location
    azure_project_code              = var.azure_project_code
    azure_env_code                  = var.azure_env_code
}

IaC/project-templates/azure/project-template-solution-1/rg.tf

module "rg" {
    source                          ="../../modules/azurerm/rg/"
    azure_subscription_id           = var.azure_subscription_id
    azure_tenant_id                 = var.azure_tenant_id
    azure_rg_name                   = var.azure_rg_name
    azure_resource_group_location   = var.azure_resource_group_location
}

IaC/project-templates/azure/project-template-solution-1/main.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.42.0"
    }
  }
}

provider "azurerm" {
    subscription_id = var.azure_subscription_id
    tenant_id = var.azure_tenant_id
    features {
    resource_group {
      prevent_deletion_if_contains_resources = false
    }
  }
}

IaC/project-templates/azure/project-template-solution-1/variables.tf

variable "azure_subscription_id" {
  type        = string
  description = "Azure订阅ID"
}

variable "azure_tenant_id" {
  type        = string
  description = "Azure租户ID"
}

variable "azure_rg_name" {
  type        = string
  description = "Azure资源组名称"
}

variable "azure_resource_group_location" {
  default = "west europe"
  description   = "资源组所在区域"
}

variable "azure_env_code" {
  type        = string
  description = "Azure环境代码"
}

variable "azure_project_code" {
  type        = string
  description = "Azure项目代码"
}

IaC/deployments/azure/tenant.hcl

locals {
    tenant_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

IaC/deployments/azure/subscription-test-1/subscription.hcl

locals {
    subscription_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

IaC/deployments/azure/subscription-test-1/dev/env.hcl

locals {
  environment = "dev"
}

问题总结

我尝试通过Terraform模块(modules目录)结合模板(project-templates目录)与Terragrunt实现IaC部署,当前目标是在Azure环境下部署包含Key Vault的资源组,但执行terragrunt plan时出现路径错误,请求协助解决。

内容的提问来源于stack exchange,提问作者Leanne Kami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:38:14