Для уничтожения terraform необходим оригинальный код terraform?

Нужен ли 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 и запускает команду уничтожения. это работает большую часть времени, но иногда жалуется на провайдеров.

Правильно ли я понимаю, что вы запускаете уничтожение с конфигурацией, которая не представлена ​​в вашем файле состояния, вместо того, чтобы запускать инициализацию с новой конфигурацией, а затем планировать или применять, чтобы увидеть, какие старые ресурсы будут уничтожены, а какие новые? будет создан?

Len Jaffe 02.07.2024 06:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Короткий ответ – да. Команды 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 и терраформировать уничтожение, как обычно.

Написание «побочный продукт» или «побочный продукт» с yen.wikipedia.org/wiki/By-product

Mark B 01.07.2024 13:32

Очки фарма @MarkB, да? 😂 хотя ты прав 😉 обновлёно

Patrik Šimunič 03.07.2024 14:55

За комментарии на этом сайте баллы не начисляются. Так что нет, я не «фармлю очки».

Mark B 03.07.2024 14:56

Использование только внутренней конфигурации не будет работать, если у вас либо нет экземпляров ресурсов, отслеживаемых в состоянии (в этом случае уничтожение будет бессмысленным), либо все используемые вами поставщики не могут получить необходимую информацию о конфигурации из внешних источников, таких как переменные среды. (Отказ от ответственности: я, по-видимому, умный на этом форуме, поэтому я написал первый ответ, который, по моему мнению, является более полным и не противоречит последнему.)

Martin Atkins 04.07.2024 00:19

спасибо @PatrikŠimunič, Ваш ответ и предоставленная вами ссылка помогли мне найти то, чего мне не хватало. у меня был один модуль, в котором был определен отдельный провайдер, это тот, который жаловался на провайдера. Поэтому я удалил эту конфигурацию провайдера. Интересно, каковы недостатки отсутствия определения поставщиков отдельно? На данный момент я определил поставщиков только один раз в основном коде. И это работает для меня именно так, как я хотел.

imit 05.07.2024 12:39

Вы можете сначала запустить terraform apply, чтобы terraform отразил изменения вашего кода в файле состояния. А затем запустите terraform destroy, чтобы удалить все ваши ресурсы.

Спасибо за это, это то, что я делал, когда у меня были проблемы при использовании общего уничтожения... но теперь у меня это работает так, как я хотел. Я объяснил, что я сделал, в другом комментарии.

imit 05.07.2024 12:41

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