TerraformからOpenTofuへ移行してみた

記事タイトルとURLをコピーする

はじめまして、こんにちは。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の新ライセンスに懸念を持つ企業が移行先として採用するケースが増えています。

移行ガイド

opentofu.org

前提条件

  • Atlantis × GitHub × Terraform(OpenTofu) という簡易的な GitOps 環境で試しています
  • すでに Amazon EC2 上に Terraform インストールされています
  • tfstate(Terraformの状態管理ファイル) は Amazon S3 に保存する構成にしています
  • Terraform code は、GitHub プライベートリポジトリで管理されています
  • Atlantis Server は、GitHub Webhook と連携しています
  • 動作確認に使用するawsリソースはTerraformで作成済です

今回やること

  1. Terraform 関連ファイルのバックアップ取得する
  2. Amazon EC2 上に OpenTofu をインストールして、Atlantis Server の OpenTofu 設定をする
  3. Github にプルリクエスト(PR)を作成して、Atlantis Server が tofu plan を実行。結果を PR のコメントに貼り付けする
  4. PR に「atlantis apply」とコメントする
  5. 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。お酒は少しだけ嗜んでいます