- 物理機リージョン/AZ
- ハイパーバイザVM exit で捕まえる
- VMゲストOS今ここ
- コンテナnamespace / cgroup今ここ
- プロセスアプリ / DB
宣言には順番を書く欄がありません。では、何が先で何が後かは誰がどこから決めているのかを、2つの道具で見比べます。
まず結論
Terraform は、属性の参照を辺にした依存グラフを作り、依存が済んだ節から並列に進めます(既定で最大10)。順序が生まれるのは参照のある所だけで、参照の無いもの同士は同時に動きます。
Kubernetes には、別々に投入したオブジェクトの作成順を参照から組み立てる仕組みがありません。参照先がまだ無ければ Pod の側が待ち、参照先ができれば出し直さなくても自分で進みます。
資源 a・b・c があり、c だけが a の属性を参照しています。既定の設定で terraform apply すると、どう進むでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
参照が辺になり、辺の無い所は同時に進む
宣言には「これを先に」と書く欄がありません。それでも Terraform は、参照される側を先に作ります。順番はどこから来るのでしょうか。
Terraform の文書 Dependency Graph はこう書きます。
References to resource attributes are turned into dependencies from the resource with the interpolation to the resource being referenced.
terraform_data.a.id と書けば、書いた側から a へ辺が1本張られます。この構成では、順序の材料はこの辺だけで、ファイルに書いた順は使われません。
辿り方も同じ文書にあります。
Graph walking is done in parallel: a node is walked as soon as all of its dependencies are walked.
依存が済んだ節から順に処理され、待つ相手の無い節はすぐに始まります。同時に動く数には上限があり、By default, up to 10 nodes in the graph will be processed concurrently. です。
- ・a と b は同時に始まってよい。どちらが先かは決まっていない
- ・c が b を待つ理由はグラフに無い
3つの資源と、並列度を1にした場合
Terraform 1.16.4 で、3秒待つ処理を持つ a・b・c を作りました。c だけが a の id を参照します。各資源は開始と終了の時刻を order.log に書きます。
$ terraform graph | grep -- '->'"terraform_data.c" -> "terraform_data.a";$ terraform apply -auto-approve # default parallelismPlan: 3 to add, 0 to change, 0 to destroy.terraform_data.b: Creating...terraform_data.a: Creating...terraform_data.b: Creation complete after 3s [id=6e2a8ac9-80f6-6ab5-baa5-523fec93b2fd]terraform_data.a: Creation complete after 3s [id=0fcec651-37fa-01f8-a9de-42e0eae11035]terraform_data.c: Creating...terraform_data.c: Creation complete after 3s [id=06cc2b31-e8c3-fda6-608e-6b2e7e48a7ed]Apply complete! Resources: 3 added, 0 changed, 0 destroyed.$ cat order.logb start 22:49:42a start 22:49:42b end 22:49:45a end 22:49:45c start 22:49:45 (after a=0fcec651-37fa-01f8-a9de-42e0eae11035)c end 22:49:48
辺は c から a への1本だけです。a と b は同じ秒に始まり、c は a が終わった秒に始まりました。全体は約6秒です。
ただし、この実演では a と b が同じ秒に終わっているので、c が b も待ったのかどうかは区別できません。b を待つ理由がグラフに無い、と言えるのは文書とグラフの出力からです。
状態を消して -parallelism=1 で流し直すと、order.log は a start 22:49:48 → b start 22:49:51 → c start 22:49:54 と1つずつ並び、約9秒かかりました。上限を1にすると同時に動けるのが1つになるだけで、c が a の後という辺はそのまま守られます。
実演で a と b の間に辺はありませんでした。この2つの開始順について言えることはどれですか。
順序は辺のある所だけ。並列度は順序のスイッチではない
ここから言えるのは、順序が構成全体に付いているのではなく、辺の1本1本に付いているということです。辺の無い所には順序がありません。実演でも Creating... の表示順は 1回目で b が先、2回目で a が先でした。
では参照に現れない依存はどうするのか。たとえばアプリが別の資源の振る舞いに頼っているが、値は何も受け取っていない場合です。そのための depends_on について、文書は You only need to explicitly specify a dependency when a resource or module relies on another resource's behavior but does not access any of that resource's data in its arguments. と書き、as a last resort とも書きます。まず参照で表せないかを考える、が文書の順番です。
-parallelism は同時に動く数の上限であって、順序を決めるものではありません。CLI 文書は Limit the number of concurrent operations as Terraform walks the graph. Defaults to 10. と書き、グラフの文書は considered an advanced operation and should not be necessary for normal usage と書きます。
グラフの循環について、文書は Validate the graph has no cycles and has a single root. と書きます。深さ優先で辿るという点は、第11期で扱う ES モジュールの import と同じです。ただ、ESM の仕様は循環を許すのに対し、Terraform はグラフに循環が無いことを検証すると書いています。同じ「グラフ」でも規則は逆です。なお本期では、循環を書いてエラーを出す実演はしていません。
順序を書く場所が無い側 — 無い ConfigMap を参照する Pod
Kubernetes では Pod(コンテナを動かす最小単位)も ConfigMap(設定値を入れておくオブジェクト、第24期で扱う)も、それぞれ独立に API へ記録されます。Pod の spec には ConfigMap の名前 greeting が参照として記録されます。ただ、その参照を投入の順番に組み立てる者はいません。k3s v1.37.0 で、まだ無い ConfigMap greeting を環境変数の参照元にする Pod を先に出しました。
$ kubectl apply -f l6-pod-cm.yamlpod/needs-cm createdexit=0+3s 22:55:34 Pending CreateContainerConfigError configmap "greeting" not found$ kubectl get pod needs-cmNAME READY STATUS RESTARTS AGEneeds-cm 0/1 CreateContainerConfigError 0 3s$ kubectl apply -f l6-cm.yaml # 22:55:34configmap/greeting created+3s 22:55:37 Pending CreateContainerConfigError+6s 22:55:41 Pending CreateContainerConfigError+9s 22:55:44 Pending CreateContainerConfigError+12s 22:55:47 Running$ kubectl get pod needs-cmNAME READY STATUS RESTARTS AGEneeds-cm 1/1 Running 0 16s$ kubectl logs needs-cmhi
Pod は created で受け付けられ、STATUS は CreateContainerConfigError になりました。この語は保存した kubernetes.io の文書には無く、実測で表示された値です。RESTARTS は 0 で、Pod は消えていません。
ConfigMap を作ったあと、Pod を出し直していないのに Running になり、ログに hi が出ました。3回とも同じ結果です。
「Kubernetes は投入順を保証しない」と利用者向けに言い切った文は、保存した公式文書にはありません。コントローラを書く人向けの controllers.md に there is no guarantee of ordering amongst those resources とあるのが近い記述です。ここで言えるのは、実測と API の形からです。
とはいえ Kubernetes に順序が一切無いわけではありません。所有関係は metadata.ownerReferences に記録され、garbage collection の文書は foreground cascading deletion について After deleting all the dependent objects it knows about, the controller deletes the owner object. と書きます。所有関係に基づく削除の順はあります。この回で言っているのは、別々に投入したオブジェクト同士の作成順に限った話です。
なお ConfigMap を先に作っておくと、Pod はエラーを経ずに Running になりました。順序を逆にしないと待つ様子は撮れません。
無い ConfigMap を参照する Pod が CreateContainerConfigError になりました。その後で ConfigMap を作ると、k3s v1.37.0 の実演ではどうなりましたか。
Terraform: 参照から辺を作って進む
c が a の id を参照すると、c から a への辺ができ、c は a の完了を待ちます。辺の無い a と b は同時に始まり、表示順は回で入れ替わりました。
順番の材料 構成に書いた参照組み立てる者 Terraform(apply の前)辺の無い所 同時に進む(上限は既定10)
Kubernetes: 作成順を組み立てず、使う側が待つ
Pod を ConfigMap より先に出しても受け付けられます。Pod は CreateContainerConfigError で待ち、ConfigMap ができると出し直さずに Running になりました。
順番の材料 参照は spec にあるが、投入順には使われない組み立てる者 いない足りないとき 使う側の Pod が待ち、揃えば進む
同じ2つのものを逆の順で出したとき、2つの道具でそれぞれ何が起きるでしょうか。
順番を知っているのは誰か、知らないならその穴を誰が埋めているかを探してください。
この章のまとめ
- Terraform は属性の参照を辺にして依存グラフを作る。書いた順は使わない。
- 依存が済んだ節から並列に進む。上限は既定10。辺の無い所に順序は無い。
- depends_on は参照に現れない依存のためのもので、文書は最後の手段としている。
-parallelismは同時に動く数の上限。0 の意味は文書に無く、1.16.4 の実測では既定と同じだった。- 文書はグラフに循環が無いことを検証すると書く。第11期で扱う ESM とは規則が逆。
- Kubernetes には、別々に投入したオブジェクトの作成順を参照から組み立てる仕組みは無い。参照先が無い Pod は CreateContainerConfigError で待ち、揃えば出し直さずに Running になった。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
Terraform の公式文書は depends_on をどんなときに使うものとしていますか。
用語集(3語)
- 依存グラフ
- Terraform が構成から作る、資源を節・参照を辺にしたグラフ。辺は参照する側から参照される側へ張られる。
- -parallelism
- plan・apply・destroy で、同時に処理する節の数の上限を決めるフラグ。既定は10。順番を決めるものではない。
- depends_on
- 参照では見えない依存を明示するメタ引数。文書は最後の手段としている。
出典(一次ソース)
- Terraform — Dependency Graph(internals、取得 2026-09-28、Terraform 1.16.4 時点) ↗
- Terraform — depends_on meta-argument reference(取得 2026-09-28) ↗
- Terraform — terraform plan command(-parallelism、取得 2026-09-28) ↗
- hashicorp/terraform v1.16.4 internal/terraform/context.go(参考。文書ではなくソース) ↗
- Kubernetes — ConfigMaps(Last modified November 21, 2025) ↗
- Kubernetes — Owners and Dependents(Last modified January 08, 2022) ↗
- Kubernetes — Garbage Collection(Last modified October 20, 2025) ↗
- kubernetes/community — Writing Controllers(controllers.md、コミット a71d92c08bb8 2026-05-08) ↗