升级后,运行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
时创建了新的访问密钥,这非常耗时,因为我必须更改所有应用程序中的所有访问密钥。有解决此问题的更好方法吗?
答案 0 :(得分:3)
更新我的aws terraform提供程序时遇到了同样的unsupported attribute "ses_smtp_password"
问题,并且能够通过手动下载和修改状态来修复它。
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 :(得分:1)
此错误与您升级到Terraform 0.13无关,实际上是由于从AWS Terraform提供程序的2.x版本升级到了3.x版本。如the AWS Terraform provider 3.0 upgrade guide中所述,您需要从使用ses_smtp_password
切换到ses_smtp_password_v4
。
进行此更改的原因是,SES将在2020年10月停止接受旧类型的密码,因此您必须在此之前升级到使用版本4签名的密码。
如您所见,您需要从Terraform状态中删除旧密码,并让Terraform生成新的ses_smtp_password_v4
密码。
答案 2 :(得分:1)
我也正好面对这个问题,并想提供一种不需要将状态混为一谈的解决方案。
解决方案是在升级到terraform 0.13之前将AWS提供程序升级到〜> 3.0。这导致将ses_smtp_password
字段从状态中删除,然后可以毫无问题地升级到Terraform 0.13。
不幸的是,我不知道它是如何工作的,我猜测TF 0.13发生了变化,因为TF 0.12使用的是与0.13使用的提供程序相同的版本,所以导致删除不推荐使用的属性存在异常。
答案 3 :(得分:1)
我与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提供程序,您应该具有非常相似的内容,但提供程序的名称和版本不同。