我升级了Terraform从v0.13.5到v0.15.1,并遇到了一些错误,所以我将其记录下来
我們正在使用Terraform管理一個簡單的網站基礎架構。
长时间未进行维护,但由于各种不同的Lint警报频繁出现,因此我们进行了处理。
简而言之
-
- Terraform v0.13.5 -> v0.15.1にアップグレードしました。
-
- 実行手順
バージョン確認
バージョン変更
initの実行
planの実行
エラー修正
applyの実行
エラー内容
Warning: Version constraints inside provider configuration blocks are deprecated
Call to function “list” failed
组成

目录结构
├── component
│ └── AWS_StaticWeb_directory # リソースのディレクトリ
│ ├── functions # ちょっとしたJavascriptファイル(今回の内容には全く関係ない)
│ │ ├── hoge_directory
│ │ │ ├── node_modules
│ │ │ ├── package-lock.json
│ │ │ ├── package.json
│ │ │ └── hoge.js
│ ├── lambda_edge.tf
│ ├── main.tf # リソースのメイン
│ ├── provider.tf
│ └── variables.tf
└── environment_directory # このディレクトリで実行
│ ├── .terraform
│ ├── backend.tfbackend
│ ├── main.tf # メイン
│ ├── variables.tf
│ └── variables.tfvars
└── .terraform-version # ここでバージョンを管理
执行步骤
版本确认
% terraform --version
Terraform v0.13.5
+ provider registry.terraform.io/hashicorp/archive v2.1.0
+ provider registry.terraform.io/hashicorp/aws v2.81.0
Your version of Terraform is out of date! The latest version
is 0.15.1. You can update by downloading from https://www.terraform.io/downloads.html
版本更改
因为在这次更新中,我对 .terraform-version 和 main.tf 进行了管理,所以进行了以下改动。
- 0.13.5
+ 0.15.1
terraform {
- required_version = "0.13.5"
+ required_version = "0.15.1"
backend "s3" {}
}
删除 .terraform 文件夹并执行 init 命令。
terraform init -backend-config="key={S3ディレクトリ構成}" -backend-config="profile={AWSプロファイル}"
也许将其写在后端文件中会更加聪明。
我們將執行計劃。
terraform plan -var-file=./variables.tfvars -var "色々必要な値"
以下是主要的批评内容。
Warning: Version constraints inside provider configuration blocks are deprecated
│
│ on ../component/AWS_StaticWeb_directory/provider.tf line 31, in provider "aws":
│ 2: version = "~> 2.81"
│
│ Terraform 0.13 and earlier allowed provider version constraints inside the provider configuration block, but that is now deprecated and will be removed in a future version of
│ Terraform. To silence this warning, move the provider version constraint into the required_providers block.
在provider.tf中指定version是不推荐的吗?
Error: Error in function call
│
│ on ../component/AWS_StaticWeb_directory/main.tf line 21, in locals:
│ 15: lambda_functions = list(aws_lambda_function.hoge.qualified_arn...)
│ ├────────────────
│ │ aws_lambda_function.hoge.qualified_arn will be known only after apply
│
│ Call to function "list" failed: the "list" function was deprecated in Terraform v0.12 and is no longer available; use tolist([ ... ]) syntax to write a literal list.
╵
list 函数不能用?
错误修正
警告:部署配置块内的版本限制已被弃用。
根据最新的建议,从0.14版开始,引入了lock文件的使用。执行计划将生成.terraform.lock.hcl文件,建议使用此文件进行管理。
<参考>
2020年《Terraform職人再入門》
已删除 main.tf 文件中的 provider 版本。
provider "aws" {
- version = "~> 2.81"
profile = var.profile
region = var.region
}
调用函数”list”失败:”list”函数已过时…
请使用tolist([…])来代替list(),错误的内容就是这样的。
<参考>
需要针对Terraform 0.15进行更新。
我修改了目标列表函数。
- lambda_functions = list(aws_lambda_function.hoge.qualified_arn...)
+ lambda_functions = tolist([aws_lambda_function.hoge.qualified_arn...])
申请执行
terraform apply -var-file=./variables.tfvars -var "色々必要な値"
% terraform --version
Terraform v0.15.1
on darwin_amd64
+ provider registry.terraform.io/hashicorp/archive v2.1.0
+ provider registry.terraform.io/hashicorp/aws v3.38.0
一切不出問題,我們成功了。
同時,已經順利將存儲在S3存儲桶中的tfstate檔案更新為0.15.1版本。
順便一提,我們也更新了.terraform.lock.hcl,並且提升了AWS provider版本。
最后
我之前忽略了维护工作,但终于能够进行更新了。它也能够准确地指出错误内容,让我再次深刻体会到了Terraform的管理优势。
顺便说一下,我忘了执行`terraform fmt -recursive`命令了。。。