簡単な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にて管理していましたので以下の変更をしました。
- 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プロファイル}"
※ backendファイルに書いて指定する方がスマートかもしれません
planを実行します。
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でvarsionの指定するのは非推奨??
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 "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関数を変更しました。
- lambda_functions = list(aws_lambda_function.hoge.qualified_arn...)
+ lambda_functions = tolist([aws_lambda_function.hoge.qualified_arn...])
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コマンド実行していなかった。。。