スマートキャンプでエンジニアをしている笹原です。
Terraform v0.12がリリースされて数ヶ月経ちましたがみなさんはもう使ってますか?
なかなか使えてなかったのですが、ブログ当番になったのをいい機会にアップグレードしてみました!
今回は、アップグレードの手順を紹介したいと思います!!
アップグレード前の準備
アップグレード手順を確認する
Terraform v0.12へのアップグレードは公式のアップグレードガイドに沿ってやっていきます。
アップグレード作業を始める前に一通り目を通しておきましょう!
Upgrading to Terraform 0.12 - Terraform by HashiCorp
tfenvをインストールする
tfenvとは、rbenvのようなTerraformのバージョンを管理するツールです。
GitHub - tfutils/tfenv: Terraform version manager
複数環境でそれぞれ別のTerraformのバージョンを使う際に便利です。
アップグレード作業を途中で止めることもあり得るので、利用しておいて損はないです。
Terraform v0.11.14でアップグレード前チェックを走らせる
v0.11.14には0.12checklist
というコマンドが追加されており、v0.12にアップグレードする前に必要な作業を確認することができます。
まずv0.11.14を利用できるようにしましょう。
$ tfenv install 0.11.14 $ terraform -v Terraform v0.11.14
続いて、必要なプラグインがダウンロードされていることや、tfstateファイルが実インフラ環境を反映していることを確認します。
$ terraform init $ terraform apply
そして、アップグレード前チェックを走らせます。
$ terraform 0.12checklist
このチェックによって確認されるのは以下のことです。
- アップグレードしておくべきProviderがないか
- 命名を変更すべきリソースやプロバイダーのエイリアスがないか
- アップグレードしておくべき外部モジュールがないか
アップグレード前チェックの対応をする
私の環境では以下のようなメッセージが出力されました。
$ terraform 0.12checklist After analyzing this configuration and working directory, we have identified some necessary steps that we recommend you take before upgrading to Terraform v0.12: - [ ] Upgrade provider "aws" to version 2.24.0 or newer. No currently-installed version is compatible with Terraform 0.12. To upgrade, set the version constraint for this provider as follows and then run `terraform init`: version = "~> 2.24.0"
確認項目の1つ目、アップグレードすべきプロバイダーの指摘が入りました。
該当のProviderを利用している箇所でバージョンを最新にします。
provider "aws" { version = "~> 2.24.0" region = "${local.aws_region}" }
変更したら再度、0.12checklistコマンドを走らせましょう!
$ terraform init $ terraform apply $ terraform 0.12checklist Looks good! We did not detect any problems that ought to be addressed before upgrading to Terraform v0.12. This tool is not perfect though, so please check the v0.12 upgrade guide for additional guidance, and for next steps: https://www.terraform.io/upgrade-guides/0-12.html
これでアップグレード前の準備が終わりました!
Terraform v0.12へのアップグレード
Terraform v0.12をインストールする
まず、Terraform v0.12を利用できるようにしましょう。
$ tfenv install 0.12.6 $ terraform -v Terraform v0.12.6
バージョンを上げてからもinitを再度実行します。
$ terraform init
ここで、Terraform v0.12と互換性のないシンタックスで書かれているところがあれば、それを知らせるメッセージが表示されるようなのですが、私の環境では表示されませんでした。
ただ、表示されてないからと言って、アップグレード作業が完了したわけではないので、引き続き進めていきましょう。
コードを修正する
Terraform v0.12のシンタックスにするコマンドがv0.12には追加されているので、まず、これを使用します。
$ terraform 0.12upgrade
正常に完了すると以下のメッセージが表示されます。
Upgrade complete! The configuration files were upgraded successfully. Use your version control system to review the proposed changes, make any necessary adjustments, and then commit.
この作業は静的に現在のディレクトリ上のコードのみを変更するようで、
同一プロジェクト内にモジュールとして、別のディレクトリにもコードがある場合には、そちらについても別途実行する必要があります。
$ terraform 0.12upgrade modules/iam/group $ terraform 0.12upgrade modules/iam/role
また、これで完了ではなく、自動でアップグレードされない部分もあり、そういった部分にはTF-UPGRADE-TODO
として、コメントがコード上にされています。
私の環境では以下のようなメッセージが有りました。
data "aws_iam_policy_document" "developers_policy" { statement { actions = ["sts:AssumeRole"] # TF-UPGRADE-TODO: In Terraform v0.10 and earlier, it was sometimes necessary to # force an interpolation expression to be interpreted as a list by wrapping it # in an extra set of list brackets. That form was supported for compatibilty in # v0.11, but is no longer supported in Terraform v0.12. # # If the expression in the following list itself returns a list, remove the # brackets to avoid interpretation as a list of lists. If the expression # returns a single list item then leave it as-is and remove this TODO comment. resources = [developer.role.arn] } }
v0.10以前では、単一の変数を返したい場合でもリストにしないと変数として解釈されない部分があり、v0.11でもその記法をサポートしていたが、v0.12からサポートしなくなったということです。
リストを返したいのか単一の変数を返したいのかで対応が変わるため、TF-UPGRADE-TODO
となっているようです。
今回の場合は、リストを返したいので、コードはそのままでコメントを削除しました。
ここまで行うとterraform plan
でエラーがでなくなりました。
アップグレードの効用
終わりに
今回はTerraform v0.12へのアップグレード作業を紹介しました。
新しい機能についての紹介はしませんでしたが、First-class expressionsなどはスッキリ書くことができるし、他にもv0.12で追加された機能により、運用が楽になることが多々あります。
そういった運用が楽になる箇所については、またの機会に書きたいと思います!