Невозможно преобразовать удаленное состояние Terraform в серверной части S3 в локальное состояние с помощью `terraform init -reconfigure`

Я использую Terraform v1.0.0 и создал удаленный бэкэнд с использованием AWS S3 и AWS DynamoDB, как описано в Terraform Up & Running Евгения Брикмана:

  1. Я написал код для корзины S3 и таблицы DynamoDB и создал ресурсы через terraform apply
  2. я добавил terraform { backend "S3" {} } к моему коду
  3. Я создал backend.hcl файл со всеми соответствующими параметрами
  4. Я переместил свое локальное состояние на S3, вызвав terraform init -backend-config=backend.hcl

Теперь я хочу преобразовать удаленное состояние обратно в локальное, чтобы можно было безопасно удалить удаленный сервер. Брикман объясняет, что для этого нужно удалить backend конфигурация и вызвать terraform init. Когда я пробую это, я вижу следующее:

      $ terraform init
Initializing modules...

Initializing the backend...
╷
│ Error: Backend configuration changed
│ 
│ A change in the backend configuration has been detected, which may require migrating existing state.
│ 
│ If you wish to attempt automatic migration of the state, use "terraform init -migrate-state".
│ If you wish to store the current configuration with no changes to the state, use "terraform init -reconfigure".
╵

Я решил, что правильный подход - использовать -reconfigure что на первый взгляд кажется работающим:

      $ terraform init -reconfigure
Initializing modules...

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/random from the dependency lock file
- Reusing previous version of hashicorp/aws from the dependency lock file
- Using previously-installed hashicorp/aws v3.47.0
- Using previously-installed hashicorp/random v3.1.0

Terraform has been successfully initialized!

Однако выполнение terraform plan показывает, что инициализация не удалась:

      $ terraform plan
╷
│ Error: Backend initialization required, please run "terraform init"
│
│ Reason: Unsetting the previously set backend "s3"
│
│ The "backend" is the interface that Terraform uses to store state,
│ perform operations, etc. If this message is showing up, it means that the
│ Terraform configuration you're using is using a custom configuration for
│ the Terraform backend.
│
│ Changes to backend configurations require reinitialization. This allows
│ Terraform to set up the new configuration, copy existing state, etc. Please run
│ "terraform init" with either the "-reconfigure" or "-migrate-state" flags to
│ use the current configuration.
│
│ If the change reason above is incorrect, please verify your configuration
│ hasn't changed and try again. At this point, no changes to your existing
│ configuration or state have been made.
╵

Кажется, единственный способ отключить серверную часть - через terraform init -migrate-state:

      $ terraform init -migrate-state
Initializing modules...

Initializing the backend...
Terraform has detected you're unconfiguring your previously set "s3" backend.
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "s3" backend to the
  newly configured "local" backend. No existing state was found in the newly
  configured "local" backend. Do you want to copy this state to the new "local"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: yes
    
Successfully unset the backend "s3". Terraform will now operate locally.

Невозможно преобразовать состояние через, несмотря на то, что Terraform явно говорит мне об этом? Если да, то что значит terraform init -reconfigure делать именно?

3 ответа

Как сказал MindTooth, командаinit -migrate-stateделает именно то, что вы хотите сделать. Он переносит состояние без изменений, когда настроен другой сервер.

инициализирует новый бэкэнд с чистым пустым состоянием.

Другой способ сделать это — вытащить состояние из бэкенда s3 в файл json. Затем инициализируем пустой локальный сервер с помощьюinit -reconfigureи возвращая состояние обратно.

      terraform state pull > state.json
terraform init -reconfigure
terraform state push state.json

Ниже работа решила эту проблему для меня.

Добавьте ниже и запустите terraform init

terraform{ бэкэнд "локальный" {}}

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

Итак, возвращаясь к вашему вопросу, я бы предположил, -migrate-stateжелательно использовать при переносе состояний между разными бэкендами. Я понимаю из вашей проблемы, что это было так, используя terraform init -migrate-state?

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