「サーバーを100台用意して」って言われたとき、1台ずつポチポチ設定していたら日が暮れちゃうよね。しかも手順を間違えたら最初からやり直し……そんな「インフラ構築の地獄」を経験したことがある人、多いんじゃないかな。実はそのお悩み、Terraform(テラフォーム)を使えばサクッと解決できるんだよ。この記事を読めば、Terraformが何をするツールなのか、なぜエンジニアに人気なのかが丸わかりだよ。
- Terraformはサーバーやネットワークの構成を コードとして書いて管理できる ツールだよ
- AWS・GCP・Azureなど 300以上のクラウドサービス に対応している万能ツールだよ
- コードで管理することで 環境の再現性・ミスの防止・チームでの共有 がグッと楽になるよ
もうちょっと詳しく
Terraformは、HashiCorp(ハシコープ)という会社が開発したオープンソースのツールで、正式には「Infrastructure as Code(インフラアズコード)」つまり「インフラをコードとして扱う」という考え方を実現するためのものだよ。普通、サーバーやネットワークの設定って、クラウドの管理画面をマウスでカチカチ操作して行うよね。でもTerraformを使うと、テキストファイルに「サーバーを2台、東京リージョンに用意して」みたいなことを書くだけで、あとは自動でやってくれるんだ。しかも「今の状態」と「あるべき状態」を比較して差分だけ変更してくれるので、余計なものを壊さず安全に更新できるのも大きな魅力だよ。エンジニアの現場では今や必須スキルになりつつあって、転職市場でも需要がどんどん高まってるよ。
Terraformは「設計図を書く→差分を確認→実行」の3ステップが基本!
⚠️ よくある勘違い
→ AWSの話と一緒に紹介されることが多いから誤解しがちだけど、Terraform自体はAWSとは無関係な独立したツールだよ。
→ 300以上のプロバイダーに対応していて、複数のクラウドを一つのコードでまとめて管理することもできるよ。
[toc]
Terraformって何?インフラをコードで書くってどういうこと?
「インフラ」って何のこと?
まず「インフラ」という言葉から整理しよう。道路や水道を「社会インフラ」と呼ぶように、ITの世界での「インフラ」とは、アプリやWebサービスが動くための土台のことだよ。具体的には、サーバー(コンピューター)・ネットワーク(通信の仕組み)・データベース(データの保存場所)・セキュリティ設定などのことを指すんだ。
たとえば、君がよく使うゲームアプリを思い浮かべてみて。画面上に見えているのはアプリの「見た目」だけど、その裏側ではサーバーがゲームのデータを処理して、データベースがセーブデータを保持して、ネットワークがスマホとサーバーをつないでくれてるんだよ。その「見えない土台」の部分がインフラだよ。
コードで書くとこんなに変わる
従来のやり方だと、クラウドの管理画面をポチポチ操作してサーバーを作ったり設定したりしていたんだけど、これには大きな欠点があったんだよ。手動だから「操作ミス」が起きやすい、どんな設定をしたかの記録が残りにくい、同じ環境をもう一つ作ろうとすると全部また手動でやり直しになる……こういった問題がエンジニアを悩ませてきたんだ。
そこで生まれたのが「Infrastructure as Code(インフラアズコード)」という考え方。つまり、インフラの設定内容をコード(プログラムのような記述)として書き残しておくということ。コードなら何度でも同じ結果を再現できるし、GitHubのようなバージョン管理ツールと組み合わせれば「いつ誰が何を変更したか」も全部記録できるんだよ。Terraformはこの考え方を実現する代表的なツールなんだ。
Terraformの仕組み:3ステップで動く
ステップ1:コードを書く(Write)
Terraformでは、HCL(HashiCorp Configuration Language)というシンプルな言語でインフラの設計図を書くんだよ。たとえば「AWSに仮想サーバー(EC2インスタンス)を1台作って」という内容をHCLで書くと、こんな感じになるよ。
- resource “aws_instance” “my_server” という感じで始める
- ami(マシンイメージのID)やinstance_type(サーバーのスペック)を指定する
- 日本語で言えば「EC2というリソースを、t2.microというサイズで作ってね」という命令書だよ
HCLは英語に近い自然な書き方ができるので、プログラミング経験が少ない人でも比較的読みやすいのが特徴だよ。
ステップ2:差分を確認する(Plan)
コードを書いたら、すぐに実行するんじゃなくて、まず「terraform plan」というコマンドを実行するんだよ。これは「今の状態から、コードに書いた状態にするためには何が変わるか?」を表示してくれるコマンドだよ。
料理で例えるなら、実際に料理する前に「材料の確認リスト」を出してくれるイメージだね。「これを追加します・これを削除します・これは変更なしです」みたいに一覧で見せてくれるから、うっかりミスや予期せぬ変更を事前に防げるんだよ。チームで作業するときもこのplanの結果をレビューしてから実行するのが基本だよ。
ステップ3:実際に実行する(Apply)
planで内容を確認したら、「terraform apply」というコマンドで実際にインフラを構築するんだよ。「本当に実行していいですか?」と確認を求めてくるので、「yes」と答えると自動でサーバーやネットワークが作られていくんだ。数台なら数分、大規模な環境でも数十分でできあがることが多いよ。
手動でポチポチやっていたら半日かかっていた作業が、Terraformなら10分で終わることも珍しくないんだよ。
Terraformが特に便利な場面
同じ環境を複数作りたいとき
エンジニアの現場では「開発環境」「ステージング環境」「本番環境」という3つの環境を用意することが多いんだ。つまり、開発中のコードを試す場所・本番に近い状態でテストする場所・実際にユーザーが使う場所、という3種類のサーバー群を用意するんだよ。
手動でやると3倍の作業量になるけど、Terraformなら設定ファイルを少し書き換えるだけで3つの環境を同じ精度で作れるんだよ。「本番と開発で設定が微妙に違う」という謎のバグも防げるし、本当に助かるよ。
チームで共有・管理したいとき
Terraformのコードはテキストファイルだから、GitHubなどに保存してチームみんなで共有できるんだよ。誰かが設定を変えたら、コードの変更としてレビューできる。つまり「勝手にサーバーの設定を変えてた!」という事故を防げるし、変更の経緯もコード履歴として残るんだよ。
大きな会社では100人以上のエンジニアが同じインフラを触ることもあるから、こういう「変更管理」の仕組みがとても重要なんだよ。
インフラを消したいとき
「terraform destroy」というコマンドを実行すると、Terraformで作ったインフラをまとめて削除できるんだよ。テスト用に作った環境をサクッと消せるから、使わないリソースに無駄なお金を払い続けるリスクが減るよ。クラウドは使った分だけお金がかかるから、不要なものをすぐ消せる仕組みは地味に大事なんだよね。
Terraformを使うメリット・デメリット
メリット:こんなに良いことがある
- 再現性が高い:コードがあれば同じ環境を何度でも作れる。「あの環境、どうやって作ったっけ?」という悩みがなくなるよ
- ミスが減る:手動操作より自動化のほうが人為的なミスが圧倒的に少ないんだよ
- スピードが上がる:100台のサーバーでも数分で用意できる。手動じゃ丸1日かかる作業が一瞬で終わるよ
- マルチクラウドに対応:AWSとGCPを同時に使うような複雑な構成も一つのTerraformコードで管理できるよ
- チーム共有が簡単:コードとしてGitHubに置けば、チーム全員が同じ設計図を見ながら作業できるよ
デメリット:こんな点には注意が必要
- 学習コストがある:HCLの書き方や概念(Stateファイル・Provider・Moduleなど)を理解するまでに時間がかかるよ
- Stateファイルの管理が重要:Stateファイルというのは「今どんな状態か」をTerraformが記録しているファイルのこと。つまり現状の設計図みたいなもので、これが壊れると大変なことになるから慎重に管理する必要があるよ
- クラウド側の仕様変更についていく必要がある:AWSなどが新機能を出したとき、Terraform側のアップデートを待つ必要があることもあるよ
Terraformを始める前に知っておくといい用語
Provider(プロバイダー)
Providerというのは、TerraformがAWSやGCPなどの各サービスと話すための「通訳」みたいなものだよ。つまり、どのクラウドサービスを使うかを最初に宣言するためのモジュールのこと。「私はAWSを使います」と宣言するとAWS用の通訳が起動して、TerraformのコードをAWSが理解できる命令に変換してくれるんだよ。
Resource(リソース)
Resourceとは、Terraformで作る「ものの単位」のことだよ。サーバー1台・データベース1個・ネットワーク設定1つ、それぞれがResourceとして定義されるんだよ。料理で言えば「食材ひとつひとつ」みたいなイメージで、複数のResourceを組み合わせて一つの大きなシステムを作るんだよ。
State(ステート)
Stateというのは「現在の状態」を記録したファイルのことで、つまりTerraformが「今どんなインフラが存在しているか」を把握するためのメモ帳みたいなものだよ。このStateファイルがあるおかげで、次に変更するときに「前と何が変わったか」を計算できるんだよ。チームで使う場合は、このStateファイルをAWSのS3(ストレージサービス)などに保存して共有するのが一般的だよ。
Module(モジュール)
Moduleというのは、よく使う設定をまとめて再利用できるパーツのことで、つまりTerraformにおける「テンプレート」みたいなものだよ。たとえば「Webサーバーの標準構成」をModuleとして作っておけば、次に同じ構成が必要なときは呼び出すだけでOK。コードの重複を避けて、スッキリ管理できるんだよ。公式のModule集(Terraform Registry)には誰でも使える便利なModuleがたくさん公開されてるよ。
