#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
начали появляться ошибки.
Что решило это для меня (без необходимости обновления поставщика):
-
Выполнить
terraform 0.13upgrade
— это создастversions.tf
ограничения с версией поставщика в новом формате, т.е.:terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 1.44" } } required_version = ">= 0.13" }
-
Теперь измените
source = "hashicorp/azurerm"
наsource = "-/azurerm"
. Это должно заставить terraform использовать старую версию поставщика.
Для поставщика AWS у вас должно быть что-то очень похожее, с другим именем и версией поставщика.