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 を使います。
- ラボを追加する. 担当するモジュールでタスクを追加し、Ubuntu VM ラボのカードを選びます。ページには compose ファイルの代わりに、マシンの短い説明が表示されます。
- サンプルから始める. ページには、すぐ使えるラボが用意されています。OpenTofu を選びます。サンプルを使うとテキストが置き換わり、元に戻すで自分のテキストを取り戻せます。
- 公開して自分用のコピーを起動する. 公開してから開始を押します。VM の初回起動時に、ラボの setup スクリプトが Ubuntu のアーカイブから いくつかのツールをインストールし、GitHub のリリースから OpenTofu 1.13.2 をダウンロードして、決まったチェックサムでファイルを確かめてからインストールします。1〜2分かかります。ダウンロードにはアカウントが必要です。ビジターの VM が届くのは Ubuntu のアーカイブだけです。
- ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。6つの部分に分けて何をするかが書かれていて、答えは書かれていません。
このラボの基本レッスン
OpenTofu Basics は、Ubuntu VM であるこのラボで進める小さなレッスンです。導入、「できるようになること」、キーワード、ウォームアップ、考え方のあとのチェック、よくある間違い、最後のチェックがあり、各ステップの実行ボタンがそのコマンドをマシンのターミナルに入力します。生徒はプロジェクトを読み、init と plan を実行し、適用してステートを一覧し、値を1つ変えてプランを読み、そのあとステートを消して、プランがすでにあるものを作ろうとするのを見ます。
このレッスンは見て回るだけで、ラボ自体のタスク(プロジェクトと壊れたプロジェクト)は生徒に任せるので、答えは配りません。
採点の仕組み
ラボにはチェックがあります。生徒の2つのフォルダーを別の場所にコピーするので、生徒自身のステートは数えられず、プロバイダーとプロビジョナーは受け付けません。そのうえで検証し、ファイルが整っていること(tofu fmt)を求めます。campus プロジェクトでは、変数にチェック自身の値(誰も見たことのないサイト名と、独自のサーバーと部屋)を与えてプランし、適用します。ステートには、名前ごとに1つのサーバーがあり、それぞれの入力がサイト名と名前になっていること、部屋が1から番号付けされていること、書き込んだ値ではなくリソースを読む出力 summary と、名前の出力があることが必要です。入力のないリソースは不合格で、変数に従わない出力も不合格です。次にチェックはサーバーを1つ外して2つ加え、もう一度プランして、その1つだけが削除され、その2つだけが作られることを確かめます。適用し、変更が何も残っていないことを確かめ、削除します。最後に、壊れたプロジェクトが検証を通り、適用でき、リソースを保ち、変数に従うことを確かめます。出力の1行目に理由が書かれています。
- 配る. 他のタスクと同じようにラボを割り当てます。希望すれば期限も付けられます。生徒ごとに専用の VM が用意され、セッションをまたいで保たれます。
- チェックを実行する. クラス一覧で生徒の行にあるチェックを実行を押します。保存されたマシンのコピー(保存し直されません)を起動し、ラボのチェックスクリプトを root で実行して、合格したか、何を出力したか、いつ実行したかを表示します。結果は生徒には伝わりません。
- 採点する. チェックの出力の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 は、授業の前に一度試すことをおすすめします。