メインコンテンツにスキップ

OpenTofu 1.8の新機能

このページでは、OpenTofu 1.8の最も重要な変更点について説明します。

変数/ローカル変数の早期評価

この機能により、リソース、データソース、またはモジュール出力に依存していない限り、**バックエンド**、**モジュールソース**、および**暗号化設定**に変数とローカル変数を使用できます。 たとえば、ローカル変数が変数を参照している場合でも、これは機能します。これは、.tfコードをより柔軟にするための一連の改善の最初のものに過ぎず、今後のリリースでさらなる改善が予定されています。

tofu initコマンドは、.tfvarsファイルを使用するようになり、 `-var`および `-var-file`オプションを使用して変数を指定できるようになりました。 このアルファリリースでは、不足している変数の入力を求めるプロンプトは表示されません。これは、今後追加される予定です。静的評価に必要な変数が不足している場合、 `tofu init`は失敗することに注意してください。

たとえば、S3バックエンドとAWSプロバイダーに同じ設定を使用する場合、次のようにすることができます。

コードブロック
variable "aws_region" {
default = "us-east-1"
}

terraform {
backend "s3" {
region = var.aws_region
}
}

provider "aws" {
region = var.aws_region
}

また、これを使用して、レジストリ参照とgit URLの両方でモジュールバージョンを管理することもできます。

コードブロック
locals {
aws_module_version = "5.6.1"
}

module "webserver" {
source = "terraform-aws-modules/ec2-instance/aws"
version = local.aws_module_version

// Other ec2_instance options
}

module "db" {
source = "https://github.com/terraform-aws-modules/terraform-aws-ec2-instance?ref=v${local.aws_module_version}"

// Other ec2_instance options
}

最後に、変数を使用してパスフレーズで暗号化を設定する方法を次に示します。

コードブロック
variable "passphrase" {
type = string
}

terraform {
encryption {
key_provider "pbkdf2" "my_passphrase" {
passphrase = var.passphrase
}

method "aes_gcm" "my_method" {
keys = key_provider.pbkdf2.my_passphrase
}

state {
method = method.aes_gcm.my_method
}
}
}

`tofu test`でのプロバイダーモッキング

特定のデータソース、リソース、およびモジュール呼び出しをオーバーライドする既存の機能に基づいて、 `tofu test`は、プロバイダー定義全体をモックできるようになりました。 この新機能により、プロバイダーごとにリソースとデータソースのモック値を自動的に生成できます。 例として、AWSでm6i.2xlargeインスタンスを起動する次のコードを考えてみます。

コードブロック
provider "aws" {
region = "us-east-1"
}

data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-24.04-amd64-server-*"]
}
owners = ["099720109477"]
}

resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "m6i.2xlarge"
}

AMI IDをクエリしてインスタンスを起動する代わりに、次のようにテストコードを記述できます。

コードブロック
// This block will prevent OpenTofu from configuring aws provider.
// All provider's resources and data sources will be mocked.
mock_provider "aws" {
mock_data "aws_ami" {
defaults = {
id = "ami-12345"
}
}
}

run "test" {
assert {
condition = aws_instance.web.ami == "ami-12345"
error_message = "Incorrect AMI ID passed to aws_instance.web: ${aws_instance.web.ami}"
}
}

これはプロビジョニング全体を完全にテストするわけではありませんが、実際のAWSアカウントを必要とせずに、リソースを誤って接続することによって発生する可能性のあるエラーを明らかにします。

`tofu test`でのリソースのオーバーライド

テストからリソース、データソース、およびモジュール全体をオーバーライドできるようになり、従来のソフトウェアテストのモックと同様の動作を作成できるようになりました。 例として、AWSで `m6i.2xlarge`インスタンスを起動する次のコードを考えてみます。

コードブロック
provider "aws" {
region = "us-east-1"
}

data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-24.04-amd64-server-*"]
}
owners = ["099720109477"]
}

resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "m6i.2xlarge"
}

AMI IDをクエリしてインスタンスを起動する代わりに、次のようにテストコードを記述できます。

コードブロック
provider "aws" {
access_key = "foo"
secret_key = "bar"

skip_credentials_validation = true
skip_region_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
}

# This block disables refreshing the aws_ami.ubuntu data source
# and lets you manually specify the values:
override_data {
target = data.aws_ami.ubuntu
values = {
id = "ami-12345"
}
}

