Terraform - модули рефакторинга: Ошибка: отсутствует конфигурация провайдера

Я занимаюсь рефакторингом некоторых модулей Terraform и получаю:

Error: Provider configuration not present

To work with
module.my_module.some_resource.resource_name its
original provider configuration at
module.my_module.provider.some_provider.provider_name is required, but it
has been removed. This occurs when a provider configuration is removed while
objects created by that provider still exist in the state. Re-add the provider
configuration to destroy
module.my_module.some_resource.resource_name, after
which you can remove the provider configuration again.

Похоже, мне нужно удалить этот ресурс из файла tfstate, а затем повторно добавить его с новой конфигурацией tf.

Пока я реорганизую какой-то монолитный код, таких Error: Provider configuration not present Сообщения.

Любой ярлык для удаления и повторного добавления?

9 ответов

Как объясняется в сообщении об ошибке, Terraform обнаружил, что в состоянии все еще присутствуют объекты ресурсов, чьи конфигурации провайдера недоступны, и поэтому у него недостаточно информации для уничтожения этих ресурсов.

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

Если вы намерены уничтожить экземпляры ресурсов вmodule.my_module то вы должны сделать это перед удалением module "my_module"блок из корневого модуля. Это одна из необычных ситуаций, когда мы можем использовать-target чтобы помочь Terraform понять, что мы хотим от него:

terraform destroy -target=module.my_module

Как только все эти объекты будут уничтожены, вы сможете удалить module "my_module" блок без отображения ошибки "Конфигурация поставщика отсутствует", потому что в состоянии, зависящем от этой конфигурации поставщика, не будет экземпляров ресурсов.

Если ваша цель - переместить блоки ресурсов в другой модуль, другое возможное решение - использовать terraform mv чтобы указать Terraform отслеживать существующий объект по новому адресу:

terraform mv 'module.my_module.some_resource.resource_name' 'module.other_module.some_resource.resource_name'

Опять же, лучше сделать это перед удалением старого модуля, чтобы старая конфигурация поставщика оставалась в наличии до тех пор, пока ей не осталось ничего, чем можно было бы управлять. После того, как вы переместили существующий объект в новый модуль в состоянии и получилиresource для него в конфигурации, Terraform должен понимать ваше намерение управлять этим ресурсом с помощью другой конфигурации поставщика с этого момента, и вы можете безопасно удалить старый module блок, и, следовательно, provider блок внутри него.

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

После явного-провайдера исток-места для согласования с терраформировать v0.13 вероятно, должен быть правильный путь, но за это время, понижая до v0.12 разрешило его.

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

Удалите провайдера из модуля и пропустите провайдера в модуле явно,

module "pass_provider" {
  source = "../module"
   providers = {
    aws = aws
  }
}

Пропустить провайдера с псевдонимом,

module "pass_provider_alias" {
  source = "../module"

   providers = {
    aws = "aws.alias_name"
  }
}

Первое, что нужно проверить, если вы работаете в команде, - это проверить последнюю версию terraform, использованную для сборки, если ваша версия другая, измените ее и проверьте. Пример такого рода проблемы: https://github.com/hashicorp/terraform/issues/26062

Если вы закомментировали / удалили модуль и видите эту ошибку, то другой вариант - terraform state rmпо сути забыть об этом. Terraform state rm

Вы определенно хотите уничтожить ресурс, terraform destroy -target=module.mymodule но в некоторых случаях ресурс не является физическим, например randomвнутри модуля. Также, если вы используете Terraform Enterprise и рабочее пространство связано с VCS, вы не сможете запустить apply или же destroyлокально. В этих случаях используйте rm а если есть устаревшие ресурсы, просто удалите их вручную.

У меня возникла такая проблема после обновления до 0,13 с 0,12 для ресурса, который я давно удалил. Terraform state rm resourcename устранил для меня проблему.

У меня возникла эта проблема в среде разработки при рефакторинге моего монорепозитория для добавления нескольких сред (staging, prod). Я использовал Terraform Cloud. Я решил эту проблему, уничтожив все, что отслеживал Terraform, выполнив рефакторинг, а затем выполнив новый plan/ applyс нуля. Это не сработает в большинстве ситуаций, но для меня это было самым простым решением, поскольку было перемещено более 100 ресурсов.

В моем случае я переименовал модуль

      module "modules" {
  source            = "../Infrastructure"

 }

К

      module "us-east-2" {
  source            = "../Infrastructure"

 }

Во-первых, удалите ресурс, относящийся к провайдеру, которого вы пытаетесь удалить (и применить). Затем удалите провайдера.

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