stateの「所有」と「運用責任」は分離できる二軸である
stateをめぐる設計判断は一つの軸ではなく二つある。
- 所有 = どこにデータがあるか(Terraform / Pulumi / Carina = 自前、CDK = CFN)
- 運用責任 = lock / 暗号化 / migrationを誰が担うか(Terraform / Pulumi = ユーザがbackendを設定、CDK = CFNに委ねる)
この2軸は同じツールでも分離できる。例えばPulumi serviceを使うと、所有は自前だが運用責任の多くはPulumi社に委ねるという組み合わせになる。
| ツール | state所有者 | state形式 | refresh | drift detection | lock | 暗号化 |
|---|---|---|---|---|---|---|
| Terraform | 自前 | tfstate (JSON) | terraform refresh (applyに統合) | terraform planで検出 | backendが提供(S3 + DynamoDB等) | backend依存 |
| CDK | CFNサービスに委譲 | CFN stack state (AWS側) | CFN drift detection | CFN drift detection機能 | CFNサービス側 | CFNサービス側 |
| Pulumi | 自前(Pulumi service / S3 / local) | checkpoint (JSON) | pulumi refresh | pulumi previewで検出 | backend側 | Pulumi serviceなら組込、自前backendは要設定 |
| Carina | 自前 | carina.state.json (state v3、binding/dependency_bindings含む) | (要確認) | plan時に差分計算 | (要確認) | (要確認) |
トレードオフは明快である。自前(Terraform / Pulumi / Carina)はbackend設計の自由度を得る代わりに運用責任を負う。委譲(CDK → CFN)は運用がCFN側に委ねられ、ロック / drift / 暗号化を任せられる代わりにCFNにロックインされる。
state操作の手段も所有の帰結として分かれる。Terraformはstate mv / state rm / import / 手動JSON編集(非推奨)、Pulumiはpulumi state delete / pulumi stack export / pulumi stack import、CDKは該当なし(CFNコンソール / CLI経由)。いずれも「文法で禁じる」のではなく規約で縛る形になっている。
state schemaの進化も所有者の責任範囲に入る。Terraformはschema versionとprovider state migration、Pulumiはcheckpoint formatのバージョン、Carinaはstate v3(現行)と過去バージョンとの互換性を自分で面倒を見る必要がある。
state加工の自由度には設計思想の差が現れる。Terraformはstate blocks (moved/removed/import)の処理が分散している(pre-planでmoved、graph内でremoved/import)のに対し、CarinaはPlan<Effect>生成後にadd_state_block_effects()で統一的に反映する。「plan完成前/中にstate/graphへ吸収する」か「plan完成後に統一加工する」かの差である。