フューチャー技術ブログ

Terraform連載2026を開始します

こんにちは。技術ブログ運営の伊藤です。

今年もフューチャー技術ブログでは、Terraformを題材とした連載を開催します。今回は8人の方が参加します。

日付 執筆者 タイトル / テーマ
5/25(月) 伊藤太斉さん インデックス+最近のリリースまとめ(この記事です)
5/26(火) 大江悠斗さん Artifact Registry利用料金の最適化方針と対応手順(仮)
5/27(水) 片岡久人さん Terraform Cloudやってみた(仮)
5/28(木) 八木雅斗さん Terraform経験者が初めてAWS CDKを利用して感じたギャップ(仮)
5/29(金) 永井辰弥さん TBD
6/1(月) 棚井龍之介さん Terraform × ISMS
6/2(火) 香村真紀さん TerraformでLamubdaのコード管理
6/3(水) 市川裕也さん Terraform × ISMS

Terraform連載は2023年から始まり、4年連続の開催となります。技術カットの連載企画の中では比較的ご長寿連載になりました。

この記事では、昨年のTerraform連載2025以降にリリースされたv1.12からこのブログの公開日の少し前にリリースされたv1.15までの新機能に触れます。

バージョン別変更点一覧

v1.12からv1.15までのまとめを生成AIに作ってもらいました。特に、ここでは新機能と機能改善について着目します。

追加されたバージョン カテゴリ 内容
v1.12 新機能 OCI Object Storage バックエンドの正式追加
import ブロックで id に加え identity 属性をサポート(両者は排他)
改善 terraform test コマンドに -parallelism=n フラグを追加。並列テスト実行が可能に
論理演算子(&& / ||)の短絡評価(short-circuit)に対応
UI の経過時間表示を mm:ss 形式に改善
テストアサーション失敗時の診断情報が詳細化
v1.13 新機能 module の source / version 属性で変数(var.*)や local.* が使用可能に
terraform stacks コマンドが追加され、CLI から直接 Stacks 操作が可能に
改善 terraform testmock ブロック内で関数(functions)が使用可能に
プロバイダーが設定した非推奨(deprecated)メッセージが警告として表示されるように
sensitive としてマークされたネストモジュール出力が正しく伝播するバグを修正
rpcapi コマンドが GA(一般提供)に昇格
v1.14 新機能 List Resources*.tfquery.hcl ファイルで定義し、既存インフラへのクエリ・フィルタリングが可能に
terraform query コマンド:リスト操作の実行、結果から import 用設定の自動生成が可能
actions ブロック:CRUD モデル外の命令的操作(例:aws_lambda_invokeaws_cloudfront_create_invalidation)をリソースのライフサイクルにバインド可能
改善 GenerateResourceConfiguration RPC が追加され、インポート時により精密な設定値を生成可能に
terraform import でワークスペース変数セットから継承した変数も取得されるように
v1.15 新機能 Windows ARM64 ビルドを正式提供。Snapdragon 搭載 Windows マシンでネイティブ動作可能に
deprecated 属性variable / output ブロックで使用可能に。非推奨の変数に値を渡したり非推奨のアウトプットを参照した際に警告を発生させられる
convert() 関数の追加。インライン型変換を精密に行えるように
S3 バックエンドaws login 認証をサポート
module の source / version 属性で変数・locals を使用可能に(動的モジュールソース)※1.13 で追加された機能の安定版として正式統合
改善 terraform validate コマンドがバックエンドブロックも検証するようになり、バックエンドの型・必須属性・固有バリデーションロジックまでチェック
terraform init でのプロバイダーインストール処理をリファクタリング。init の処理順序が変わり 2 つの新ログメッセージが追加(ログをプログラムでパースしている場合は要確認)
Terraform Cloud / Registry の検出ネットワークリクエストがより堅牢になり、一時的なネットワーク障害時のエラーが減少
terraform fmt.tfquery.hcl ファイルのフォーマットに対応

