構成データ出力DSLとgraph出力DSLはレイヤが違う
構成記述系DSLを「何を出力するか」で分けると、3自由度では捉えきれない別レイヤの差が浮上する。
| 出力形態 | 内容 | 例 |
|---|---|---|
| 構成データ出力 | 値ツリー(JSON/YAML/設定値) | Pkl, KCL, CUE, Dhall, Jsonnet, Nickel |
| graph出力 | ノード + エッジの宣言 | Terraform, CDK, Pulumi, Carina, Bicep, cdktf, cdk8s, Crossplane, Helm |
graph出力DSLのコードが出すのは、(a)ノード集合(リソース宣言 = type + 属性値)と(b)エッジ(リソース間の依存関係 — 参照、depends_on、opts.parent)である。構成データ出力DSLは値ツリーを出すだけで、ノード間の関係という構造を持たない。
この区別は、3自由度の評価が「何に効くか」を決める。graph出力DSLでは自由度がノード数・identity・依存関係に効くが、構成データ出力DSLでは「最終valueの集合サイズ」にしか効かない。同じ「複数量の制御」という軸を当てても、意味するものが違う。
「graph出力」という括りはgraphに至る経路を粗く扱っている点に注意が要る。最終的にresource graphになるのは共通だが、経路はツールごとに異なる — 直接出力(Terraform, Carina, Bicep, Helm)、ツリー→synthでgraph変換(CDK, cdktf, cdk8s)、RPCストリーム(Pulumi)、YAML pipeline(Crossplane)。経路は違うが、applyされる段階ではどのツールもresource graphを扱うので、3自由度の比較には経路差は直接効かない。
なおgraphを出力した後のstate管理 / 差分計算 / CRUD実行は、DSLのレイヤではなくツール(engine / CLI)のレイヤの話である。DSL同士を比べるときはこの線を越えない。