「エンター」キーを押すのが怖かった夜
あれは、入社3年目の冬のことでした。
私は震える指先で、黒い画面(ターミナル)を見つめていました。
クライアントの本番サーバーの設定変更作業。手順書は完璧に作ったはずです。検証環境でのリハーサルも3回やりました。
でも、怖いんです。
「このコマンドを叩いて、もしサーバーが落ちたら?」
「手順書の『3行目』と『4行目』の間に、私が書き忘れた手順があったら?」
AWSのマネジメントコンソールを開き、マウスを持つ手も汗ばんでいました。クリック一つ間違えれば、サービスが停止し、損害賠償なんて言葉が頭をよぎる世界。
結局、その作業は無事に終わりましたが、終わった頃にはシャツが冷や汗でびっしょりでした。
「こんな綱渡りを、定年まで続けるのか?」
そう思った時、私は絶望しました。インフラエンジニアという仕事は好きだけど、この「オペレーションの恐怖」とは一生付き合っていかなければならないのかと。
そんな私を救ってくれたのが、「Terraform(テラフォーム)」でした。
インフラをコードで書く。
最初は意味がわかりませんでした。「画面でポチポチ設定したほうが直感的で早いやん」とすら思っていました。
でも、実際に使い始めて、世界が一変しました。
恐怖が、確信に変わる。
作業が、クリエイティブな「設計」に変わる。
そして何より、夜、枕を高くして眠れるようになる。
Terraformは、単なる「構成管理ツール」ではありません。エンジニアの寿命を延ばし、精神の安定をもたらす「処方箋」です。
今回は、手動構築(ClickOps)の泥沼でもがいていた私が、Terraformという武器を手に入れてどう変わったのか。そして、なぜ今、副業や転職市場でこのスキルが最強のカードになるのかを、現場のリアルな失敗談と共に語り尽くします。
これは教科書的な解説記事ではありません。
インフラ構築に疲れたあなたに贈る、生存戦略の物語です。

