SMARTCAMP Engineer Blog

スマートキャンプ株式会社(SMARTCAMP Co., Ltd.)のエンジニアブログです。業務で取り入れた新しい技術や試行錯誤を知見として共有していきます。

Terraform v0.12にアップグレードしてみたよ

スマートキャンプでエンジニアをしている笹原です。

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で追加された機能により、運用が楽になることが多々あります。

そういった運用が楽になる箇所については、またの機会に書きたいと思います!