在Terraform 0.13升级期间出现的错误进行处理
自从v0.13发布以来已经过了一段时间,不经意间比起v0.12升级时发生了更多错误,因此我打算一并总结起来。
升级方法已经在官方网站上总结了。
https://www.terraform.io/upgrade-guides/0-13.html
阅读内容后,它表明提供商的明确指定并不太具破坏性,因此即使出现错误,也会尝试在现场进行修正。但是,当我匆忙地进行更改时,遭到了痛苦的后果。
错误:当前后端配置解码失败。
Error: Failed to decode current backend config
The backend configuration created by the most recent run of "terraform init"
could not be decoded: unsupported attribute "lock_table". The configuration
may have been initialized by an earlier version that used an incompatible
configuration structure. Run "terraform init -reconfigure" to force
re-initialization of the backend.
.terraform/terraform.tfstate:只需要一种选项:
这里提供了tfstate的存储位置信息,也就是backend的信息,但在terraform v0.13中已经废弃了一些属性。
-
- lock_table
-
- skip_get_ec2_platforms
- skip_requesting_account_id
如果删掉这些行,它就能运行。但其实不用特地打开文本编辑器去删掉它们。
$ terraform init -reconfigure
看起来应该没问题了。
错误:无法加载插件。
Error: Could not load plugin
Plugin reinitialization required. Please run "terraform init".
Plugins are external binaries that Terraform uses to access and manipulate
resources. The configuration provided requires plugins which can't be located,
don't satisfy the version constraints, or are otherwise incompatible.
Terraform automatically discovers provider requirements from your
configuration, including providers used in child modules. To see the
requirements and constraints, run "terraform providers".
2 problems:
- Failed to instantiate provider "registry.terraform.io/hashicorp/aws" to
obtain schema: unknown provider "registry.terraform.io/hashicorp/aws"
- Failed to instantiate provider "registry.terraform.io/-/aws" to obtain
schema: unknown provider "registry.terraform.io/-/aws"
由于插件路径已更改,因此在 .terraform/plugins/registry.terraform.io/ 中找不到插件信息。
$ terraform init
只要重新配置一下,就可以安全地完成,但是与重新配置一起做会更加迅速。
错误:无法加载插件(第二次)
$ terraform plan
Error: Could not load plugin
Plugin reinitialization required. Please run "terraform init".
Plugins are external binaries that Terraform uses to access and manipulate
resources. The configuration provided requires plugins which can't be located,
don't satisfy the version constraints, or are otherwise incompatible.
Terraform automatically discovers provider requirements from your
configuration, including providers used in child modules. To see the
requirements and constraints, run "terraform providers".
Failed to instantiate provider "registry.terraform.io/-/aws" to obtain schema:
Unrecognized remote plugin message:
This usually means that the plugin is either invalid or simply
needs to be recompiled to support the latest protocol.
出錯與先前相同,即使插件已經加載,但仍出現相同的錯誤。最終發現,使用了terraform_remote_state,似乎只有當使用的tfstate文件未更新時才會出現錯誤。
解决方法是通过在terraform init -reconfigure命令中重新配置引用资源组。
错误:索引无效
这个问题在这里有详细的描述。
从某种程度上来说,这是提供商的问题。
如果使用v0.13兼容的插件,可能会发现与旧版本插件的规格有些不同。
因此可能会出现一些差异。
这也是这类问题的一种情况。
-
- for_each + state mvで対処する
- tolistで対処する
我会选择其中一种方式来处理。
错误:获取https://example.jp/api/v3/api/v3/repos/example-org/example-repo时出错:404未找到 []
在使用GitHub的提供商时出现了问题。
下面是将GitHub Enterprise托管在EC2上的部分。
- base_url = "https://example.com/api/v3/"
+ base_url = "https://example.com/"
token = data.aws_ssm_parameter.apikey.value
insecure = true
organization = "example-org"
看起来base_url的规范已经更改了。
在使用GitHub Enterprise时,似乎不再需要添加API路径了。
这个也许是v0.13版本的问题,可能是与供应商的版本有关。
错误:状态中的资源实例数据无效
Error: Invalid resource instance data in state
on aws_efs.tf line 1:
1: resource "aws_efs_file_system" "efs" {
Instance aws_efs_file_system.efs data could not be decoded from the
state: unsupported attribute "reference_name".
Error: Invalid resource instance data in state
on aws_efs.tf line 1:
这也是AWS提供商版本的问题。
在新版本中,似乎不支持已输出的属性。
如果经常更新版本的话,可能就不会发生这种事情了,但既然已经发生了,我们就要对其进行处理。
我觉得处理的方法可能会是以下这些,可能还有其他方法。
-
- tfstateを書き換える
- state rm + importを行う
我选择了后者,因为不想做前者。
总结
阅读其他人的总结,我发现很多人经常修改tfstate文件或删除.terraform/文件夹。可能会有少量信息重复,但是我还总结了其他方法。
由于还没有完全结束,所以可能还会有一些内容出现,但如果有的话,我会进行补充。