run "test" {
# This block disables provisioning the aws_instance.web resource:
override_resource {
target = aws_instance.web
values = {
# You can add values here.
}
}

assert {
condition = aws_instance.web.ami == "ami-12345"
error_message = "Incorrect AMI ID passed to aws_instance.web: ${aws_instance.web.ami}"
}
}

これはプロビジョニング全体を完全にテストするわけではありませんが、実際のAWSアカウントを必要とせずに、リソースを誤って接続することによって発生する可能性のあるエラーを明らかにします。 同様に、 `override_module`を使用してモジュール全体をオーバーライドできます。

OpenTofuのオーバーライドファイル:互換性の維持

Terraformには存在しない機能をOpenTofuに追加しているため、モジュール作成者はモジュールの2つのコピーを維持する必要なく、OpenTofuとTerraformの両方のコードを記述できるようにしたいと考えています。 OpenTofu専用に `tofu`という名前のファイルを作成できるようになりました。 `foo.tofu`という名前のファイルを作成すると、OpenTofuは同じ名前の `foo.tf`ファイルを無視します。 この機能を使用して、Terraform固有のコードを `.tf`ファイルに配置し、 `.tofu`ファイルでOpenTofu用にオーバーライドできます。

次の置換ファイルが使用可能です。

  • `foo.tf`→ `foo.tofu`
  • `foo.tf.json`→ `foo.tofu.json`
  • `foo.tftest.hcl`→ `foo.tofutest.hcl`
  • `foo.tftest.json`→ `foo.tofutest.json`
  • `foo_override.tf`→ `foo_override.tofu`
  • `foo_override.tf.json`→ `foo_override.tofu.json`

すべてのコードで `.tf`拡張子を引き続き使用できます。この機能は、新しいOpenTofu機能を使用しながら、OpenTofuとTerraformの両方と互換性のあるコードを提供したいモジュール作成者を対象としています。

バグ修正、改善、非推奨

非推奨:S3バックエンドから `use_legacy_workflow`が削除されました

`use_legacy_workflow`オプションは、S3バックエンド設定から削除されました。

その他の改善点

  • 機械可読UIドキュメントに `tofu test -json`タイプが含まれるようになりました。
  • `tofu plan`は、 `generate-config-out`を使用するときに `jsonencode()`を生成するようになりました。
  • 状態の永続化間隔は、 `TF_STATE_PERSIST_INTERVAL`環境変数で設定できるようになりました。
  • コンパクトなJSONエンコーディングを使用して、状態ファイルの書き込みパフォーマンスを向上させ、状態ファイルのサイズを削減しました。
  • テストファイルの `variables`ブロック内で変数を参照できるようになりました。
  • プロバイダー関数が `tofu providers schema`コマンドに含まれるようになりました。

バグ修正

  • 暗号化設定の `enforced`フラグの検証を修正しました。 (#1711
  • 特定のコマンドを使用する場合のgcsバックエンドのクラッシュを修正しました。 (#1618
  • メモリ内バックエンドの、構造体フィールドの欠落によるクラッシュを修正しました。(#1619)
  • tofu test に、テスト実行ブロックの名前にスペースが含まれていないことを検証するチェックを追加しました。(#1489)
  • tofu test が、モジュールにリソースがない場合でもモジュール出力へのアクセスをサポートするようになりました。(#1409)
  • テストにおけるプロバイダー関数のサポートを修正しました (#1603)
  • リソースセットに対してプランを実行する場合にのみ、プラン詳細で機密属性を非表示にするようにしました (#1313)
  • 不適切な型の機密値を持つ for_each ブロックに対して、より分かりやすいエラーメッセージを追加しました。(#1485)
  • GCSバックエンドのロックにおける競合状態を修正しました (#1342)
  • 変数と出力でプロバイダー関数が使用できなかったバグを修正しました (#1689)
  • 小文字の http_proxy/https_proxy 環境変数がS3バックエンドでサポートされなくなっていたバグを修正しました (#1594)
  • バージョン間の移行で、変更が必要ない場合にリソースのインプレース更新が発生する可能性があった問題を修正しました。(#1640)
  • '機能ブロックが不十分です' エラーのソースコンテキストを追加しました (#1777)
  • オートコンプリートから暗号化診断を削除しました (#1793)
  • templatefile に機密パスを使用してもパニックが発生しないようにしました (#1801)