こんにちは、クラウドエース 第一開発部の阿部です。
この記事では、2025 年 5 月 14 日にリリースされた Terraform 1.12.0 の変更点についてざっくり説明します。
また、 2025 年 5 月 21 日にリリースされた Terraform 1.12.1 の変更点についても紹介します。
Terraform 1.12 のアップグレードに関する注意事項
アップグレードガイドにおいて、Terraform 1.11 から 1.12 にアップグレードする際の注意事項は特にありませんでした。
ただし、後述しますが Linux 環境においてサポートされる Linux カーネルバージョンが 3.2 以降に変更されました。
Terraform 1.12 にアップグレードする際の注意事項についての詳細は、Terraform 1.12 のアップグレードガイドを参照してください。
Terraform 1.12 の主な変更点
Terraform 1.12.0 の更新内容の詳細は、Terraform 1.12.0 のリリースノートを参照してください。
また、 Terraform 1.12.1 の更新内容は Terraform 1.12.1 のリリースノートを参照してください。
以下は、主な変更点の概要です。
新機能
- Terraform リモートバックエンドとして、OCI Object Storage バックエンドが追加されました。
機能強化
-
terraform test
コマンドが-parallelism=n
オプションをサポートしました。これにより、テスト実行時の plan/apply 操作の並列数を設定できるようになりました。 - 論理二項演算子の短絡(short-circuit)評価が有効になりました。これにより、式自体が有効であれば、式の一方のロジックで評価が完了する場合、他方の評価を省略するようになりました。
- Terraform Test の Run ブロックで並列実行の注釈を設定できるようになりました。
(著者注: ここで言う注釈とは、parallel = true
のような並列実行の ON/OFF 設定のことを指します。) - カレントディレクトリに構成ファイルは存在しないがテストファイルが存在する場合に
terraform init
を許容するようになりました。 - Terraform Test で予期せぬ失敗が発生した場合でも、テストの実行が継続されるようになりました。
- テスト実行におけるアサーションが失敗した場合に、詳細なオブジェクトを生成するようになりました。
-
oss
バックエンドがプロバイダと同様により標準的な環境変数をサポートするようになりました。 - UI Hook での経過時間表示が
mm:ss
フォーマットに改善されました。以前は、apply 実行中の経過時間の表示が12m0s
や10s
のようにゼロパディングされていませんでした。これが、12m00s
や00m10s
のようにゼロパディングされるようになりました。 - 一部のエラーメッセージで Terraform Cloud agent と表示していた箇所を HCP Terraform agent に更新しました。
- import ブロックで新しい
identity
引数が追加されました。これは、これまでのid
引数とは排他的に使用されます。
バグ修正
- 特定の依存関係をもつリソースの plan が実行されるとき、plan 出力後に state の更新が行われるため Test 等でエラーになることが有りました。
(筆者注: 原文は “Refreshed state was not used in the plan for orphaned resource instances” と書いてありますが、非常に分かりにくいため原文を無視して筆者が理解した内容を記載しました。) - リモートバックエンドが、Terraform バージョン制約を指定するリモートワークスペースを読み取る際に発生していたエラーを修正しました。
- State 内の機密属性の順序変更によって、実際には変更がないのに plan に変更が含まれていると誤って表示される問題を修正しました。
-
Available Write-only Attribute Alternative
のような、属性に関連する診断メッセージの重複報告を回避しました。 -
import
ブロック内のfor_each
式がimport
ターゲットを参照できてしまう問題を修正しました。
その他
- Linux 環境において、Terraform は Linux カーネルバージョン 3.2 以降を必要とするようになり、以前のバージョンのサポートは終了しました。
(著者注: この説明はアップグレードガイドに記載するべきだったのではないかと思います。)
Terraform 1.12.1 の変更点
- identity 引数を使用する際に、インポート適用時の UI 出力にリソース ID が含まれるようになりました。
- プロバイダ取得時に HEAD リクエストを省略することで回帰バグを修正しました。
- 関数呼び出しを比較するテスト実行時にクラッシュする問題を修正しました。
個人的に注目した変更点
論理二項演算子の短絡評価 (short-circuit)
地味な変更ですが、論理二項演算子の短絡評価が有効になることで Terraform モジュール開発においてより柔軟な(あるいはシンプルな)コードが書けるようになります。
例えば、 google_compute_instance
リソースを含むモジュールを開発するとき、モジュール引数として shielded_instance_config
ブロックを模倣する variable を定義していたとします。
以下のようなコードです。(著者注: このコードは説明の都合、実用性はありません。)
variable "shielded_instance_config" {
type = object({
enable_secure_boot = bool
enable_vtpm = bool
enable_integrity_monitoring = bool
})
default = null
}
これを、実際の google_compute_instance
リソースに適用する場合、 Terraform 1.11 まででは以下のように三項演算子で書くことができます。
デフォルト値が null
ですので、 null
の場合はオブジェクトの内部属性にアクセスしないように三項演算子で迂回しています。
shielded_instance_config {
enable_secure_boot = var.shielded_instance_config != null ? var.shielded_instance_config.enable_secure_boot : null
enable_vtpm = var.shielded_instance_config != null ? var.shielded_instance_config.enable_vtpm : null
enable_integrity_monitoring = var.shielded_instance_config != null ? var.shielded_instance_config.enable_integrity_monitoring : null
}
このように書かないと、 var.shielded_instance_config
が null
の場合、オブジェクトの内部属性は未定義のためエラーになってしまうためです。
しかし、もし C 言語のように論理演算子の短絡評価が有効であれば、以下のように書けます。
shielded_instance_config {
enable_secure_boot = var.shielded_instance_config != null && var.shielded_instance_config.enable_secure_boot
enable_vtpm = var.shielded_instance_config != null && var.shielded_instance_config.enable_vtpm
enable_integrity_monitoring = var.shielded_instance_config != null && var.shielded_instance_config.enable_integrity_monitoring
}
var.shielded_instance_config != null
が false
の場合、それ以降の計算をしなくても式全体が false
と評価できるため、 var.shielded_instance_config.enable_secure_boot
は実行自体されず plan/apply が可能になるというわけです。
今回、Terraform 1.12 で短絡評価が有効になったことで、上記のような短絡評価を含むコードが書けるようになりました。
これまで、HCL は宣言的な言語なので短絡評価はできないのだと言いきかせて三項演算子を駆使していた開発者にとっては、嬉しい変更点ではないでしょうか。
まあ、Javascript のようにオプショナルチェーン演算子 ?.
に相当する機能があればもっと嬉しかったのですが、今後に期待です。
おまけ: NotebookLM と私
今回リリースノートを読む際にわかりにくい箇所があったので、リリースノートを NotebookLM に入れて質問してみました。
リリースノート原文
- Logical binary operators can now short-circuit (#36224)
- Terraform Test: Runs can now be annotated for possible parallel execution. (#34180)
- Refreshed state was not used in the plan for orphaned resource instances (#36394)
NotebookLM の回答
- 論理二項演算子でショートサーキット評価が可能になりました。
- Terraform Test: テスト実行を並列実行のためにアノテーション付けできるようになりました
- 孤立したリソースインスタンスのプランで、更新された状態が使用されなかった問題を修正
どのように対応したか
NotebookLM にただリリースノートをソースとして入れて質問しただけでは本来の趣旨はわかりませんでした。
例えば、リンク先の Pull Request をソースとして追加したり、関連する Terraform のリファレンスドキュメントをソースに追加することで、より意味のある回答を得ることができました。
そこから、自分自身で意味のある注記を付ける等しています。
特に、論理二項演算子については、単に機能追加されたに留まらない内容だと考え、実際に手を動かして確認し、記事としてピックアップしてみました。
個人的には、NotebookLM の出現によってリリースノートの速報記事は無価値になると考えていましたが、こんな感じでリリースノートの背景まで深く調査したり、実際の検証結果を追加することで付加価値を提供できると思いました。
この取り組みはもう少し続けてみようと思います。
まとめ
Terraform 1.12 のリリースノートについてざっくり紹介しました。
1.12 は比較的小規模なアップデートでしたが、個人的には論理二項演算子の短絡評価が有効になったことで、より洗練されたモジュールが作れるようになったのではないかと思います。
この記事が、Terraform を使っている方の参考になれば幸いです。
Views: 1