※本記事にはプロモーション(広告)を含みます。

Terraformでインフラを自動化するなら、まず既存インフラの状態をterraform importで取り込み、State管理をローカルからリモートバックエンドに切り替えることから始めてください。手作業でのサーバー構築やコンソール操作をコード化することで、構成のズレを防ぎ、変更履歴をGitで追跡できるようになります。本記事ではHCLの基本文法から実務でのState設計、モジュール化、他ツールとの違いまでを整理します。

目次

  • Terraformとは
  • 導入と初期設定
  • State管理の実務
  • モジュール設計
  • 他ツールとの比較
  • 運用時の注意点

Terraformとは

Terraformは、HashiCorpが開発したInfrastructure as Code(IaC)ツールです。AWS、Azure、Google Cloudなど複数のクラウドプロバイダーに対して、共通のHCL(HashiCorp Configuration Language)でリソース定義を記述し、同じワークフローでプロビジョニングできる点が特徴です。仮想マシンやネットワーク、データベース、IAMポリシーといったリソースをコードとして表現するため、構築手順書に頼らずインフラの状態を再現できます。

HCL構文の特徴

HCLはJSONと互換性を持ちながら、人間が読みやすい記法を採用しています。resourceブロックでリソースの種類と名前を宣言し、その中に必要な属性を列挙する構造です。変数はvariableブロック、出力値はoutputブロックで定義し、複数の環境で同じコードを使い回せるように設計します。コメントは#または//で記述でき、可読性を保ちながら意図を残せます。

宣言型IaCの利点

Terraformは宣言型のツールです。実行手順をスクリプトで記述するのではなく、「最終的にどのような状態であるべきか」を定義し、現状との差分をTerraform自身が計算して適用します。この仕組みにより、同じコードを何度実行しても結果が変わらない冪等性が担保されます。手動でリソースを変更した場合でも、次回のplan実行時に差分として検出できるため、構成ドリフトの早期発見につながります。

導入と初期設定

導入時は公式サイトからバイナリを取得するか、HomebrewやChocolateyといったパッケージマネージャーを利用します。バージョンによってコマンド仕様やプロバイダーの互換性が変わるため、実際の導入時は必ず公式ドキュメントで対象バージョンの仕様を確認してください。

インストール手順

macOSであればbrew install terraform、Windowsであれば公式配布のzipファイルを展開してPATHに追加する方法が一般的です。導入後はterraform versionで動作確認を行い、使用するクラウドのCLI(AWS CLIやAzure CLIなど)で認証情報を設定しておきます。認証情報はコード内に直接書き込まず、環境変数や後述するシークレット管理の仕組みを使う設計が推奨されます。

基本コマンド流れ

プロジェクトディレクトリで最初に実行するのがterraform initです。これによりプロバイダープラグインがダウンロードされ、バックエンドの初期化が行われます。続いてterraform planで適用予定の差分を確認し、内容に問題がなければterraform applyで実際にリソースを作成・変更します。不要になったリソースはterraform destroyで削除できますが、本番環境での実行は影響範囲を十分に確認してから行う必要があります。

項目TerraformAnsibleAWS CloudFormationPulumi
記述言語HCLYAMLJSON/YAMLTypeScript/Python等の汎用言語
対応クラウドマルチクラウド対応マルチクラウド対応AWS専用マルチクラウド対応
実行方式エージェントレス・宣言型エージェントレス・手続き型中心宣言型宣言型(コード生成)
State管理tfstateファイルで管理基本的に状態ファイルなしAWS側で管理独自のState管理あり
主な用途インフラ構築・変更管理構成管理・アプリ配布AWSリソースの構築プログラミング言語でのIaC

State管理の実務

Terraformは実際に作成したリソースの情報をterraform.tfstateというファイルに記録します。このStateファイルには機密情報が含まれる場合があるため、Gitリポジトリに直接コミットする運用は避けるべきです。チームで運用する場合は、リモートバックエンドを使った一元管理が前提になります。

リモートバックエンド

AWSであればS3バケット、AzureであればStorage Account、Google CloudであればCloud Storageをバックエンドとして指定し、Stateファイルを共有ストレージに保存する構成が一般的です。加えてTerraform CloudやTerraform Enterprise、あるいはAtlantisのようなCI連携ツールを使うと、apply履歴やplan結果をチームで可視化しながら運用できます。バックエンド設定はbackendブロックで宣言し、初期化時に接続情報を指定します。

ロックとチーム運用

複数人が同時にapplyを実行すると、Stateファイルの競合が発生します。S3バックエンドの場合はDynamoDBを使ったState Lockingを組み合わせることで、同時実行を防止できます。Terraform Cloudを利用する場合はロック機能が標準で組み込まれており、追加のインフラを用意せずに排他制御を実現できます。プルリクエストベースでplan結果をレビューしてからapplyする運用にすると、意図しない変更の混入を防ぎやすくなります。

モジュール設計

同じような構成を複数の環境(開発・検証・本番)で繰り返し使う場合、モジュール化によってコードの重複を減らせます。モジュールは変数を受け取り、内部でリソースを定義し、出力値を返す単位として設計します。

再利用可能な構成

ネットワークやVPC、Kubernetesクラスタといった単位でモジュールを切り出すと、環境ごとに変数だけを差し替えて同じロジックを適用できます。HashiCorpが公開しているTerraform Registryには、AWSやAzure向けの公式モジュールが多数登録されており、車輪の再発明を避けたい場合の参考になります。ただし外部モジュールを利用する際は、バージョンを固定し、意図しない仕様変更が本番環境に影響しないようにする配慮が必要です。

