Terraform
エンジニアのためのWebチートシート
Terraformは、HashiCorpが開発したIaC(Infrastructure as Code)ツールです。 HCL(HashiCorp Configuration Language)でインフラをコードとして定義し、マルチクラウド環境を宣言的に管理できます。 CLIコマンド、HCL構文、リソース定義、ステート管理、モジュール、関数などをチートシートにまとめました。
CLIコマンド
コアワークフロー
| コマンド | 説明 |
|---|---|
| terraform init | ワーキングディレクトリを初期化し、プロバイダをダウンロードします。 |
| terraform init -upgrade | プロバイダ・モジュールを最新バージョンに更新します。 |
| terraform validate | 設定ファイルの構文・論理チェックを行います。 |
| terraform fmt | HCLコードを標準フォーマットに整形します。 |
| terraform fmt --check | フォーマットチェックのみ行います(CI/CD向け)。 |
| terraform plan | 実行計画を表示します(ドライラン)。 |
| terraform plan -out=tfplan | 実行計画をファイルに保存します。 |
| terraform apply | インフラを作成・更新します。 |
| terraform apply -auto-approve | 確認プロンプトなしで適用します。 |
| terraform apply -var="key=value" | 変数を指定して適用します。 |
| terraform apply -target="resource.name" | 特定のリソースのみ適用します。 |
| terraform destroy | 管理下の全インフラを破棄します。 |
| terraform destroy -auto-approve | 確認プロンプトなしで破棄します。 |
検査 & デバッグ
| コマンド | 説明 |
|---|---|
| terraform show | ステートファイルを人間可読形式で表示します。 |
| terraform output | 定義された出力値を一覧表示します。 |
| terraform output -json | 出力値をJSON形式で表示します。 |
| terraform console | 式のテスト・デバッグ用の対話コンソールを起動します。 |
| terraform graph | DOT言語で依存関係グラフを生成します。 |
| terraform providers | 使用しているプロバイダをツリー表示します。 |
| terraform version | Terraformのバージョンを表示します。 |
HCL構文基礎
terraform & provider ブロック
バージョン制約、プロバイダ設定、バックエンド設定の基本です。
入力変数 (variable)
モジュールの入力パラメータを定義します。型、デフォルト値、バリデーションを設定できます。
出力値 & ローカル値
output(外部公開値)とlocals(内部計算値)の定義です。
リソース定義
リソース & データソース
インフラリソースの作成と既存リソースの参照です。
メタ引数 (count / for_each)
count
for_each
for_each (map)
count vs for_each 比較
| 特性 | count | for_each |
|---|---|---|
| 入力型 | 数値 | map / set |
| 参照方法 | count.index | each.key, each.value |
| 削除時の挙動 | インデックスずれが発生 | キーベースで安全 |
| 推奨用途 | 同一構成のリソース複製 | 異なる構成のリソース群 |
ステート管理
ステートコマンド
| コマンド | 説明 |
|---|---|
| terraform state list | 管理しているリソースの一覧を表示します。 |
| terraform state show <resource> | 特定リソースの詳細情報を表示します。 |
| terraform state mv <src> <dst> | リソースのアドレスを変更します(リネーム)。 |
| terraform state rm <resource> | ステートからリソースを削除します(実インフラは残る)。 |
| terraform state pull | リモートステートを取得して標準出力に表示します。 |
| terraform state push | ローカルステートをリモートにプッシュします。 |
| terraform import <resource> <id> | 既存のインフラリソースをTerraform管理下にインポートします。 |
| terraform force-unlock <lock_id> | ステートのロックを強制解除します。 |
リモートバックエンド
ステートファイルをリモートストレージで管理する設定です。
import & moved ブロック
import (v1.5+)
moved / removed
モジュール
モジュールの使用
Registry module
Local module
ソースの種類
| ソース種類 | 例 |
|---|---|
| ローカルパス | ./modules/vpc |
| Terraform Registry | hashicorp/consul/aws |
| GitHub | github.com/org/repo |
| S3バケット | s3::https://bucket/module.zip |
バージョン制約
| 演算子 | 意味 |
|---|---|
| = 1.2.3 | 指定バージョンのみ |
| != 1.2.3 | 指定バージョン以外 |
| >= 1.0, < 2.0 | 指定範囲内のバージョン |
| ~> 1.2 | ~> 1.2 → >= 1.2, < 2.0 |
式と関数
式・条件・ループ
Conditional / For / Splat
Dynamic block
String / Heredoc
主要な組み込み関数
| カテゴリ | 主要関数 |
|---|---|
| 文字列 | format, join, split, replace, upper, lower, trimspace |
| 数値 | abs, ceil, floor, max, min, parseint |
| コレクション | length, merge, concat, flatten, keys, values, lookup, contains, distinct, sort, one |
| 型変換 | tostring, tonumber, tobool, tolist, toset, tomap |
| エンコーディング | jsonencode, jsondecode, yamlencode, yamldecode, base64encode, base64decode |
| ファイル | file, fileexists, templatefile, abspath, basename |
| ネットワーク | cidrhost, cidrnetmask, cidrsubnet, cidrsubnets |
ライフサイクル & プロビジョナ
ライフサイクルルール
lifecycle
precondition / postcondition
プロビジョナ
local-exec / file
remote-exec
terraform_data
ワークスペース
ワークスペースコマンド
| コマンド | 説明 |
|---|---|
| terraform workspace list | ワークスペースの一覧を表示します。 |
| terraform workspace show | 現在のワークスペース名を表示します。 |
| terraform workspace new <name> | 新しいワークスペースを作成して切り替えます。 |
| terraform workspace select <name> | 指定したワークスペースに切り替えます。 |
| terraform workspace delete <name> | ワークスペースを削除します。 |
ワークスペースの活用
terraform.workspace で環境を切り替える使用例です。
プロジェクト構成
推奨ディレクトリ構成
Terraformプロジェクトの標準的なファイル構成です。
.gitignore 推奨設定
Terraformプロジェクトでバージョン管理から除外すべきファイルです。
ベストプラクティス
| プラクティス |
|---|
| リモートバックエンドを使用し、暗号化とバージョニングを有効化する |
| .terraform.lock.hcl をGitにコミットする |
| terraform.tfstate は絶対にGitにコミットしない |
| 変数には description, type, validation を設定する |
| モジュールにはバージョン制約を指定する(~> 推奨) |
| terraform plan を常に apply 前に実行する |
| センシティブな値には sensitive = true を使用する |
| count よりも for_each を推奨する(安全な削除) |
| ステートロックを必ず有効化する |