Как исправить неподдерживаемый Terraform атрибут «ses_smtp_password» после обновления до 0.13?

#terraform #terraform-provider-aws

#terraform #terraform-provider-aws

Вопрос:

После обновления я получал сообщения, подобные следующим, при запуске terraform plan :

 Error: Invalid resource instance data in state

  on iam_server_backup.tf line 4:
   4: resource "aws_iam_access_key" "backup" {

Instance aws_iam_access_key.backup data could not be decoded from
the state: unsupported attribute "ses_smtp_password".
  

Я исправил это, удалив состояние ( terraform state rm aws_iam_access_key.backup ). Однако при запуске были созданы новые ключи доступа terraform apply , что отнимало много времени, потому что мне пришлось изменить все мои ключи доступа во всех моих приложениях. Есть ли лучший способ устранить эту проблему?

Комментарии:

1. Вы использовали / указывали ses_smtp_password где-нибудь?

2. Нет, этого нигде не было в моей конфигурации.

Ответ №1:

Я столкнулся с такой же unsupported attribute "ses_smtp_password" проблемой, когда обновлял своего поставщика aws terraform, и смог исправить это, вручную загрузив и изменив состояние.

 terraform state pull > state.json
  

теперь отредактируйте state.json и

  • удалите любую строку с ses_smtp_password
  • увеличьте serial атрибут (например, "serial": 21, -> "serial": 22, )
  • Сохранить
 terraform state push state.json
terraform plan # should work again
  

необязательно, но делает это так, чтобы вы не могли случайно зафиксировать свой файл состояния

 rm state.json 
  

Комментарии:

1. Вы можете избежать необходимости передавать свое состояние после каждого изменения, изменив местоположение сохранения состояний на локальное (обычно просто закомментируйте backend{} блок) — Запустив terraform init -migrate-state перенос удаленного состояния в локальный файл .tfstate — Создайте резервную копию результирующего файла .tfstate на всякий случай — Отредактируйте файл .tfstate по мере необходимости, пока ваше состояние не будет исправлено — Отмените все изменения местоположения сохранения состояния кода — Запустив terraform init -migrate-state перенос локального состояния обратно в удаленный

Ответ №2:

Я тоже только что столкнулся с этой проблемой и хотел предоставить решение, которое не требует манипулирования состояниями.

Решение этой проблемы заключается в обновлении поставщика AWS до ~> 3.0 перед обновлением до terraform 0.13. Это привело к тому, что ses_smtp_password поле было удалено из состояния, которое затем позволило выполнить обновление до terraform 0.13 без проблем.

К сожалению, я не понимаю, как это работает, и предполагаю, что в TF 0.13 есть изменение, которое вызывает исключение из-за удаления устаревшего свойства, поскольку TF 0.12 использовал ту же версию поставщика, что и 0.13.

Ответ №3:

Эта ошибка не связана с вашим обновлением до Terraform 0.13, на самом деле это связано с обновлением с версии 2.x поставщика AWS Terraform до версии 3.x. Как указано в руководстве по обновлению AWS Terraform provider 3.0, вам необходимо переключиться с использования ses_smtp_password на ses_smtp_password_v4 .

Причина этого изменения в том, что SES перестанет принимать более старый тип пароля в октябре 2020 года, поэтому до этого вам необходимо перейти на пароль, который использует подписи версии 4.

Как вы видели, вам нужно удалить старые пароли из вашего состояния Terraform и позволить Terraform генерировать новые ses_smtp_password_v4 пароли.

Комментарии:

1. Github просит удалить атрибут: github.com/terraform-providers/terraform-provider-aws/pull /…

2. @mark-b, я должен был упомянуть об этом, но я никогда не создавал ses_smtp_password, по крайней мере, о котором я знал.

Ответ №4:

У меня была такая же проблема с azurerm провайдером. Он был привязан к версии ~> 1.44 , и внезапно после обновления до terraform 0.13 unsupported attribute начали появляться ошибки.

Что решило это для меня (без необходимости обновления поставщика):

  1. Выполнить terraform 0.13upgrade — это создаст versions.tf ограничения с версией поставщика в новом формате, т.е.:

     terraform {
        required_providers {
            azurerm = {
                source = "hashicorp/azurerm"
                version = "~> 1.44"
            }
        }
        required_version = ">= 0.13"
    }
      
  2. Теперь измените source = "hashicorp/azurerm" на source = "-/azurerm" . Это должно заставить terraform использовать старую версию поставщика.

Для поставщика AWS у вас должно быть что-то очень похожее, с другим именем и версией поставщика.