Terraformをv0.13.5 からv0.15.1へアップグレードしたらいくつかエラーが出たので書き残しておきます。


簡単なWebサイトのインフラをTerraformで管理しております。

長い間メンテナンスを放っておりましたが、様々なLintが多くのアラームを上げておりましたので対処しました。

TL;DR

  • 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にて管理していましたので以下の変更をしました。

.terraform-version
- 0.13.5
+ 0.15.1
main.tf
terraform {
-  required_version = "0.13.5"
+  required_version = "0.15.1"
  backend "s3" {}
}

.terraformを削除してinitを実行します。

init
terraform init -backend-config="key={S3ディレクトリ構成}" -backend-config="profile={AWSプロファイル}"

※ backendファイルに書いて指定する方がスマートかもしれません

planを実行します。

plan
terraform plan -var-file=./variables.tfvars -var "色々必要な値"

実行後の主なお叱りが以下です。

非推奨エラー(Warning)
 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でvarsionの指定するのは非推奨??

listの実行エラー(Error)
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関数が使えない??

エラー修正

Warning: Version constraints inside provider configuration blocks are deprecated

こちらは、0.14以降からlockファイルの導入が推奨されるようです。
planを実行すると.terraform.lock.hclのファイルが生成され、このファイルで管理するようです。
<参考>
Terraform職人再入門2020

main.tfのproviderのversionを削除しました。

provider.tf
provider "aws" {
-  version = "~> 2.81"
  profile = var.profile
  region  = var.region
}

Call to function "list" failed: the "list" function was deprecated ...

エラー内容そのままのとおりですが、list()ではなくtolist([...])を使って下さいとのことです。
<参考>
Updates needed for Terraform 0.15

対象のlist関数を変更しました。

main.tf
- lambda_functions = list(aws_lambda_function.hoge.qualified_arn...)
+ lambda_functions = tolist([aws_lambda_function.hoge.qualified_arn...]) 

Applyの実行

apply
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コマンド実行していなかった。。。