🛠️

Terraform 1.6.0 のリリースを読んでみた

2023/10/10に公開

こんにちは。クラウドエースの阿部です。
この記事では、2023年10月5日にリリースされた Terraform 1.6.0 の変更点についてざっくり説明します。

概要

2023年10月5日に Terraform 1.6.0 の GA 版がリリースされました。 v1.6.0 の alpha 版は2023年7月20日にリリースされており、GAまで約2ヶ月半ほどかかっています。
最近のマイナーバージョンアップは alpha/beta 版が出てから GA 版になるまで比較的早い印象でしたが、 v1.6.0 はかなり慎重に開発されていると思います。

リリース情報をベースに、 v1.6.0 でどのような点が変更されたかについて説明します。

主な変更点

v1.6.0 の変更点は以下の通りです。

  • ソフトウェアライセンスを MPL2.0 から BSL 1.1 に変更した
  • macOS のサポートを 10.15 Catalina 以降に変更した
  • Windows のサポートを Windows 10 または Windows Server 2016 以降に変更した
  • S3 バックエンドの設定内容を大幅に変更した
  • terraform test コマンドを正式実装した
  • import ブロックの id フィールドで変数を限定的に使用可能にした
  • Terraform Cloud/Enterprise で、 -out オプションを使った plan 結果の保存、 show で参照可能にした
  • apply 時までコレクションの長さや値が null になる可能性があるかについて追跡可能にした
  • 互換性のある Provider のスキーマ情報をメモリ上で共有可能し、メモリ使用率を減少させた
  • try 関数と can 関数は不明な引数に直面しても一貫した結果を返すようにした
  • terraform show -json で、計画に失敗した情報である errored を表示できるようになった
  • Terraform 本体が Provider から受け取るスキーマ情報から不要な分をスキップするようになった
  • Kubernetes バックエンドは、State サイズ 1 MiB 制限が撤廃された
  • COS バックエンドはカスタムエンドポイントとドメインをサポートした

この他にも細かなバグフィックス等があります。

個人的に気になった変更点

私は主に Google Cloud を扱うエンジニアであり、 Terraform OSS 版のみを使っているため Terraform Cloud や Terraform Enterprise も使用していません。そのため、本当に個人的に気になった変更点をピックアップしたいと思います。
(例えば S3 バックエンドは大幅に変更されているように見えますが、普段まったく使っていないため説明が難しいです。)

ソフトウェアライセンスを MPL2.0 から BSL 1.1 に変更した

2023年8月10日、Terraform を開発する Hashicorp はある重大な発表をしました。それは、Hashicorp が開発する OSS のライセンスを、 MPL2.0 から BSL1.1 に変更することでした。このライセンス変更は様々な物議を醸すことになりました。(ここではその物議の内容は割愛します。)

https://www.hashicorp.com/blog/hashicorp-adopts-business-source-license
https://www.hashicorp.com/blog/hashicorp-updates-licensing-faq-based-on-community-questions

Terraform 1.6.0 より、ライセンスが BSL1.1 に変更されました。
そのため、 Terraform 1.6.0 以降を使用する場合は、念のためライセンス変更の FAQ 内容を確認しておくとよいでしょう。
通常の利用範囲(Terraform を使ってクラウドリソースを作成・変更・削除する等)であれば特に問題はありません。(と、FAQに書いてあります。)

macOS と Windows のサポート対象を変更した

こちらはまとめて説明しますが、Terraform がサポートする macOS と Windows のバージョンを変更しました。

  • macOS のサポートを 10.15 Catalina 以降に変更した
  • Windows のサポートを Windows 10 または Windows Server 2016 以降に変更した

macOS 10.14 Mojave のサポートは 2023年12月31日までなので、古い端末を使われている方は注意かと思います。
Windows 8.1 は2023年1月10日で、Windows Server 2012 は2023年10月10日に延長サポート終了しているため、流石に使っている人は少ないかと思いますが……

terraform test コマンドを正式実装した

このコマンドの実装が今回のバージョンの目玉機能だと思います。
Terraform は非常に便利なコマンドですが、それ自体に単体テスト(apply 実行テスト)の機能がないため Terratest や InSpec といった別のテストツールが必要でした。
terraform test は、 .tftest.hcl の拡張子をもつファイルにテストコードを記述することで、単体テストを実行することができます。
この機能については、深掘り調査して記事を書いてみようと思っています。

import ブロックの id フィールドで変数を限定的に使用可能にした

Terraform 1.5 から、 tfファイルに import ブロックを記述することでインポートを実行することが可能になっています。
ただ、 1.5 の時点では、 import ブロックの id フィールドにはリテラル(固定文字列)しか記述できず、 local 変数は指定できませんでした。
Terraform 1.6 では、 plan 時に id フィールドのパラメータが確定できる場合、変数を使用することが可能になっています。
この機能も、調査して記事を書いてみたいなと思っています。

互換性のある Provider のスキーマ情報をメモリ上で共有可能し、メモリ使用率を減少させた

リリース記事を読んだだけだと理解が難しいなと感じましたが、例えば以下のように同じ Provider だが、 alias で別の Provider 扱いにしたいときに、内部スキーマは同じであるため一部の情報を共通化して節約したのではないかと思います。(間違いがあるかも知れない……)

data "google_service_account_access_token" "default" {
  provider               = google
  target_service_account = "impersonated@your-project-id.iam.gserviceaccount.com"
  scopes                 = ["userinfo-email", "cloud-platform"]
  lifetime               = "300s"
}

provider "google" {
  project = "Your Project ID"
}

provider "google" {
  alias        = "impersonated"
  access_token = data.google_service_account_access_token.default.access_token
}

resource "google_hogehoge" {
  provider = google.impersonated
  ...
}

terraform show -json で、計画に失敗した情報である errored を表示できるようになった

terraform show -json は、 terraform plan-out オプション付けた際に出力される実行計画ファイルを参照するときに使用するコマンドです。 plan に失敗した際に、何故失敗したかをプログラム的に判定したり、エラーになった部分だけ取り出したい時に便利…… なのかも知れません

まとめ

リリース情報を一読して変更点を洗ってみました。
terraform test は実業務でも使える可能性を秘めており、alpha 版のときに少し触っただけで終わっているので、 GA 版になったこともあり本格的に使ってみたい機能です。
また、 import ブロックも改善されたため、このあたりもチェックしていきたいと思いました。

参考情報

https://github.com/hashicorp/terraform/releases/tag/v1.6.0

Discussion