なぜ、手動構築(ClickOps)は破綻するのか
「AWSのコンソール画面、使いやすいじゃん」
初心者の頃はそう思います。GUIは親切だし、ウィザードに従っていけばEC2インスタンス(仮想サーバー)なんて数分で立ち上がります。
でも、案件の規模が大きくなり、運用期間が長くなるにつれて、この「手動ポチポチ構築(ClickOps)」は牙を剥き始めます。
「手順書」という名の、嘘つきな古文書
手動でインフラを作るとき、必ずセットになるのが「手順書」です。ExcelやWikiに貼られたスクリーンショット。「ここをクリック」「次にここを入力」…。
でも、断言します。手順書は、書かれた瞬間から腐り始めます。
AWSの画面レイアウトが変わったら? スクショはもう役に立ちません。
急なトラブル対応で設定を変えたとき、誰がその手順書を更新しましたか? 誰もしていませんよね。
半年後、同じ環境をもう一度作ろうとしたとき、手順書通りにやってもエラーが出る。「手順書には書いてないけど、実はあの時あそこもいじったんだよね」なんて先輩の言葉を聞いた時、殺意を覚えませんか? 私は覚えました。
「開発環境では動いた」の亡霊
開発環境、ステージング環境、本番環境。
これらを完全に一致させるのは、手動では不可能です。
「開発環境のセキュリティグループは開放していたけど、本番では閉じていた」
「DBのパラメータグループの設定が微妙に違った」
こうした些細な「環境差異」が、リリース当日に原因不明のバグを引き起こします。
人間がやることだもの。ミスは起きます。何百箇所もの設定項目を、マウス操作で完璧にコピーするなんて、人間業じゃありません。
変更への恐怖
手動で作られた、誰も全容を把握していない「秘伝のタレ」のようなサーバー。
これに手を加えるのは、ジェンガの後半戦のようなものです。
「ここをいじったら、どこか別の場所が壊れるんじゃないか?」
その恐怖心から、誰もインフラに触りたがらなくなります。結果、塩漬けにされた古いOS、パッチの当たっていないミドルウェアが放置され、セキュリティホールの温床になる。
これが、多くの現場で起きている「インフラの腐敗」です。
Terraformがもたらす「3つの革命」
そんな地獄のような状況を一掃するのが、IaC(Infrastructure as Code)、つまり「インフラをコード化する」というアプローチです。
その代表格であるTerraformを使うことで、私たちの仕事はどう変わるのでしょうか。
1. 「宣言的」に書くことの安心感
Terraformは「手順」ではなく「あるべき状態(ゴール)」を書きます。
「サーバーを立てて、次にネットワークを繋いで…」というシェルスクリプトのような命令ではありません。
「このVPCの中に、このスペックのEC2が2台ある状態にしてね」と定義するだけです。
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
count = 2
tags = {
Name = "HelloWorld"
}
}
これだけでいいんです。
あとはTerraformが、現在の状態とコードを見比べて、「あ、今は0台だから、2台作らなきゃね」と判断して実行してくれます。
もし既に2台あるなら、「あってるね」と言って何もしません(冪等性と言います)。
何度実行しても結果が同じになる。この安心感は絶大です。
2. terraform plan という予知能力
Terraformには、最強のコマンドがあります。terraform plan です。
これを叩くと、「このコードを実行すると、AWS上で何が起きるか」を事前にシミュレーションして教えてくれます。
+ create
aws_instance.web will be created
...
Plan: 1 to add, 0 to change, 0 to destroy.
「これからサーバーを1台追加するよ。削除されるものはないよ」
と、実行前に教えてくれるんです。
手動操作では「適用ボタン」を押すまで何が起きるかわからないドキドキ感がありましたが、Terraformなら「予知」ができます。
「あ、間違えてDBを削除しようとしてる!」なんてミスも、実行前に気づける。
このコマンドのおかげで、私は震えずにエンターキーを押せるようになりました。

3. インフラが「レビュー可能」になる
コードになるということは、GitHubで管理できるということです。
これが革命的です。
インフラの変更をするときは、コードを書き換えてプルリクエスト(PR)を出す。
チームメンバーがそのコードを見て、「あ、ここの設定、セキュリティ的にマズイですよ」とか「インスタンスタイプ、もう一段下げても大丈夫じゃない?」とコメント(レビュー)できるんです。
今までは「作業者の頭の中」や「属人化された手順書」にしかなかったインフラの設計図が、チーム全員の目に触れる場所に公開される。
「誰が、いつ、なぜ、ここを変更したのか」がGitの履歴に残る。
これによって、インフラ構築は「孤独な作業」から「チームでの開発」へと進化しました。