ディレクトリ構造

実務でよく見られる構成は、環境ごとのディレクトリ(environments/dev、environments/prodなど)を分け、それぞれから共通のmodulesディレクトリを参照する形です。この構造により、開発環境での検証が本番環境の設定ファイルに直接影響しないよう分離できます。ワークスペース機能を使って単一のコードベースで環境を切り替える方法もありますが、環境間の差異が大きい場合はディレクトリ分割の方が管理しやすい傾向があります。

他ツールとの比較

IaCツールにはTerraform以外にも複数の選択肢があり、それぞれ得意領域が異なります。

Ansibleとの違い

Ansibleは構成管理ツールとして、既存サーバーへのミドルウェア導入やアプリケーションのデプロイに強みがあります。Terraformはインフラそのもの、つまりサーバーやネットワークの「箱」を作る工程を担い、その後の設定作業をAnsibleに任せる組み合わせもよく採用されます。両者はState管理の考え方が異なり、Ansibleは基本的に実行時の状態を記録しないため、冪等性の担保は各タスクの書き方に依存します。

AWS専用ツールとの差

AWS CloudFormationはAWSが提供する純正のIaCサービスで、AWSリソースとの親和性が高く、追加の認証設定が不要な点が利点です。一方でマルチクラウド構成やオンプレミスとの併用を想定する場合、単一クラウドに縛られないTerraformの方が構成をまとめやすくなります。PulumiはHCLではなくTypeScriptやPythonといった汎用プログラミング言語でインフラを定義できるツールで、既存のソフトウェア開発の知識をそのまま活かしたいチームに選ばれる傾向があります。

運用時の注意点

Terraformを本番運用に組み込む際は、コードの書き方だけでなく権限管理やレビュー体制の設計も欠かせません。

権限管理と秘密情報

クラウドの認証情報やAPIキーをコードに直書きすると、リポジトリの閲覧権限を持つ全員に機密情報が漏れる状態になります。環境変数への設定、AWS Secrets ManagerやHashiCorp Vaultといったシークレット管理サービスとの連携、またはCI/CDパイプライン側でのシークレット注入といった方法を組み合わせ、コード上に平文の認証情報を残さない設計が求められます。IAMロールについても、Terraform実行用のロールに必要最小限の権限だけを付与する設計が安全です。

変更差分の確認

terraform applyを実行する前には、必ずterraform planの出力を確認し、意図しないリソースの削除や置き換えが含まれていないかをチェックします。特にリソースの一部属性を変更しただけのつもりが、内部的にはリソースの再作成(destroy&create)として扱われるケースがあり、稼働中のデータベースなどでは注意が必要です。CI上でplan結果をコメントとして自動投稿する仕組みを組み込むと、レビュー時に差分を見落としにくくなります。セキュリティ設定やIAMポリシーの変更は特に影響範囲が大きいため、適用前の確認体制を自組織の責任で整備してください。

よくある質問

Q. tfstateは誰が管理する?

チームで運用する場合はS3やAzure Storageなどのリモートバックエンドで一元管理します。個人のローカル環境にだけ保存する運用は、担当者の入れ替わりや端末故障でState情報を失うリスクがあります。

Q. applyが失敗したらどうする?

まずエラーメッセージでどのリソースが原因かを特定し、terraform planを再実行して現在の差分を確認します。部分的に作成されたリソースが残っている場合は、terraform state listで状態を確認したうえで、必要に応じて手動でリソースを削除するか、再度applyを試みます。

Q. 学習にどれくらいかかる?

基本的なリソース作成やplan/applyの流れは、クラウドの基礎知識があれば数日程度で把握できます。目安として、モジュール設計やState管理を含めた実務レベルの運用まで理解するには、実際のプロジェクトでの試行錯誤を含めて数週間から数か月程度を見込んでおくと現実的です。

Q. HashiCorpのライセンス変更の影響は?

HashiCorpは2023年にTerraformのライセンスをオープンソースのMPLからBusiness Source License(BSL)に変更しました。これを受けてLinux Foundation傘下でOpenTofuというフォークプロジェクトが立ち上がっています。商用利用の条件は変更内容やバージョンによって異なるため、企業で採用する際はHashiCorp公式サイトおよびOpenTofu公式サイトで最新のライセンス条項を確認してください。

Q. Terraform Cloudは必須?

必須ではありません。小規模なチームであればS3などのセルフホスト型バックエンドでも十分に運用できます。plan/apply履歴の可視化やポリシーチェック(Sentinelなど)をチームで共有したい場合に、Terraform Cloudやその他のCI連携ツールを検討する流れが一般的です。

関連記事

まとめ

Terraformによるインフラ自動化は、HCLでリソースを宣言し、plan/applyのサイクルで差分を管理する仕組みが土台になります。導入初期はローカルでの試行から始め、チーム運用に入る段階でリモートバックエンドとState Lockingを整備し、環境が増えてきたらモジュール化でコードの重複を減らしていく流れが実務では扱いやすい進め方です。AnsibleやCloud Formation、Pulumiとの違いを理解したうえで、自組織のクラウド構成やチーム体制に合わせてツールを選定してください。認証情報の管理やIAM権限の設計、apply前の差分確認は、いずれも自組織の責任で運用ルールを定め、公式ドキュメントの最新情報とあわせて継続的に見直していく対象です。

【編集・制作ポリシー】
本記事はInfra Academy編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。 編集ポリシーはこちら
ABOUT ME
たから
フリーランスIT講師/エンジニア。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900//サーティファイC言語/情報処理技術者 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営