DRY-код с terragrunt для развертывания группы ресурсов и хранилища ключей с помощью azure

TL;DR в конце.

Я совершенно новичок в terragrunt, и я пытаюсь использовать его, чтобы воспользоваться функцией DRY (не повторяйтесь), которую он предлагает. Мое дерево показано ниже, я планирую использовать этот репозиторий для aws, gcp и azure, и в этом случае я сосредоточусь только на azure, как только я пойму, как использовать terragrunt, я смогу применить логику для других провайдеры. Мое дерево может быть одной из проблем, поэтому не стесняйтесь, дайте мне знать, если я сделал это неправильно.

Я хотел бы повторно использовать свой код, а не копировать одно и то же снова и снова. Сосредоточившись на Azure, конечная цель здесь — создать только группу ресурсов с хранилищем ключей Azure внутри нее, чтобы иметь возможность понять, как работает использование terragrunt.

Насколько я понимаю, создание tenant.hcl, subcription.hcl и env.hcl позволяет мне не менять это значение в моем коде.

Об остальном я, возможно, забыл некоторые зависимости в соответствии с моими сообщениями об ошибках... Я позиционирую себя в IaC/deployments/subscription-test-1/dev/client-test/ и выполняю «план terragrunt», но затем получаю некоторые сбои со следующими сообщениями об ошибках:

Сообщение об ошибке:

Система не может найти указанный путь. time=2023-03-30T09:26:00+02:00 level=error msg=Невозможно определить базовый код выхода, поэтому Terragrunt завершит работу с кодом ошибки 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 {
  # Automatically load subscription variables
  subscription_vars = read_terragrunt_config(find_in_parent_folders("subscription.hcl"))

  # Automatically load tenant-level variables
  tenant_var = read_terragrunt_config(find_in_parent_folders("tenant.hcl"))

  # Automatically load environment-level variables
  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"
    }
  }
}

#Configure the Azure Resource Management Provider
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
    }
  }
}

#create 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 Subscription Id"
}

variable "azure_tenant_id" {
  type        = string
  description = "Azure Tenant Id"
}

variable "azure_rg_name" {
  type        = string
  description = "Azure Resource Group Name"
}

variable "azure_resource_group_location" {
  default = "west europe"
  description   = "Location of the resource group."
}

variable "azure_env_code" {
  type        = string
  description = "Azure Environment Code"
}

variable "azure_project_code" {
  type        = string
  description = "Azure Project Code"
}

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
    }
  }
}

#create azure resource group
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 Subscription Id"
}

variable "azure_tenant_id" {
  type        = string
  description = "Azure Tenant Id"
}

variable "azure_rg_name" {
  type        = string
  description = "Azure Resource Group Name"
}

variable "azure_resource_group_location" {
  default = "west europe"
  description   = "Location of the resource group."
}

IaC/шаблон-проекта-решение-1/terragrunt.hcl

include {
  path = find_in_parent_folders()
}

IaC/проект-шаблон-решение-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/проект-шаблон-решение-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/проект-шаблон-решение-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/шаблон-проекта-решение-1/variables.tf

variable "azure_subscription_id" {
  type        = string
  description = "Azure Subscription Id"
}

variable "azure_tenant_id" {
  type        = string
  description = "Azure Tenant Id"
}

variable "azure_rg_name" {
  type        = string
  description = "Azure Resource Group Name"
}

variable "azure_resource_group_location" {
  default = "west europe"
  description   = "Location of the resource group."
}

variable "azure_env_code" {
  type        = string
  description = "Azure Environment Code"
}

variable "azure_project_code" {
  type        = string
  description = "Azure Project Code"
}

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"
}

TL; DR: я пытаюсь развернуть архитектуру, смешивающую terraform и terragrunt, используя модули (папка модулей) и «модули вызова» (папка шаблонов проекта). Чтобы сначала развернуть с Azure группу ресурсов с хранилищем ключей Azure внутри нее.

Я пытался загрузить свой код на GitHub, но я впервые использую его, поэтому я мог допустить ошибки. Вы можете найти его здесь, если хотите загрузить его, отредактировать и отправить мне свои обновления. https://github.com/leanne-kami/IaC

Спасибо всем, кто найдет время, чтобы помочь мне :)

Сообщение об ошибке не очень подробное, но я думаю, что у вас есть двойная косая черта в аргументах source и paths: "../../../../..**//**project-templates/azure/project-templat‌​e-solution-1".

Marko E 30.03.2023 16:47

Да, я использовал двойную косую черту в соответствии с официальной документацией terragrunt, в которой указано (Примечание: двойная косая черта (//) в параметре источника является преднамеренной и обязательной. Это часть синтаксиса Terraform Git для источников модулей. Terraform может отображать «Terraform, инициализированный в пустой каталог», но вы можете спокойно его игнорировать.) Означает ли это, что я должен его использовать или нет? Меня смущает ваш комментарий.

Leanne Kami 30.03.2023 17:08

Ну, вы используете git не как источник модуля, а путь к нему. В вашем примере модуль является локальным для того места, откуда он вызывается.

Marko E 30.03.2023 17:40

Я пытался, как вы сказали, безуспешно. Но спасибо, что нашли время, чтобы указать на это.

Leanne Kami 01.04.2023 12:17
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
4
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Друг помог мне решить проблему, выполнив два следующих шага:

  1. Удаление блока зависимостей в IaC/deployments/azure/subscription-test-1/dev/client-test/terragrunt.hcl

  2. Редактирование пути в IaC/project-templates/azure/project-template-solution-1/akv.tf и rg.tf, чтобы каталог понимал фактическое местоположение модуля. папки.

    модуль "рг" { источник ="../..//модули/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 }

Другие вопросы по теме