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"
}
Во-первых, удалите ресурс, относящийся к провайдеру, которого вы пытаетесь удалить (и применить). Затем удалите провайдера.