OpenTofu のラボ:プラン、apply、ステートで学ぶ Infrastructure as Code を1台の VM で

このラボは、生徒ごとに自分の Ubuntu マシンで OpenTofu を使えるようにします。Infrastructure as Code とは、あるべき姿をファイルに書き、そこへ至る方法をツールに任せることです。ツールはファイルと、すでに作ったものの記録を比べ、違いをプランとして見せ、そのあとで初めて変更します。生徒は小さなプロジェクトを書き、プランを読み、ステートを見て、壊れたプロジェクトを直します。

OpenTofu は無料のオープンソースで、ライセンスの購入は要りません。生徒のコンピューターには何もインストールしません。このラボにないのは本物のクラウドだけで、ラボ自身もこのページもそう説明しています。

生徒が学ぶこと

Infrastructure as Code の仕事の進め方を、6つの部分で学びます。最初のプランと apply、そしてそれが残すステートファイル。変数と出力。1つの記述から同じものを複数作ること(count と for_each)と、名前が残るのは for_each である理由。変更のあとにプランを読み、何も起こる前に、何が作られ、変わり、消えるかを言うこと。ステートが何のためにあるか(消して、プランがすべてを作り直そうとするのを見ます)。そして、プロジェクトの3つの間違い(型の誤り、足りない変数、循環)を tofu validate で見つけること。その途中で tofu fmt、tofu console、リソース間の依存も扱います。

ここで本物なものと、そうでないもの

本物のクラウドやサービスには、プロバイダーを通して届きます。プロバイダーは OpenTofu がレジストリからダウンロードするプラグインです。生徒の VM が届くのは Ubuntu のアーカイブ、PyPI、npm、GitHub だけなので、プロバイダーはダウンロードできず、このラボで本物が作られることはありません。OpenTofu に組み込まれているものはダウンロード不要です。値を保存して返すだけの terraform_data リソースです。これを使えば、変数、出力、count、for_each、依存関係、plan、apply、destroy、ステートはすべて本物と同じです。AWS や Docker のようなプロバイダーが変えるのは、リソースブロックが作るものだけです。README には1つが読むための文章として載っていて、ラボがそれを実行することはありません。

3つのフォルダー

ホームフォルダーには3つのフォルダーがあります。hello はそのまま動き、最初のプランと apply、変数、ステートに使います。campus は生徒のプロジェクトで、README の一覧をもとに何もない状態から書きます。変数3つ、for_each で作るサーバー、count で作る部屋、その両方を読むサマリー、2つの出力です。fix は、見つけて直す間違いが3つあるプロジェクトです。

ブラウザーで動かす

VM ラボは、モジュールのラボタスクとして設定し、サンプルはラボのページにあります。マシンは小さく、CPU 1つ、メモリ 1 GB、ディスク 10 GB です。OpenTofu 自体は、動いている間に約 80 MB を使います。

  1. ラボを追加する. 担当するモジュールでタスクを追加し、Ubuntu VM ラボのカードを選びます。ページには compose ファイルの代わりに、マシンの短い説明が表示されます。
  2. サンプルから始める. ページには、すぐ使えるラボが用意されています。OpenTofu を選びます。サンプルを使うとテキストが置き換わり、元に戻すで自分のテキストを取り戻せます。
  3. 公開して自分用のコピーを起動する. 公開してから開始を押します。VM の初回起動時に、ラボの setup スクリプトが Ubuntu のアーカイブから いくつかのツールをインストールし、GitHub のリリースから OpenTofu 1.13.2 をダウンロードして、決まったチェックサムでファイルを確かめてからインストールします。1〜2分かかります。ダウンロードにはアカウントが必要です。ビジターの VM が届くのは Ubuntu のアーカイブだけです。
  4. ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。6つの部分に分けて何をするかが書かれていて、答えは書かれていません。

このラボの基本レッスン

OpenTofu Basics は、Ubuntu VM であるこのラボで進める小さなレッスンです。導入、「できるようになること」、キーワード、ウォームアップ、考え方のあとのチェック、よくある間違い、最後のチェックがあり、各ステップの実行ボタンがそのコマンドをマシンのターミナルに入力します。生徒はプロジェクトを読み、init と plan を実行し、適用してステートを一覧し、値を1つ変えてプランを読み、そのあとステートを消して、プランがすでにあるものを作ろうとするのを見ます。

