はじめまして、こんにちは。tofu屋にジョブチェンジした、いなみです。
今回はtofuのことを書いてみようと思います。皆さんtofuお好きですよね?
OpenTofu とは?
OpenTofuはTerraformのオープンソースフォークです。
2023年8月にHashiCorpがTerraformのライセンスをオープンソース(MPL 2.0)から商用ライセンス(BSL 1.1)に変更したことを受けて、Linux Foundation傘下のプロジェクトとして誕生しました。Terraform 1.5.xのコードベースから分岐しており、HCLの書き方やコマンド体系はTerraformとほぼ同じです。 既存のTerraformコードやtfstateファイルはそのままOpenTofuで利用でき、terraform コマンドの代わりに tofu コマンドを使う形になります。プロバイダーもTerraformと同じものが使えます。
OpenTofu独自の機能としては、stateファイルの暗号化(state encryption)や、変数のデフォルト値での早期評価などがあり、Terraformとは独立して進化し始めています。 ライセンスがApache 2.0で完全にオープンソースなので、商用利用に制限がなく、Terraformの新ライセンスに懸念を持つ企業が移行先として採用するケースが増えています。
移行ガイド
前提条件
- Atlantis × GitHub × Terraform(OpenTofu) という簡易的な GitOps 環境で試しています
- すでに Amazon EC2 上に Terraform インストールされています
- tfstate(Terraformの状態管理ファイル) は Amazon S3 に保存する構成にしています
- Terraform code は、GitHub プライベートリポジトリで管理されています
- Atlantis Server は、GitHub Webhook と連携しています
- 動作確認に使用するawsリソースはTerraformで作成済です

今回やること
- Terraform 関連ファイルのバックアップ取得する
- Amazon EC2 上に OpenTofu をインストールして、Atlantis Server の OpenTofu 設定をする
- Github にプルリクエスト(PR)を作成して、Atlantis Server が
tofu planを実行。結果を PR のコメントに貼り付けする - PR に「atlantis apply」とコメントする
- Atlantis Server が
terraform applyを実行し、結果を PR コメントに貼り付けする
各バージョン
- HashiCorp Terraform v1.15.5(Terraform AWS Provider v5.100.0) → OpenTofu v1.12.1(Terraform AWS Provider v5.100.0)
- Atlantis v0.42.0
- Amazon Linux 2023
検証
事前作業として、バックアップ取得
- remote tfstate 保存場所の Amazon S3 バージョニングを有効
- Terraform code のバックアップ(migration branchを切る)
OpenTofu インストール
OpenTofuのリポジトリ設定ファイルを作成
# cat > /etc/yum.repos.d/opentofu.repo << 'EOF'
[opentofu]
name=opentofu
baseurl=https://packages.opentofu.org/opentofu/tofu/rpm_any/rpm_any/$basearch
repo_gpgcheck=0
gpgcheck=1
enabled=1
gpgkey=https://get.opentofu.org/opentofu.gpg
https://packages.opentofu.org/opentofu/tofu/gpgkey
EOF
インストール
# dnf install -y tofu
バージョン確認
# tofu --version OpenTofu v1.12.1 on linux_amd64
シンボリックリンク作成
# ln -sf $(which tofu) /usr/local/bin/terraform # terraform --version OpenTofu v1.12.1 on linux_amd64
Atlantis Server の設定変更
- systemd で起動しており、オプションを付けて OpenTofu を利用するように、config(/etc/systemd/system/atlantis.service)も修正します
修正前
[Service] ExecStart=/usr/local/bin/atlantis server \ --default-tf-version=v1.15.5 \ ...
修正後
[Service] ExecStart=/usr/local/bin/atlantis server \ --default-tf-distribution=opentofu \ --default-tf-version=v1.12.1 \
修正後は reload , restart します。
# systemctl daemon-reload # systemctl restart atlantis
Atlantis からの GitHub Webhook 連携が問題ないことを確認します

テスト
変更のPRを送ります

GitHubのPR上からの 実行結果がこちらです(切り替わっているので出力にOpenTofuって出ています)

最後に titan apply をコメントから実行します

変更点
- 気づいた点として、OpenTofuは、tfstateをminified(改行・インデントなし、1行のJSON)で出力するようになっていました。Terraformはインデント付きの読みやすい形式で出力します。これによる機能的な差異はなく、tfstateのサイズ削減(特に大規模環境で差が出る)のためのようです。
- コマンドオプションも軽微な違いはあれど、ほぼ一緒のようです


感想
- あまりにも簡単にできてしまって、拍子抜けでした(最新バージョンを使用しているため、または複雑なcodeを書いてなかったためかもしれません)
- 使い勝手も Terraform なので、スッとなじみます
- Terraform にはない独自機能もあるので、これから色々試してみます
いなみ(執筆記事)
元SRE。お酒は少しだけ嗜んでいます