サーバーの設定手順が担当者の頭の中にしかない、手作業でのインフラ構築でミスが繰り返される――こうした課題に心当たりはありませんか?インフラ管理の属人化は、中小企業にとって大きなリスクです。
この記事では、インフラ構成をコードで管理するIaCツール「Terraform」の基礎から実践的な使い方までを解説します。少人数のIT体制でも無理なく始められるインフラ自動化の第一歩を踏み出しましょう。Terraformの概要から知りたい方はTerraformとは?IaC入門解説もあわせてお読みください。
Terraformとは?中小企業が知るべきIaCの基本
「サーバーを立てるたびに、前回どうやったか思い出すのに時間がかかる…」「担当者が休むと誰も対応できない…」
中小企業のIT担当者にとって、インフラ管理の属人化や手作業によるミスは深刻な課題です。Terraformは、こうした課題を解決するIaC(Infrastructure as Code)ツールとして注目を集めています。
この記事では、Terraform入門として、IaCの基礎から実践的な使い方まで、中小企業でも無理なく始められる方法を解説します。
IaC(Infrastructure as Code)とは
IaCとは、インフラの構成をコードで記述・管理する手法です。従来のように管理画面をクリックして手作業で設定するのではなく、設定内容をコードとして記述し、実行することでインフラを構築します。
サーバー起動、ネットワーク設定、データベース構築など、すべての作業をコード化できます。例えば「2vCPU、4GBメモリのWebサーバーを東京リージョンに立てる」という作業を、数十行のコードで表現可能です。
最大のメリットは再現性です。同じコードを実行すれば、何度でも同じ環境を構築できます。Gitで管理すれば、誰が・いつ・何を変更したかが明確になり、必要に応じて過去の状態に戻すことも可能です。
Terraformが選ばれる3つの理由
1. マルチクラウド対応
Terraformは、AWS、Azure、Google Cloudなど3,000以上のプロバイダーに対応しています。CloudFormationやAzure Resource Managerといった各クラウド専用ツールと異なり、クラウド移行時もコードの書き直しが最小限で済みます。
2. 宣言的な記述方法
「どうやって作るか」ではなく「何を作りたいか」を記述する宣言的アプローチを採用。コードがシンプルで理解しやすく、メンテナンスも容易です。
3. 段階的な導入が可能
既存インフラはそのままに、新しいリソースだけTerraformで管理することも可能です。すべてを一度に移行する必要がなく、小さく始めて徐々に拡大できます。
従来の手作業との違い
| 項目 | 従来の手作業 | Terraform |
|---|---|---|
| 作業方法 | コンソールで手動設定 | コードを実行 |
| ドキュメント | ExcelやWordで別管理 | コード自体がドキュメント |
| 再現性 | 担当者の記憶に依存 | 誰でも同じ結果を再現可能 |
| 変更履歴 | 追跡が困難 | Gitで完全に追跡可能 |
| 環境複製 | 手作業で再設定が必要 | コードコピーで瞬時に複製 |
特に重要なのは、インフラ構築が「その都度行う作業」から「バージョン管理されたコード」に変わることです。ソフトウェア開発と同じように品質管理ができるようになります。
Terraformで解決できる中小企業の4つの課題
1. インフラ構築の属人化問題
「あの設定、前任者しか知らない…」という状況は、中小企業でよく見られます。Terraformを導入すると、すべての設定がコードとして可視化されます。
resource "aws_instance" "web_server" {
ami = "ami-0c3fd0f5d33134a76"
instance_type = "t3.small"
tags = {
Name = "本番Webサーバー"
Environment = "production"
}
}
このコードを見れば、誰でも「t3.smallのインスタンスで、本番環境のWebサーバー」と理解できます。コメントを追加すれば、設定の意図も残せます。
Gitで管理することで、変更履歴も完全に記録されます。「誰が、いつ、なぜ変更したか」がコミットメッセージとして残り、後から振り返ることも容易です。
2. 設定ミスや対応漏れの防止
手作業では、セキュリティグループの設定ミス、バックアップ設定の忘れ、環境間の設定差異などのヒューマンエラーが発生します。
Terraformでは、コードレビューの仕組みを活用できます。担当者がコードを書き、チームメンバーがレビューし、問題なければマージして適用というプロセスにより、設定ミスを事前に発見できます。
また、terraform planコマンドで実際に変更される内容を事前確認できるため、「意図しない変更」を防げます。
$ terraform plan
Plan: 1 to add, 0 to change, 0 to destroy.
変更内容を確認してから適用できるため、安心して作業できます。
3. 新人教育・引き継ぎ時間の削減
Terraformのコードは生きたドキュメントとして機能します。
# データベース設定
resource "aws_db_instance" "main" {
# 本番DBはdb.t3.mediumを使用(顧客データ約10万件を想定)
instance_class = "db.t3.medium"
# 自動バックアップは毎日午前3時(JST)に実施
backup_retention_period = 7
backup_window = "18:00-19:00" # UTC
}
コードとコメントを見れば「なぜその設定なのか」が分かります。新メンバーは実際のコードを読むことで、実践的な知識を身につけられます。
検証環境であれば、新人が実際にコードを書いて実行し、すぐに削除するという安全な学習も可能です。
4. 複数環境の管理を効率化
開発環境、検証環境、本番環境など、複数の環境を手作業で管理すると、環境ごとに同じ作業を繰り返し、設定差異が生じやすくなります。
Terraformでは、変数を使った環境の切り替えが可能です。
variable "environment" {
type = string
}
locals {
instance_types = {
development = "t3.micro"
staging = "t3.small"
production = "t3.medium"
}
}
resource "aws_instance" "app_server" {
instance_type = local.instance_types[var.environment]
}
同じコードで全環境を構築でき、環境ごとの差異は変数で管理できます。「本番環境だけ設定が違っていた」というトラブルを防げます。
Terraformの基本的な仕組み
動作フローと基本用語
Terraformは4つのステップで動作します。
- Write: HCL言語でコードを記述(.tfファイル)
- Plan:
terraform planで変更内容を確認(実際には何も変更しない) - Apply:
terraform applyで実際にインフラを構築・変更 - Manage: コードを変更して継続的に管理、不要なら
terraform destroyで削除
この仕組みは、「現在の状態」と「あるべき姿(コード)」を比較して、差分だけを適用するというものです。
知っておくべき基本用語
- Provider: 使用するクラウドサービスを指定(AWS、Azureなど)
- Resource: 実際に作成するインフラの構成要素(サーバー、データベースなど)
- State: 現在のインフラの状態を記録したファイル(terraform.tfstate)
- Variable: 繰り返し使う値や環境ごとに変える値
- Output: 構築後に確認したい情報(IPアドレスなど)
Stateファイルの重要性: Stateファイルを削除すると、Terraformは既存のインフラを認識できなくなります。必ずバックアップを取り、チームで共有する場合はS3などのリモートストレージに保存しましょう。
HCL(HashiCorp Configuration Language)
HCLは、Terraformで使われる設定記述言語です。JSONに似ていますが、より人間が読み書きしやすい設計です。
# 基本構文
resource "リソースタイプ" "リソース名" {
引数名 = 値
nested_block {
引数名 = 値
}
}
プログラミング経験がなくても、YAMLやJSONを触ったことがあれば、すぐに慣れるでしょう。
Terraformの導入準備
インストール方法
Terraformは単一のバイナリファイルとして配布されており、インストールは簡単です。
Macの場合(Homebrew)
$ brew tap hashicorp/tap
$ brew install hashicorp/tap/terraform
$ terraform version
Windowsの場合(Chocolatey)
> choco install terraform
> terraform version
Linux・手動インストール
$ wget https://releases.hashicorp.com/terraform/1.6.0/terraform_1.6.0_linux_amd64.zip
$ unzip terraform_1.6.0_linux_amd64.zip
$ sudo mv terraform /usr/local/bin/
AWSアカウントの準備と認証設定
1. IAMユーザーの作成
セキュリティのため、ルートユーザーではなくIAMユーザーを作成します。AWSコンソールからIAMサービスを開き、「プログラムによるアクセス」を選択してユーザーを作成。アクセスキーIDとシークレットアクセスキーを保存します。
2. AWS CLIの設定
$ brew install awscli # Macの場合
$ aws configure
AWS Access Key ID: YOUR_ACCESS_KEY
AWS Secret Access Key: YOUR_SECRET_KEY
Default region name: ap-northeast-1
3. 認証情報の確認
$ aws sts get-caller-identity
アカウント情報が表示されれば設定完了です。
セキュリティのポイント: アクセスキーは絶対にGitにコミットしない。.gitignoreに認証情報ファイルを追加し、本番環境ではIAMロールの使用を推奨します。
エディタの設定
Visual Studio Code(VSCode)が最もおすすめです。
必須の拡張機能
1. HashiCorp Terraform: シンタックスハイライト、自動補完、フォーマット機能
2. AWS Toolkit: AWSリソースの確認が可能
推奨設定(settings.json)
{
"terraform.languageServer.enable": true,
"[terraform]": {
"editor.formatOnSave": true
}
}
実践:最初のインフラ構築
実際にEC2インスタンスを1台構築してみましょう。
コードの作成
main.tf
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
data "aws_ami" "amazon_linux_2" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["amzn2-ami-hvm-*-x86_64-gp2"]
}
}
resource "aws_instance" "example" {
ami = data.aws_ami.amazon_linux_2.id
instance_type = "t2.micro"
tags = {
Name = "Terraform-Practice"
}
}
outputs.tf
output "instance_id" {
value = aws_instance.example.id
}
output "public_ip" {
value = aws_instance.example.public_ip
}
実行手順
1. 初期化
$ terraform init
Providerプラグインがダウンロードされ、.terraformディレクトリが作成されます。
2. 変更内容の確認
$ terraform plan
何が作成されるかが表示されます。エラーがないか確認しましょう。
3. 実行
$ terraform apply
確認プロンプトでyesと入力すると、実際にEC2インスタンスが作成されます。
4. 確認
$ terraform show
作成されたリソースの詳細が表示されます。AWSコンソールでも確認できます。
5. 削除
$ terraform destroy
練習後は必ず削除して、不要な料金が発生しないようにしましょう。
実務で使えるベストプラクティス
変数とtfvarsファイルの活用
環境ごとに異なる値は変数化します。
variables.tf
variable "environment" {
type = string
}
variable "instance_type" {
type = string
default = "t3.micro"
}
terraform.tfvars
environment = "production"
instance_type = "t3.medium"
変数ファイルを環境ごとに用意すれば、同じコードで複数環境を管理できます。
State管理のリモート化
Stateファイルをローカルに保存すると、チームでの共有が困難です。S3にリモート保存することを推奨します。
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "ap-northeast-1"
}
}
これにより、チーム全員が同じStateファイルを参照でき、同時編集のロックも可能になります。
モジュール化で再利用性を高める
よく使う構成はモジュール化して再利用します。
modules/
├── network/
│ ├── main.tf
│ └── variables.tf
└── compute/
├── main.tf
└── variables.tf
モジュールを呼び出すことで、コードの重複を避け、メンテナンス性が向上します。
よくあるつまずきポイントと解決策
Stateファイルの不整合エラー
症状: 「リソースが既に存在する」というエラーが出る
解決策:
- terraform importで既存リソースをStateに取り込む
- Stateファイルのバックアップから復元
- 最終手段としてterraform state rmで該当リソースを削除
Provider認証エラー
症状: 「認証情報が見つからない」というエラー
解決策:
- aws configureが正しく設定されているか確認
- 環境変数AWS_PROFILEが正しいか確認
- IAMユーザーに必要な権限があるか確認
リソース削除時の依存関係エラー
症状: 「他のリソースが依存しているため削除できない」
解決策:
- 依存しているリソースから順に削除
- terraform destroy -targetで特定リソースを指定削除
- コード内でdepends_onを明示的に指定
何から始めればいいかわからない
推奨ステップ:
1. まずは検証環境で小さなリソース(EC2 1台)から始める
2. 慣れてきたら変数化や複数リソースに挑戦
3. Gitでバージョン管理を開始
4. チームでコードレビューの仕組みを導入
5. 本番環境への適用を検討
焦らず、段階的に進めることが成功の鍵です。
まとめ:自社に合ったIaC導入を進めるために
Terraform導入で得られる効果
- 属人化の解消: 設定がコード化され、誰でも理解可能に
- ミスの削減: コードレビューと事前確認で設定ミスを防止
- 効率化: 環境構築時間を数時間から数分に短縮
- 安心感: 変更内容を事前確認でき、いつでも元に戻せる
自社に「ちょうどいい仕組み」を作るには
大企業のような完璧な仕組みを目指す必要はありません。中小企業には、中小企業に合った「ちょうどいい」規模のIaC導入があります。
- 最初は新規リソースだけTerraformで管理
- 完璧なモジュール化より、まず動かすことを優先
- チームの習熟度に合わせて徐々に高度化
Terraform入門として、まずは小さく始めて、徐々に拡大していくアプローチが成功の秘訣です。
Harmonic Societyがサポートできること
Harmonic Societyは、中小企業の「ちょうどいいデジタル化」を支援しています。
- Docker ComposeやKubernetesと組み合わせたインフラ構築、Terraform導入コンサルティング
- 既存インフラのコード化支援
- チーム向けの実践的な研修
- 運用フェーズまでの伴走サポート
「何から始めればいいかわからない」「自社に合った進め方を知りたい」という方は、お気軽にご相談ください。テクノロジーと人間性の調和を大切に、あなたのビジネスに最適なソリューションをご提案します。