このレッスンは見て回るだけで、ラボ自体のタスク(プロジェクトと壊れたプロジェクト)は生徒に任せるので、答えは配りません。

採点の仕組み

ラボにはチェックがあります。生徒の2つのフォルダーを別の場所にコピーするので、生徒自身のステートは数えられず、プロバイダーとプロビジョナーは受け付けません。そのうえで検証し、ファイルが整っていること(tofu fmt)を求めます。campus プロジェクトでは、変数にチェック自身の値(誰も見たことのないサイト名と、独自のサーバーと部屋)を与えてプランし、適用します。ステートには、名前ごとに1つのサーバーがあり、それぞれの入力がサイト名と名前になっていること、部屋が1から番号付けされていること、書き込んだ値ではなくリソースを読む出力 summary と、名前の出力があることが必要です。入力のないリソースは不合格で、変数に従わない出力も不合格です。次にチェックはサーバーを1つ外して2つ加え、もう一度プランして、その1つだけが削除され、その2つだけが作られることを確かめます。適用し、変更が何も残っていないことを確かめ、削除します。最後に、壊れたプロジェクトが検証を通り、適用でき、リソースを保ち、変数に従うことを確かめます。出力の1行目に理由が書かれています。

  1. 配る. 他のタスクと同じようにラボを割り当てます。希望すれば期限も付けられます。生徒ごとに専用の VM が用意され、セッションをまたいで保たれます。
  2. チェックを実行する. クラス一覧で生徒の行にあるチェックを実行を押します。保存されたマシンのコピー(保存し直されません)を起動し、ラボのチェックスクリプトを root で実行して、合格したか、何を出力したか、いつ実行したかを表示します。結果は生徒には伝わりません。
  3. 採点する. チェックの出力の1行目を読みます。サーバーが変数と合っていない、サマリーがサーバーを読んでいない、apply のあともプランがまだ何かを変えようとしている、など何が正しくないかが書かれています。足りなければ理由を添えて差し戻します。

GitHub の定義ファイル

このファイルはラボの定義のすべてで、プラットフォームが実行するのと同じテキストです。サイズ、setup スクリプト、tofulab コマンド、3つのプロジェクト、README、チェックが入っています。コピーして、プロジェクトや変数や間違いを変えれば、もっと長いラボを作れます。

このラボを試す、そして費用

無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。

よくある質問

OpenTofu のラボにライセンスは必要ですか。
いいえ。OpenTofu は Mozilla Public License 2.0 のオープンソースで、Terraform のフォークとして始まった Linux Foundation のプロジェクトです。ラボが使うのは OpenTofu で、Terraform は使いません。Terraform のライセンスはオープンソースではないからです。生徒の VM の起動時にプロジェクト自身のリリースからダウンロードされ、当社がその一部を配布することはありません。
なぜ本物のサーバーは作れないのですか。
本物のサーバーはプロバイダーを通して作られ、プロバイダーは生徒の VM が届かないレジストリからダウンロードされます。VM が届くのは Ubuntu のアーカイブ、PyPI、npm、GitHub だけです。そのためラボは、OpenTofu に組み込まれた1つのリソースを使って、プロバイダー以外のすべてを教えます。plan、apply、ステートは本物でも同じように動くので、ここで学ぶ意味があります。
誰が実行できますか。
アカウント(無料または学校のもの)を持つ人です。ラボは VM の初回起動時に GitHub から OpenTofu をダウンロードしますが、Ubuntu のアーカイブにしか届かないビジターの VM にはできません。ダウンロードに失敗しても sudo tofulab install でやり直せます。チェックは、別の理由で失敗するのではなく、OpenTofu がないと表示します。
生徒は何かを壊せますか。
壊せるのは自分のコピーだけです。ラボが作るものはすべて OpenTofu 自身のステートの中にあり、VM が届くのは Ubuntu のアーカイブ、PyPI、npm、GitHub だけです。フォルダーを壊してしまっても、sudo tofulab reset でファイルが元に戻ります。
ラボは本物の生徒用 VM でテストされましたか。
setup(実際のダウンロードとそのチェックサムを含む)、レッスンのコマンド、チェックは、VM の代わりのコンテナ内の本物の Ubuntu 26.04 で実行し、ダウンロードのあとはネットワークが不要であることも確かめました。プラットフォームの許可リスト付きプロキシ(GitHub からのダウンロードが通る必要があります)の内側で実際に起動した生徒用 VM は、授業の前に一度試すことをおすすめします。