最終更新:

【仕組み解説】Terraformはどうやってインフラをコード管理しているのか — IaCの仕組みを図解


Terraform ワークフロー HCL Code .tf ファイル init Plan 差分を確認 Apply リソース作成・変更 Cloud AWS / GCP Azure State ファイル terraform.tfstate(現在の状態を記録) 比較 更新 Provider AWS / GCP / Azure GitHub / K8s など モジュール 再利用可能な リソースのセット リモート State S3 + DynamoDB Terraform Cloud
Terraform のワークフローと主要コンポーネント
ひよこ ひよこ

Terraformってよく聞くけど、そもそも何をするツールなの?

ペンギン先生 ペンギン先生

一言でいうと「インフラをコードで管理するツール」だよ。サーバーネットワークデータベースなんかを、手作業でポチポチ設定するんじゃなくて、コードとして書いておいて自動で構築・変更できるようにするんだ。これを IaCと呼ぶんだよ。

ひよこ ひよこ

手作業で設定するのって何がダメなの?

ペンギン先生 ペンギン先生

手作業だと「誰がいつ何を変えたか分からない」「同じ環境をもう一度作れない」「設定ミスに気づけない」っていう問題が起きるんだ。コードにしておけばGitバージョン管理できるし、レビューもできる。本番環境ステージング環境を同じコードから作れるのも大きなメリットだね。

ひよこ ひよこ

Terraformのコードってどんな言語で書くの?

ペンギン先生 ペンギン先生

HCL(HashiCorp Configuration Language)という専用言語を使うよ。たとえばAWSのEC2インスタンスを作りたいなら、resourceブロックの中に「ami はこれ」「instance_type は t3.micro」みたいに宣言的に書くんだ。プログラミング言語みたいにループを書くわけじゃなくて「こういう状態にしてほしい」と宣言するスタイルだよ。

ひよこ ひよこ

書いたコードはどうやって実行するの?

ペンギン先生 ペンギン先生

3つのコマンドが基本になるよ。まず「terraform init」でプロジェクトを初期化してプラグインをダウンロードする。次に「terraform plan」で「今の状態からこう変わりますよ」という差分を表示する。内容を確認して問題なければ「terraform apply」で実際にクラウド上にリソースを作成・変更するんだ。いきなり変更が適用されないから安全だね。

ひよこ ひよこ

「今の状態」ってどうやって覚えてるの?

ペンギン先生 ペンギン先生

いい質問だね!Terraformには「Stateファイル」という仕組みがあるよ。terraform.tfstate というJSONファイルに、今クラウド上に実際に存在するリソースの情報が記録されるんだ。planコマンドはこのStateファイルとコードを比較して差分を計算してるんだよ。だからStateファイルが壊れたり消えたりすると大変なことになる。

ひよこ ひよこ

Stateファイルってローカルに置いておくと危なくない?チームで使うときとか…

ペンギン先生 ペンギン先生

その通り!チーム開発では「リモートState」を使うのが鉄板だよ。たとえばAWSならS3バケットにStateファイルを保存して、DynamoDBでロックをかける構成が一般的だね。これで複数人が同時にapplyして衝突する事故を防げるんだ。Terraform Cloudを使えばリモートStateの管理に加えて、planの実行やapplyの承認フローまで一元管理できるよ。

ひよこ ひよこ

AWSとかGCPとか、いろんなクラウドに対応してるってホント?

ペンギン先生 ペンギン先生

Providerという仕組みで対応してるんだ。AWS Provider、GCP Provider、Azure Providerなど、各クラウドの公式Providerがあって、terraform initのときに必要なProviderプラグインが自動でダウンロードされるよ。クラウドだけじゃなくて、GitHubDatadogKubernetesなど数千種類のProviderがあるんだ。

ひよこ ひよこ

コードが増えてくると管理が大変そうだけど、整理する方法ってあるの?

ペンギン先生 ペンギン先生

モジュール」という仕組みがあるよ。よく使うリソースのセットをモジュールとしてまとめておけば、別のプロジェクトでも再利用できるんだ。たとえば「VPCサブネット+セキュリティグループ」をネットワークモジュールとして切り出しておくイメージだね。Terraform Registryには公式やコミュニティが作ったモジュールが公開されていて、そのまま使うこともできるよ。

ひよこ ひよこ

AWSにはCloudFormationっていう似たサービスがあるよね?Terraformとどう違うの?

ペンギン先生 ペンギン先生

CloudFormationAWS専用のIaCサービスで、YAMLJSONテンプレートを書くよ。AWS内で完結するならCloudFormationでも十分だけど、Terraformの強みは「マルチクラウド対応」と「Providerエコシステムの広さ」だね。AWSGCPを両方使う環境や、クラウド以外のSaaSも一緒に管理したいときはTerraformが圧倒的に便利だよ。

ひよこ ひよこ

Terraformって結構奥が深いんだね…!

ペンギン先生 ペンギン先生

最近はOpenTofuというオープンソースのフォークも登場して、IaCツールの選択肢が広がっているよ。でもTerraformの基本的な考え方 ——「宣言的にインフラを定義して、plan で確認してから apply する」—— はIaCの王道パターンだから、これを理解しておけば他のツールにも応用が利くよ。まずは小さなリソースから試してみるのがおすすめだね。