我升级了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

组成

スクリーンショット 2021-05-05 1.00.19.png

目录结构

├── 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`命令了。。。

广告
将在 10 秒后关闭
bannerAds