この記事の要点
• terraform planで変更内容を確認、terraform applyで適用
• .tfstateファイルで現実のインフラ状態を追跡
• 変数とモジュールで設定を再利用可能に構造化
基本コマンド
| コマンド | 説明 |
|---|---|
terraform init | プロバイダダウンロード、バックエンド初期化 |
terraform plan | 変更内容のプレビュー |
terraform apply | リソース作成・更新 |
terraform apply -auto-approve | 確認なしで適用 |
terraform destroy | すべてのリソースを削除 |
terraform validate | 設定ファイルの構文チェック |
terraform fmt | コードフォーマット |
ポイント: terraform planは実際には何も変更せず、予定される変更だけを表示します。本番環境では必ず plan を確認してから apply を実行します。
リソース定義
| 構文 | 説明 |
|---|---|
resource "aws_instance" "web" | リソースタイプと名前 |
ami = "ami-123456" | 引数の指定 |
tags = { Name = "web" } | タグの指定 |
count = 3 | 同じリソースを複数作成 |
for_each = var.users | マップやセットで複数作成 |
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "web-server"
Env = "production"
}
}
実践メモ: countはインデックスベース、for_eachはキーベースで複数リソースを作成します。削除時の影響を考えるとfor_each のほうが安全です。
変数
| 構文 | 説明 |
|---|---|
variable "region" { ... } | 変数定義 |
default = "us-east-1" | デフォルト値 |
type = string | 型指定(string, number, bool, list, map) |
var.region | 変数参照 |
description = "AWS region" | 説明文 |
variable "instance_count" {
description = "Number of instances"
type = number
default = 2
}
resource "aws_instance" "app" {
count = var.instance_count
ami = "ami-123456"
instance_type = "t3.micro"
}
ポイント: typeを指定すると入力値の検証が自動で行われます。複雑な構造はobject()やlist(object())で定義できます。
出力値
| 構文 | 説明 |
|---|---|
output "instance_ip" { ... } | 出力定義 |
value = aws_instance.web.public_ip | 出力する値 |
description = "Public IP" | 説明文 |
sensitive = true | 機密情報のマーク |
output "web_public_ip" {
description = "Public IP of web server"
value = aws_instance.web.public_ip
}
注意: sensitive = trueを付けても State ファイルには平文で記録されます。機密情報は環境変数や Secrets Manager で管理してください。
データソース
| 構文 | 説明 |
|---|---|
data "aws_ami" "latest" | 既存リソースの参照 |
data.aws_ami.latest.id | データソースの値を参照 |
filter { ... } | 検索条件の指定 |
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-*-22.04-amd64-server-*"]
}
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
}
実践メモ: dataブロックで既存のインフラ情報を取得できます。AMI の最新版を自動で取得する場合などに便利です。
State 管理
| コマンド | 説明 |
|---|---|
terraform state list | State 内のリソース一覧 |
terraform state show <resource> | リソースの詳細表示 |
terraform state mv <src> <dst> | State 内でリソース移動 |
terraform state rm <resource> | State からリソース削除 |
terraform state pull | State をローカルに取得 |
terraform refresh | 現実のインフラと State を同期 |
注意: terraform state rmは State から削除するだけで、実際のリソースは削除されません。手動で削除するか、再度 import する必要があります。
バックエンド設定
| バックエンド | 用途 |
|---|---|
local | ローカルファイル(デフォルト) |
s3 | AWS S3 + DynamoDB(ロック) |
azurerm | Azure Blob Storage |
gcs | Google Cloud Storage |
remote | Terraform Cloud |
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-lock"
encrypt = true
}
}
ポイント: S3 バックエンドに DynamoDB テーブルを組み合わせると、複数人が同時に apply するのを防ぐロック機能が使えます。
モジュール
| 構文 | 説明 |
|---|---|
module "vpc" { source = "./modules/vpc" } | ローカルモジュール |
module "vpc" { source = "git::..." } | Git リポジトリから |
module "vpc" { source = "terraform-aws-modules/vpc/aws" } | Terraform Registry から |
version = "~> 3.0" | モジュールのバージョン指定 |
module "web_server" {
source = "./modules/ec2"
instance_type = "t3.small"
ami = "ami-123456"
subnet_id = module.vpc.public_subnet_id
}
output "web_ip" {
value = module.web_server.public_ip
}
実践メモ: モジュールは再利用可能な設定のまとまりです。環境ごとに異なるパラメータを渡して、同じ構造のインフラを複数環境にデプロイできます。
ワークスペース
| コマンド | 説明 |
|---|---|
terraform workspace list | ワークスペース一覧 |
terraform workspace new dev | 新規ワークスペース作成 |
terraform workspace select dev | ワークスペース切り替え |
terraform workspace show | 現在のワークスペース表示 |
ワークスペース別設定の例:
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = terraform.workspace == "prod" ? "t3.large" : "t3.micro"
tags = {
Environment = terraform.workspace
}
}
ポイント: ワークスペースは同じコードで複数の環境(dev/stg/prod)を管理できます。State ファイルがワークスペースごとに分離されます。
よく使う関数
| 関数 | 説明 | 例 |
|---|---|---|
lookup(map, key, default) | マップから値を取得 | - |
join(",", list) | リストを文字列に結合 | - |
split(",", str) | 文字列をリストに分割 | - |
file("path") | ファイル内容を読み込み | - |
jsonencode(obj) | オブジェクトを JSON に変換 | - |
format("%s-%s", "web", "01") | 文字列フォーマット | format("%s-%s", var.project, terraform.workspace) |
timestamp() | 現在のタイムスタンプ | Date = timestamp() |
参考リソース
- Terraform CLI Reference - コマンド公式リファレンス
- Terraform Language - HCL 文法
- Terraform Registry - プロバイダとモジュールのレジストリ
- Best Practices - 公式ベストプラクティス
関連記事
- Infrastructure as Code 入門 - IaC の基礎概念
- Ansible チートシート - 構成管理ツールのリファレンス