【実録】Terraformで構築するAWS環境のリアル
では、実際にTerraformを使ってどうやってインフラを作っていくのか。現場のリアルな流れをお見せします。
「難しそう」と思うかもしれませんが、基本はパズルと同じです。
Step 1: ディレクトリ構成に悩む
最初はここから始まります。
全部を一つのファイル(main.tf)に書くと、数千行になって管理不能になります。
現場では、環境(dev, stg, prod)ごとや、機能(network, app, db)ごとにディレクトリを分けるのが一般的です。
.
├── envs
│ ├── dev
│ │ └── main.tf
│ └── prod
│ └── main.tf
└── modules
├── network
│ ├── main.tf
│ └── variables.tf
└── compute
└── ...
この「構成決め」が、実は一番の腕の見せ所であり、悩みどころでもあります。
最初は悩みすぎて手が止まることもありましたが、今は「まずはシンプルに、必要になったら分割する」という方針で進めています。完璧な構成なんて最初から作れませんからね。
Step 2: HCL(HashiCorp Configuration Language)との対話
TerraformはHCLという独自の言語で書きます。
これがまた、最初は少し取っつきにくい。「JSONに似てるけどなんか違う」みたいな。
でも、慣れると非常に書きやすいです。
例えば、AWSのVPC(仮想ネットワーク)を作るコード。
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "main-vpc"
}
}
読めますよね? 「aws_vpcというリソースを、mainという名前で定義する。CIDRはこれ」と書いてあるだけです。
VS Codeなどのエディタに入れれば、補完もバリバリ効きます。
「AWSのコンソールでどこの画面に行けばいいんだっけ?」と迷子になるより、ドキュメントを見ながらコードを書くほうがよっぽど早いです。
Step 3: Stateファイルの管理という「聖域」
Terraformを使う上で、絶対に避けて通れないのが「tfstateファイル」です。
これは、Terraformが「今現在のインフラの状態」を記録しておく台帳のようなものです。
このファイルが消えたり、壊れたりすると、Terraformは現状を把握できなくなり、インフラの管理ができなくなります。まさに「聖域」です。
初心者がやりがちなのが、この terraform.tfstate をローカルPCに置いたままにすること。
これだと、チームの他の人が作業できません。
現場では、このファイルをAWSのS3(ストレージ)に保存し、DynamoDBを使って排他制御(誰かが作業中はロックする)を行うのが鉄板の構成です。
この「State管理のバックエンド構築」が、Terraform導入の最初のハードルかもしれません。でも、これを乗り越えれば快適なIaCライフが待っています。

副業・フリーランス市場におけるTerraformの価値
ここで少し、お金の話をしましょう。
あなたがもし、エンジニアとして副業をしたり、フリーランスとして独立を考えているなら、Terraformは「最強の単価アップツール」になります。
「環境構築」が商品になる
Web制作の案件で、「アプリを作って納品」だけでなく、「インフラ構築のコードも納品」できるようになると、どうなるか。
クライアントにとっては、「いつでも同じ環境を再現できる」「他の業者に引き継ぎやすい」というメリットがあります。
これは大きな付加価値です。
「AWSコンソールで手動で作りました。設定内容は画面を見て確認してください」というエンジニアと、
「構築内容は全てTerraformのコードで残してあります。コマンド一発で同じ環境が作れます」というエンジニア。
どちらに高い報酬を払いたいかは明白ですよね。
高単価案件の必須スキル
最近のクラウド案件、特にモダンな開発現場の募集要項を見てみてください。
「AWS」とセットで、ほぼ間違いなく「Terraform」か「CloudFormation」と書かれています。
IaCができないと、そもそも応募すらできない案件が増えているんです。
逆に言えば、Terraformが書けるだけで、選べる案件の幅が一気に広がり、単価レンジも一段階上がります。
実際に私も、Terraformでのインフラリプレイス案件だけで、かなりの報酬をいただいてきました。それは、既存のスパゲッティ化した手動インフラを、綺麗なコードに書き換えて整理整頓する仕事です。
「散らかった部屋を片付ける」ような仕事ですが、企業の需要は凄まじく高いです。
実践アドバイス:現場で泣かないための「勘所」
Terraformは魔法の杖ですが、使い方を間違えると自分を攻撃してきます。
私が現場で踏み抜いた地雷と、そこから得た教訓をシェアします。
既存インフラのインポートは地獄の入り口
「すでにある手動で作ったAWS環境を、Terraform化してほしい」
この依頼はよく来ますが、覚悟してください。地獄です。terraform import というコマンドで既存リソースをコードに取り込めるのですが、パラメータの一つ一つを現在の設定と合わせる作業は、砂浜で砂金を探すような虚無感があります。
最近はツールも進化して多少マシになりましたが、それでも「ゼロから作る」ほうが100倍楽です。
この案件を受けるときは、十分な工数(見積もり)を確保することを強くおすすめします。
terraform destroy の魔力
terraform destroy。
これは、コードで定義されたリソースを全て削除するコマンドです。
コマンド一発で、本番環境の全てを消し去ることができます。核ボタンのようなものです。
もちろん確認プロンプトは出ますが、手癖で yes と打ってしまったら…。
本番環境(Production)では、このコマンドを実行できないように権限を絞るか、削除保護(prevent_destroy)の設定を入れておくこと。これは命綱です。
バージョンアップの激流
Terraform自体のバージョンアップも早いですし、AWSプロバイダ(AWSを操作するためのプラグインのようなもの)の更新も頻繁です。
半年放置したコードは、大抵そのままでは動きません。
「塩漬けにしない」ことが重要です。定期的に terraform init -upgrade をして、こまめに追従していく。これが一番の近道です。

