はじめに
Terraformの学習を進める中で、単に主要なコマンドを覚えたりリソースを作るだけでなく、チーム開発や運用を見据えた「ステート管理」や「ワークフロー」の理解が不可欠だと感じました。
本記事は、書籍で学んだIaCの基本サイクルと、安全な運用のためのState操作(特に最新のプラクティス)について整理した学習メモです。
1. IaCワークフローを駆動する主要コマンド
Terraformにおける開発サイクル(Write → Plan → Apply)を回すための、コアとなるコマンド群を整理します。
必須の基本サイクル
terraform init (初期化)
- 開発を始める際やリポジトリをクローンした直後に、カレントディレクトリをTerraformの作業ディレクトリとしてセットアップします
- 必要なプロバイダプラグインのダウンロードやバックエンドの初期化が行われます
terraform plan (計画)
- 実際のインフラストラクチャや現在のステートと、コードで定義された状態との差分(作成、変更、削除)を表示します
- 本番環境で意図しない変更がないかを確認するための、適用前の差分チェックやレビューにおいて不可欠です
terraform apply (適用)
-
planで示された変更を実際のリソースに反映し、構築、更新を行います - これにより、リソースの状態とコードの内容を一致させます
- 確認プロンプトをスキップするには、
-auto-approveオプションを使用します
terraform destroy (破棄)
- Terraformが管理しているインフラストラクチャ全体を削除します
- これは実質的に
terraform apply -destroyのエイリアスです
品質と統制のためのコマンド
terraform fmt (整形)
- HCLファイルの内容を自動的に標準形式に整形します
- これにより、コードの一貫性・可読性の向上と、CI(継続的インテグレーション)に組み込むことで、コードレビュー時にスタイルに関する非生産的な指摘が入るのを防ぐことができます
terraform validate (検証)
-
tfファイルが構文的に有効であり、planやapplyを正常に実行できる状態にあるかを確認します
確実な実行のための組み合わせ
plan -out オプションを使って実行計画をファイルに保存し、そのファイルを terraform apply <ファイル名> に渡すことで、planの結果と全く同じ変更が実行されることが保証されます。
2. チーム開発におけるステート管理の重要性
ステートファイルは、Terraformがリソースの状態を管理する上で最も重要な要素です。チームで安全に運用するための知識が必要です。
リモートステートと排他制御
バックエンドの指定
- デフォルトではステートはローカルディスクに保存されますが、チームで管理する場合はS3などのリモートバックエンドにステートを共有することが必須です
ロック管理
- 複数人が同時に
plan/applyを実行すると、ステート内容の一貫性が失われる可能性があります - これを防ぐため、DynamoDBなどを利用した**排他制御(ロック管理)**が重要になります
- バージョン1.11以降、S3バックエンドだけでロック管理が可能になりました
ステートの操作(直接操作は極力避ける)
ステートを直接操作するコマンドは、コードの大幅な変更やリファクタリング、エラー復旧など、やむを得ない場合に限って使用するべきです。
| コマンド | 目的 | 推奨される代替手段(コードベース) |
|---|---|---|
terraform state list / show
|
ステート内のリソースを一覧表示/詳細表示する | - |
terraform state mv |
ステート内のリソースのアドレス(名前)を変更する |
movedブロック(v1.1以降) |
terraform state rm |
リソースをTerraformの管理から削除する(実リソースは削除しない) |
removedブロック(v1.7以降) |
terraform import |
構築済みのリソースをTerraformの管理下に取り込む |
importブロック(v1.5以降) |
3. ワークスペースを利用した環境管理
ワークスペースは、単一のコードを使用して複数の独立した環境(ステート)を管理するために利用されます。
コマンド
ワークスペースの基本的な操作コマンド:
-
workspace new: 新規作成 -
workspace list: 一覧表示 -
workspace select: 切り替え -
workspace delete: 削除
活用法
ワークスペース名は terraform.workspace という変数としてコード内で参照できます。これにより以下のような操作が可能になります:
- ワークスペース名に応じてリソースの命名を変える(例:
sample-dev-vpc) - 条件分岐(
countと組み合わせてリソースの作成有無を制御)を行う
まとめ
Terraformでは単にコマンドを覚えるだけでなく、「ステートをどう安全に守るか」「チームでどう共有するか」という視点が重要だと学びました。
特に moved ブロックや import ブロックのような新しい機能を活用することで、より宣言的で安全なインフラ管理が可能になります。今後は実際のハンズオンを通して、これらの挙動を体感していきたいです。