OpenTofu が正式リリースされたので内容を確認してみました

2024/01/17に公開

こんにちは、クラウドエースの阿部です。
今回の記事では、 2024 年 1 月 10 日に正式リリースされた OpenTofu について紹介したいと思います。

OpenTofu とは

OpenTofu は、Terraform からフォークして開発を開始したオープンソースソフトウェア(OSS)です。
OpenTofu プロジェクトが発足した詳細は割愛しますが、去年 10 月頃から Hashicorp 社は公開している OSS のライセンスを MPL2.0 から BSL1.1 に変更したことに伴い、Terraform のソースコードを流用したり Terraform 自体を自社提供サービスに組み込んでいる組織が継続できないおそれがでたため、MPL 2.0 の時点の最新版(Terraform 1.5 系)からフォークしてライセンスの問題に対応するプロジェクトを発足した、と筆者は認識しています。なお、筆者の主観も入っているため、正確な経緯を説明しきれていない点についてはご容赦ください。

OpenTofu は、これ以降もソースコードを他に流用可能な OSS ライセンスを使用して開発を継続するようです。

Terraform との違い

OpenTofu は Terraform 1.5 系から派生して開発しており、 OpenTofu v1.6.0 のベースは Terraform v1.5 です。(正確な派生元バージョンまでは調査しておりません)
OpenTofu は Terraform v1.6.0 で実装された test コマンドも実装しています。そのため、現時点では Terraform と OpenTofu はコマンド互換性があります。

ソースコード上の違い

筆者が OpenTofu と Terraform のソースコードを比較して見てみましたが、以下のような違いでした。

  • 一部のディレクトリ・ファイル構造は変更されている。(ただし、これはプロジェクトで使っているビルド手順の都合だと推測される)
  • Terraform 1.5 までに実装されている処理については、OpenTofu も同じロジックで実装されている。ただし、完全一致ではなく、コメントやエラーメッセージの Terraform や Hashicorp となっている部分(いわゆる商標)については、 OpenTofu や tofu 等と置き換えられている。(ただし、100%置換されているわけではない)
  • Golang でインポートしている一部の内部処理モジュールについては、 Terraform のリポジトリではなく OpenTofu のリポジトリを呼び出すように修正されている。
  • Terraform 1.6 で実装された test コマンドのロジック部分は BSL1.1 の影響もあり、 OpenTofu では別のロジックで実装されている。(ただし、処理結果は同等にしている)

コマンドの違い

コマンドについては、 terraformtofu とリネームされただけで、基本コマンドの書式については現時点で差分はありません。
主なコマンドは以下のような関係です。その他のコマンドもざっと確認した限りでは差分はなさそうでした。

処理 Terraform OpenTofu
初期化 terraform init tofu init
計画 terraform plan tofu plan
実行 terraform apply tofu apply
フォーマット terraform fmt tofu fmt
テスト terraform test tofu test
State 操作 terraform state tofu state

また、 OpenTofu でコマンドのシェル補間を有効化する場合は、 tofu -install-autocomplete を実行します。(こちらも Terraform と同様です。)
手元の環境(Ubuntu 20.24 LTS on WSL)では、.bashrc に補間設定が追記されました。

プロバイダの違い

プロバイダ(プラグイン)については、ダウンロードのパスが変わるようです。
Terraform は https://registry.terraform.io/ でプロバイダを管理しておりますが、 OpenTofu は registry.opentofu.org で管理しているようです。
ただ、registry.opentofu.org にブラウザでアクセスすると、 https://opentofu.org/registry/ にリダイレクトされます。記事執筆時点では以下のような表示のみであり、OpenTofu の GitHub リポジトリで Terraform コミュニティのプロバイダをミラーリングして管理しているように見えます。

The OpenTofu Registry contains providers and modules to be used with OpenTofu. In order to view the catalogue of providers / modules, or if you’d like to submit new providers / modules, please head to https://github.com/opentofu/registry/.

※詳細を追い切れていないため、このあたりは筆者の誤解がある可能性があります。ご参考程度にお読みください。

上記のような状況のため、 Terraform で管理しているソースを OpenTofu に移行する場合は tofu init を実行してプロバイダを再インストールする必要があります。(戻す場合も同様)

Terraform から OpenTofu へ移行する方法

Terraform から OpenTofu へ移行する手順は、OpenTofu プロジェクト公式のガイドラインが存在しています。

https://opentofu.org/docs/intro/migration/

基本的には、State ファイルのバックアップは念のためとっておく必要があるようですが State ファイルに互換性があるため、 tofu init を実行するのみで切り替えることが可能です。
前述した通り、プロバイダファイルは異なるパスで管理しているため、コマンドを切り替える際には再初期化が必要です。

OpenTofu における筆者の所感

筆者の所感として、Hashicorp 社によるライセンス FAQ によれば、少なくとも Terraform をユーザーの立場で使用している限り、ライセンスによる影響はないと考えています。
例えば、以下のような作業です。

  • Terraform のソースコードを作成し、 Terraform CLI で Google Cloud をはじめとするクラウドリソースを作成・変更・削除する
  • 作成した Terraform のソースコードを、顧客に提供する ※Terraform 自体をホスティングして提供しない範囲

そのため、現時点では OpenTofu に乗り換えて作業するといったことは検討していません。

しかし、 OpenTofu は、 v1.6.0 以降、Terraform とは異なる方向性の機能追加も検討されており、技術的側面においては興味深いです。今後も定期的にウォッチしていきたいプロダクトです。

まとめ

OpenTofu について紹介しました。現時点では Terraform のフォークプロジェクトであり、ほぼ同等の動作です。
Hashicorp のライセンス変更について影響を受けないのであれば無理に切り替える必要はないというのが現時点の見解です。
しかし、今後のバージョンアップでプロダクト毎の特徴や差分がでてくる可能性がありますので、目を離せないなと思いました。

Discussion