FAQ:よくある質問
Terraformについて、同僚や後輩からよく聞かれる質問に答えておきます。
Q. AWS CloudFormationじゃダメですか?
A. ダメではありません。CloudFormationはAWS純正なのでサポートも安心です。ただ、記述量が多くなりがちなのと(JSON/YAML)、AWS以外(GCPやAzure、Datadogなど)には使えないのが難点です。
Terraformはマルチクラウド対応なので、将来的に他のクラウドを使う可能性や、学習コストのコスパを考えると、個人的にはTerraform推しです。
Q. Ansibleとはどう違いますか?
A. 役割が違います。
Terraformは「サーバーそのものやネットワーク」を作るツール(オーケストレーション)。
Ansibleは「立ち上がったサーバーの中身(設定ファイルやソフトのインストール)」を整えるツール(構成管理)。
最近はコンテナ(Docker)やサーバーレスが主流になり、サーバーの中身をいじることが減ったので、Terraformだけで完結することも多いですが、EC2の中身を細かく設定するならAnsibleとの併用がベストです。
Q. 未経験からどうやって勉強すればいいですか?
A. いきなり本を読んでも眠くなるだけです。
まずはAWSの無料枠を使って、簡単なEC2を1台、Terraformで立ててみてください。
そして、そのEC2を terraform destroy で壊す。
「作る→壊す」がコマンド一つでできる快感を味わえば、もう手動には戻れなくなります。そこから少しずつ、VPCを作ったり、ALBをつけたりして広げていけばいいんです。
インフラを「資産」に変える魔法
ここまで、Terraformのメリットや現場のリアルについて語ってきました。
かつて、インフラ構築は「職人芸」でした。
神業のようなコマンド入力、秘伝の手順書、その人にしかわからない設定の癖。
それはそれでカッコよかったかもしれませんが、ビジネスとしてはリスクでしかありませんでした。
Terraformは、その「職人芸」を「資産」に変えました。
誰でも読めて、誰でも実行できて、バージョン管理ができる「コード」という資産に。
私があの震える夜から解放されたのは、Terraformが「失敗してもやり直せる世界」を見せてくれたからです。
コードを書いて、plan で確認して、apply する。
もし間違っていたら、コードを直してまた apply すればいい。
このサイクルが、エンジニアとしての心理的安全性をどれだけ高めてくれたか、言葉では言い表せません。
インフラをコード化することは、単なる効率化ではありません。
「インフラを支配下に置く」ということです。
得体の知れないブラックボックスだったサーバー群が、自分の指先一つでコントロールできる忠実な配下になる。その全能感は、一度味わうと病みつきになります。
もしあなたが、まだコンソール画面でのポチポチ作業に消耗しているなら。
手順書の更新にうんざりしているなら。
今すぐ、エディタを開いて main.tf というファイルを作ってみてください。
そこには、震える夜とは無縁の、自由でクリエイティブなインフラの世界が広がっています。

さあ、最初の一行を書き始めましょう。resource "aws_instance" "hello_world" { ... }
その一行が、あなたのインフラエンジニアとしての新しい章を開く鍵になります。
エラーが出ても大丈夫。plan が未来を教えてくれます。
今日から、インフラはあなたのものです。
