Нужен ли terraform исходный код для запуска terraform Destroy?
Я развертываю aws terraform в новых учетных записях aws для каждого клиента. Мой терраформ постоянно развивается, и кажется, что когда я хочу разрушить, мне нужен исходный код терраформа для уничтожения?
Я надеялся, что если у меня есть доступ к состоянию бэкэнда s3, то, указав на этот бэкэнд и запустив terraform Destroy (из любого места, без исходного terraform, просто имея двоичный файл terragform), он должен уничтожить все. Кажется, это работает большую часть времени. Но для одной из моих инфраструктур я получаю эту ошибку:
Error: Provider configuration not present
│
│ To work with module.s3Module.aws_s3_bucket.this (orphan) its original
│ provider configuration at
│ module.s3Module.provider["registry.terraform.io/hashicorp/aws"] 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.s3Module.aws_s3_bucket.this (orphan), after which you can remove the
│ provider configuration again
Я могу успешно уничтожить инфраструктуру, если запущу уничтожение, используя исходный код terraform, но я думаю, что это должна быть обычная проблема. Хотя мой код версионирован, и я могу запустить уничтожение, используя исходную версию, я считаю, что это должно быть более удобно, чем это. Что мне не хватает?
Есть ли способ обойти эту проблему?
Допустим, я развернул версию кода terraform v1.0, но мой последний код — версия v3.0, и я хочу запустить уничтожение, которое не зависит от этих версий. Я создал конвейер gitlab, который указывает на необходимый бэкэнд s3 и запускает команду уничтожения. это работает большую часть времени, но иногда жалуется на провайдеров.
Короткий ответ – да. Команды Terraform выполняются с кодом Terraform, а не с файлами состояния. В файлах состояния отмечается нечто большее, чем «побочный продукт», используемый для отслеживания последней примененной конфигурации.
Длинный ответ – вероятно, не обязательно. Хотя у меня нет опыта решения ваших конкретных задач (хотя мне приходилось вручную обновлять файлы состояния более одного раза), быстрый поиск в Google привел меня к следующему ответу: https://discuss.hashicorp.com/t/destroying-resources-with-state-file-only/31833/3
В приведенном выше сообщении на форуме упомянуты два разных подхода. Лично я, вероятно, был бы более склонен использовать упомянутый второй подход: просто создать пустой main.tf
файл, настроенный для использования вашего бэкэнда (где находится ваш файл состояния), и запустить команду уничтожения для этой пустой конфигурации TF.
Цитируя упомянутый пост:
Чтобы упростить задачу для дальнейшего использования. Просто создайте терраформирование конфигурация с локальным сервером, указывающим на этот файл состояния. Например.
В main.tf:
terraform { backend "local" { path = "your_statefile_here.json" } }
Надеюсь, тогда вы сможете терраформировать init и терраформировать уничтожение, как обычно.
Написание «побочный продукт» или «побочный продукт» с y
en.wikipedia.org/wiki/By-product
Очки фарма @MarkB, да? 😂 хотя ты прав 😉 обновлёно
За комментарии на этом сайте баллы не начисляются. Так что нет, я не «фармлю очки».
Использование только внутренней конфигурации не будет работать, если у вас либо нет экземпляров ресурсов, отслеживаемых в состоянии (в этом случае уничтожение будет бессмысленным), либо все используемые вами поставщики не могут получить необходимую информацию о конфигурации из внешних источников, таких как переменные среды. (Отказ от ответственности: я, по-видимому, умный на этом форуме, поэтому я написал первый ответ, который, по моему мнению, является более полным и не противоречит последнему.)
спасибо @PatrikŠimunič, Ваш ответ и предоставленная вами ссылка помогли мне найти то, чего мне не хватало. у меня был один модуль, в котором был определен отдельный провайдер, это тот, который жаловался на провайдера. Поэтому я удалил эту конфигурацию провайдера. Интересно, каковы недостатки отсутствия определения поставщиков отдельно? На данный момент я определил поставщиков только один раз в основном коде. И это работает для меня именно так, как я хотел.
Вы можете сначала запустить terraform apply
, чтобы terraform отразил изменения вашего кода в файле состояния. А затем запустите terraform destroy
, чтобы удалить все ваши ресурсы.
Спасибо за это, это то, что я делал, когда у меня были проблемы при использовании общего уничтожения... но теперь у меня это работает так, как я хотел. Я объяснил, что я сделал, в другом комментарии.
Правильно ли я понимаю, что вы запускаете уничтожение с конфигурацией, которая не представлена в вашем файле состояния, вместо того, чтобы запускать инициализацию с новой конфигурацией, а затем планировать или применять, чтобы увидеть, какие старые ресурсы будут уничтожены, а какие новые? будет создан?