一通り眺めてみると、これまではTerraformでリソースを作るときにフォーカスされる機能が多い印象でしたが、よりテスト、その後の保守性まで踏まえたバージョンアップをしているように感じました。

気になる機能

ここからは特に私が気になった機能について、2つほどピックアップしました。

v1.12: terraform testコマンドで-parallelism=nフラグが利用可能になった

これまで、Terraformのplanコマンドやapplyコマンドで使えたparallelismのフラグがtestコマンドでも使うことができるようになりました。このフラグは、Terraformのそれぞれのコマンドを実行するときの並列度を調整でき、デフォルト値はplanコマンドやapplyコマンドと同様に10に設定されています1

ユースケースとしては、あるTerraformでの管理対象が増大したときにparallelismのフラグをつけることで、それなりに高速化させることが可能です。ただ、高速化する一方、その管理対象の粒度が適切でない場合(数百のリソースになる場合)はリファクタリングも視野に入れましょう。

v1.14: terraform queryコマンドを利用してリスト操作の実行、結果から import 用設定の自動生成が可能になった

v1.5でimportブロックがサポートされ、複数のリソースを.tfファイルに定義してCI/CD上でリソースのインポートが可能でした。しかしながらインポートする対象のリソースはものによってはIDであったり、ARNであったり定義するべきものが異なります。そのためimportブロックの記述は煩雑なものでした。

ここで、v1.14で新たに使えるようになったterraform queryコマンドを使うことでソース記述のハードルがグッと下がりました。

例えば、EC2インスタンスを手動で立てたのち、取り込みたい場合においては以下のようなlistブロックを.tfquery.hclファイルに記載します。

list "aws_instance" "development" {
  provider = aws
}

resourceブロックに対応するリソース(今回はaws_instance)を記述することで、Terraformで管理されている、されていないに関わらず一覧化できます。実際にterraform queryコマンドを実行すると、以下のようにlistブロックで定義したリソースの一覧を取得できます。

$ terraform query
list.aws_instance.development account_id=123456789012,id=i-xxxxxx,region=ap-northeast-1 dev-instance (i-xxxxxx)
list.aws_instance.development account_id=123456789012,id=i-yyyyyy,region=ap-northeast-1 query-test-instance (i-yyyyyy)

また、特定の範囲に絞りたい場合にはタグなどで絞ることができ、例としてNameタグで絞ると以下のような書き方になり、1行目のリソースのみ抽出できます。

list "aws_instance" "development" {
  provider = aws

  config {
    filter {
      name   = "tag:Name"
      values = ["dev-instance"]
    }
  }
}

対象のリソースを選択した後はterraform queryコマンドに-generate-config-outオプションを指定して実行すれば、resourceブロックとimportブロックを自動生成してくれます(今回はconfigブロックがない状態で生成しました)。

# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.

# __generated__ by Terraform
resource "aws_instance" "development_0" {
  provider   = aws
  ...
  private_ip = "10.0.2.92"
  region     = "ap-northeast-1"
  tags = {
    Name = "dev-instance"
  }
  ...
}

import {
  to       = aws_instance.development_0
  provider = aws
  identity = {
    account_id = "123456789012"
    id         = "i-xxxxxx"
    region     = "ap-northeast-1"
  }
}

resource "aws_instance" "development_1" {
  provider   = aws
  ...
  private_ip = "10.0.2.228"
  region     = "ap-northeast-1"
  tags = {
    Name = "query-test-instance"
  }
  ...
}

import {
  to       = aws_instance.development_1
  provider = aws
  identity = {
    account_id = "123456789012"
    id         = "i-yyyyyy"
    region     = "ap-northeast-1"
  }
}

後は生成されたソースを期待する状態に修正、配置することでTerraformでの管理が可能となります。

さいごに

改めて直近のリリースノートを読み返して機能を触ってみましたが、着実に機能追加がされており、便利な関数も増えたことで、運用・エンハンスという観点でも便利になっていることを感じました。

この連載で社内のいろんな知見が公開されるのでぜひ皆さんも楽しみにしていただけると幸いです。

引き続き、よろしくお願いします。