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 

# 構成
(特に意味はないですが、簡単な構成図を作って見ました)
![スクリーンショット 2021-05-05 1.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668866/e2b25fd8-40db-2434-06cd-196281bf4f5a.png)



##  ディレクトリ構成



```shell:ディレクトリ構成
├── 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 # ここでバージョンを管理
```

# 実行手順
## バージョン確認
```shell:バージョン確認
% 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にて管理していましたので以下の変更をしました。

```yaml:.terraform-version
- 0.13.5
+ 0.15.1
```

```yaml:main.tf
terraform {
-  required_version = "0.13.5"
+  required_version = "0.15.1"
  backend "s3" {}
}
```

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

```shell:init
terraform init -backend-config="key={S3ディレクトリ構成}" -backend-config="profile={AWSプロファイル}"
```
※ backendファイルに書いて指定する方がスマートかもしれません

planを実行します。

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

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

```shell:非推奨エラー(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の指定するのは非推奨？？

```shell: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](https://qiita.com/minamijoyo/items/3a7467f70d145ac03324#terraformlockhcl)

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

```yaml: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](https://github.com/terraform-aws-modules/terraform-aws-eks/issues/1240)

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

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

## Applyの実行
```shell:apply
terraform apply -var-file=./variables.tfvars -var "色々必要な値" 
```

``` shell:バージョン確認
% 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もあげちゃっております。


# 最後に
メンテナンスをおろそかにしていましたが、やっと更新することができました:relaxed:
エラー内容も的確に指摘してくれますし、Terraformでの管理の良さを改めて実感しました。

そういえば、terraform fmt -recursiveコマンド実行していなかった。。。