Не удается импортировать существующую группу ресурсов в состояние terraform (‘Конфигурация для импортируемой цели не существует’)

Вопрос или проблема

Все, что я пытаюсь сделать, это создать группу ресурсов Azure, если она не существует. Ниже приведены файлы для справки и ошибка, которую я вижу, могу ли я получить помощь в исправлении ошибки, если это возможно.

Ссылка, которой я руководствуюсь: https://stackoverflow.com/questions/66811054/how-to-create-azurerm-resourcegroup-through-terraform-only-when-it-does-not-exis

main.tf

   data "external" "rg_check" {
    program = ["/bin/bash","./script.sh"]
    query = {
        group_name = var.RG_NAME
    }
}
resource "azurerm_resource_group" "rg_env" {
    count = data.external.rg_check.result.exists == "true" ? 0 : 1
    name = var.RG_NAME
    location = var.LOCATION
    provider = azurerm.org_env
}

script.sh

#!/bin/bash 

eval "$(jq -r '@sh "GROUP_NAME=\(.group_name)"')"
result=$(az group exists -n $GROUP_NAME)

jq -n --arg exists "$result" '{"exists":$exists}'

import.tf

import {
  to = azurerm_resource_group.rg_env
  id = "/subscriptions/sub_id/resourceGroups/testrg"
  provider = azurerm.org_env
}

ошибка в конвейере

data.external.rg_check: Чтение… data.external.rg_check: Чтение завершено через 6s [id=-]

Планирование не удалось. Terraform столкнулся с ошибкой при генерации этого плана.

╷ │ Ошибка: Конфигурация для целевой импорта не существует │ │ Конфигурация для данного импорта azurerm_resource_group.rg_env не существует. Все целевые экземпляры должны иметь связанную конфигурацию для импорта. ╵

##[warning]Не удалось найти строку loc для ключа: TerraformPlanFailed
##[error]Ошибка: TerraformPlanFailed 1

Ответ или решение

Вопрос, с которым вы столкнулись, касается импорта существующей группы ресурсов Azure в состояние Terraform, и ошибка, которую вы наблюдаете, указывает на отсутствие конфигурации для целевого импорта. Давайте разберем вашу ситуацию более подробно и рассмотрим, как можно устранить эту проблему.

Понимание ошибки

Сообщение об ошибке Configuration for import target does not exist говорит о том, что Terraform не может найти конфигурацию для ресурса, который вы пытаетесь импортировать. В вашем случае вы пытаетесь импортировать ресурс группы ресурсов Azure, но конфигурация для этого ресурса не была правильно определена в ваших файлах .tf.

Обзор вашего кода

  1. Файл main.tf:
    Вы используете внешний ресурс для проверки существования группы ресурсов. Если группа не существует, Terraform создаст новый ресурс, однако данный ресурс зафиксирован с помощью count, что может быть проблематичным для импорта.

    data "external" "rg_check" {
        program = ["/bin/bash","./script.sh"]
        query = {
            group_name = var.RG_NAME
        }
    }
    
    resource "azurerm_resource_group" "rg_env" {
        count = data.external.rg_check.result.exists == "true" ? 0 : 1
        name = var.RG_NAME
        location = var.LOCATION
        provider = azurerm.org_env
    }
  2. Файл import.tf:
    В данном файле вы указываете конфигурацию для импорта:

    import {
      to = azurerm_resource_group.rg_env
      id = "/subscriptions/sub_id/resourceGroups/testrg"
      provider = azurerm.org_env
    }

Решение проблемы

Основная проблема заключается в том, что использование count в вашем ресурсе azurerm_resource_group и последующее объявление ресурса в блоке import создает конфликт. Когда ресурс имеет count = 0, Terraform не считывает его конфигурацию, и это вызывает ошибку при импорте.

Шаги по устранению ошибки

  1. Уберите count из определения ресурса:
    Вместо использования count, вы можете использовать условие для создания существующего ресурса. Например, вы можете убрать count, и добавлять ресурс только если он не существует, используя lifecycle:

    resource "azurerm_resource_group" "rg_env" {
        name     = var.RG_NAME
        location = var.LOCATION
        provider = azurerm.org_env
    
        lifecycle {
            prevent_destroy = true
        }
    }
  2. Сделайте импорт до применения конфигурации:
    При импорте группы ресурсов убедитесь, что у вас есть правильная конфигурация, которая уже описывается в main.tf. Сначала выполните импорт, а затем сделайте terraform apply.

    terraform import azurerm_resource_group.rg_env "/subscriptions/sub_id/resourceGroups/testrg"
  3. Проверка:
    После импорта убедитесь, что ваши переменные var.RG_NAME и var.LOCATION точно совпадают с существующей группой ресурсов, чтобы избежать конфликтов в будущем.

Заключение

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

Для дальнейшего изучения и установки Terraform, вы можете ознакомиться с официальной документацией, что поможет вам углубить ваши знания о работе с Azure и Terraform.

Оцените материал
Добавить комментарий

Капча загружается...