Terraformの仕組み — 「こうしたい」を書き、差分を確かめる
書いた状態と、適用した状態は別
まず、名前の記録で動きを確かめる
Terraformを公式のインストール案内で用意し、terraform versionを確認します。次はTerraform 1.4以降の組み込みリソースを使う練習です。新しい空フォルダーにmain.tfを作ります。既存のクラウド用プロジェクトでは実行しません。
resource "terraform_data" "name" {
input = "ひよこ"
}
output "name" {
value = terraform_data.name.output
}
terraform init
terraform plan
terraform apply
planでは1件の作成案を読みます。applyは確認してyesを入力すると、ローカルのStateに記録されます。この例にはクラウドリソースの作成や外部コマンドの実行はありません。もう一度terraform planを実行し、変更がないことを確認しましょう。
次にinputを"ペンギン"へ変えると、planに値の変更が現れます。編集したことと、適用したことは別です。この違いをつかめれば、実際のインフラの差分も読み始められます。
設定、記録、実物を分けて考える
| 要素 | 役割 | 小さな例 |
|---|---|---|
| 設定 | 望む状態を書く | 名前をひよこにする |
| State | 設定と管理対象の対応・属性を記録 | 適用した名前の記録 |
| Provider | 実物への読み取りや変更を担当 | 今回は組み込みリソース |
| plan | 変更案を作る | 作成・更新・削除など |
| apply | 案に従い適用する | 確認後に記録を作る |
クラウドの例では、通常のplanは管理対象の実物を読んでから設定と比べます。手作業で作った全資源が自動で管理対象になるわけではありません。既存資源は取り込み方や管理範囲を確かめます。
チームで使うときの入口
Stateを別々に持つと、同じ実物を別の記録から変更してしまうおそれがあります。共有State、対応バックエンドのロック、権限、復旧できる保管を整えます。S3のuse_lockfileは既定で無効なので、S3を選んだだけでロックまで有効とは思わないでください。
秘密をsensitiveで画面上から隠しても、Stateや保存したplanには残る場合があります。保管先と権限を確認し、公開リポジトリに含めないようにします。
もう少し詳しく:順序と失敗
Terraformは依存関係を使って処理を進めます。モジュールは設定をまとめる単位で、複数環境へ再利用できますが、入力・Provider・権限が違えば結果も変わります。applyの失敗は、データベースの一括ロールバックと同じではありません。差分と現在の状態を読み直して対処します。
ペンギン先生のまとめ
「Terraform」って出てきたら「こうしたいを書いて、差分を見てから適用する」と思えばだいたいOK! Terraform入門で、計画を読む練習を続けましょう。
参考資料
- Terraform:Stateの役割 — 実物との対応・更新・共有
- Terraform:plan — 読み取り・比較・案の作成
- Terraform:terraform_data — 組み込みリソースとinput/output
- Terraform:S3 backend — use_lockfileと旧方式の非推奨化
- Terraform:for_each — 複数インスタンスの宣言
- Terraform:Sensitive data — State・plan・sensitiveの条件
- Terraform:applyのエラー