OpenTofu コミュニティの皆さん、こんにちは!皆様からのフィードバックをもとに、1.8.0-alpha1 の改良に尽力してまいりました!いくつかの荒削りな部分が磨き上げられ、いくつかの新機能が追加されました。
新しい機能をテストしても構わない非本番環境をお持ちの方は、ぜひ試していただき、GitHub issue を使用してフィードバックをお寄せください。すべてうまくいったという報告だけでも構いません。
このブログ記事では、新しいプレビューリリースのダウンロード方法と、1.8.0-alpha1 ブログ記事で紹介した機能について詳しく説明します。
このリリースを本番プロジェクトでテストしないでください。これは安定版リリースではありません!
2024年7月11日に、1.8.0-beta1 に存在していた問題を解決するために 1.8.0-beta2 がリリースされました。
ベータ版リリースのダウンロード
ベータ版リリースは、GitHub リリースページでのみ入手可能です。お使いのプラットフォームに適したファイルを選択してください。以下に、いくつかのクイックリンクを示します。
プラットフォーム/デバイス | ダウンロードリンク |
---|---|
デスクトップ Windows コンピューター (64 ビット) | tofu_1.8.0-beta2_windows_amd64.zip |
macOS (Macbook M1 以降; ARM64) | tofu_1.8.0-beta2_darwin_arm64.tar.gz |
macOS (Macbook pre-M1; AMD64) | tofu_1.8.0-beta2_darwin_amd64.tar.gz |
Intel/AMD Linux コンピューターまたはサーバー (AMD64) | tofu_1.8.0-beta2_linux_amd64.tar.gz |
ARM ベースの Linux コンピューター または Raspberry Pi 3 以降 (ARM64) | tofu_1.8.0-beta2_linux_arm64.tar.gz |
上記のリリースについては、アーカイブを展開すると、中に `tofu` バイナリがあるはずです。また、スタンドアロンインストーラーを使用して、署名検証付きでリリースをダウンロードすることもできます。
`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` でのリソースオーバーライド
OpenTofu 1.8.0-alpha1 で初めて導入された、テストからリソース、データソース、およびモジュール全体をオーバーライドできるようになり、従来のソフトウェアテストでのモックと同様の動作を作成できます。例として、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 1.8.0-alpha1 で導入されたこの機能を使用すると、リソース、データソース、またはモジュール出力に依存しない限り、**バックエンド**、**モジュールソース**、および**暗号化構成**に変数とローカルを使用できます。たとえば、ローカルが変数を参照している場合でも機能します。これは、.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
}
}
}
OpenTofu のオーバーライドファイル: 互換性の維持
OpenTofu に Terraform にはない機能を追加していくにあたり、モジュール作成者がモジュールのコピーを2つ管理することなく、OpenTofu と Terraform の両方に対応したコードを書けるようにしたいと考えています。そこで、OpenTofu 専用のファイルとして .tofu
という名前のファイルを作成できるようになりました。foo.tofu
という名前のファイルを作成した場合、OpenTofu は同様の名前の foo.tf
ファイルを無視します。この機能を利用して、Terraform 固有のコードを .tf
ファイルに記述し、OpenTofu では .tofu
ファイルで上書きすることができます。
バグ修正と改善
静的変数プランニング
静的変数が、プランファイルに埋め込まれた場合に正しく処理されるようになりました。これは 1.8.0-alpha1 で発見されたバグとして報告されたものです。
tofu plan -out=tofu.tfstate -var="param=value"
# Variables are correctly read from the given plan and should not be specified via CLI
tofu show tofu.tfstate
tofu apply tofu.tfstate
プロバイダーのエラーメッセージの改善
このベータ版には、構成が誤っているプロバイダーによって生成されるエラーメッセージの改善も含まれています。構成ブロックを必要とする一部のデフォルトプロバイダーでは、次のようなエラーメッセージが生成されていました。
╷
│ Error: Insufficient features blocks
│
│ on <empty> line 0:
│ (source code not available)
│
│ At least 1 "features" blocks are required.
╵
このエラーメッセージには、ユーザーが問題を特定するのに役立つように、どのプロバイダーが特定の欠落ブロック検証の問題に遭遇しているかについての情報が含まれるようになりました。
フィードバックの提供
このプレビューリリースをテストしていただきありがとうございます。フィードバックがある場合は、GitHub issue を使用するか、OpenTofu Slack でチャットしてください。