terraform planでは見えない障害 — 「2つの正しいリポジトリ」が合成で壊れる話
この記事について
terraform plan は「宣言と現実の差分」しか見ない。だから事故は、差分に出てこないもの——宣言に書き忘れたもの、あるいは別の宣言に書いてあるもの——のほうで起きる、という話をまとめる。
きっかけはAWSのセキュリティ領域の学習で、「1つのリポジトリでインフラを完結させている世界の住人」からは、大企業のマルチアカウント構成の試験問題が過剰なドヤ問題に見える、その落差の正体を言語化したかった。これは実装記録ではなく、失敗モードの解説だ。
planが見ているもの — 宣言と現実の「差分」だけ
terraform plan がやっているのは一種の引き算だ。手元の宣言(HCLに書いた望ましい状態)と、state/実リソースの現状を突き合わせ、その差分だけを出す。
Plan: 1 to add, 0 to change, 0 to destroy.
+ aws_iam_role.app
+ name = "app-role"
ここで効いてくる前提が一つある。差分に出てくるのは「宣言に書いてあるリソース」だけだということ。宣言に書いていないリソース、宣言の外にある関係性は、そもそも引き算の対象に入らない。planが「変更なし」と言っても、それは「宣言したものは現実と一致している」という意味であって、「システム全体が意図どおり安全だ」という意味ではない。この二つは違う。
「2つの正しいリポジトリ」問題 — state の分割線は信頼境界
規模が大きくなると、インフラは1つのstateには収まらず、チーム・アカウント・ライフサイクルで複数のstate(複数リポジトリ)に割れる。このとき、state の分割線は事実上の信頼境界になる。
具体例として、AWSの暗号鍵(KMS)へのアクセスを考える。KMSキーへの操作が許可されるには、原則として二つの関門を両方くぐる必要がある。
| 関門 | どこで宣言するか | 役割 |
|---|---|---|
| キーポリシー | 鍵を持つ側のstate | 「この鍵を誰に触らせるか」を鍵側から定義 |
| IAMポリシー | 利用する側のstate | 「このロールはどの鍵操作をしてよいか」を利用側から定義 |
鍵を管理するリポジトリと、その鍵を使うアプリのリポジトリが別だとする。それぞれのplanは、自分の宣言と現実の差分しか見ない。 鍵側のplanはキーポリシーが宣言どおりだと言い、アプリ側のplanはIAMロールが宣言どおりだと言う。両方とも、単独では完全に「正しい」。
ところが実際にアクセスが通るか否かは、二つの宣言を合成したときに初めて決まる。キーポリシーは許可しているのにIAM側が権限を書き忘れていれば、両planがグリーンのまま本番で鍵操作が拒否される。逆に、キーポリシーを広げすぎていて、IAM側の想定を超えた到達経路ができていることもある。planの視界は自分のstateの内側で閉じていて、分割線をまたぐ関係は誰の差分にも映らない。
なぜ「検出する側」のサービスが別に要るのか
ここが、AWSに IAM Access Analyzer のような到達可能性を解析する側のサービスが存在する理由だ。plan が答えるのは「宣言と現実は一致しているか」。一方で運用が本当に知りたいのは「結果として、誰が何にアクセスできてしまうか」だ。
- planは差分の検査。宣言というローカルな真実の内側で完結する
- 到達可能性の解析は合成の検査。複数のポリシーを突き合わせ、「宣言をまたいで実際に成立している経路」を解く
前者をいくら緑にしても、後者は保証されない。分割されたstateをまたぐ権限は、差分ではなく到達可能性のレイヤで見ないと穴が残る。
1リポジトリ世界との落差
個人開発や小規模構成では、インフラが1つのstateに収まっていることが多い。合成の境界がそもそも無いので、この罠に出会わない。「planが通れば安全」という体感は、信頼境界が一本しかない世界でだけ成り立つローカルな真実だった、というのがこの話の芯だ。
大企業のマルチアカウント・マルチstate環境では、分割線をまたぐ権限の検証が日常になる。1リポ世界の住人に「なぜそんな大げさな検査が要るのか」と見える試験問題は、stateの分割=信頼境界の分割という前提が入った瞬間に、過剰でも何でもなくなる。
わかったこと
terraform plan を「安全性の検査」と混同しないこと。planは宣言と現実の差分検査であって、複数の宣言を合成した結果の安全性は保証しない。stateの分割線をまたぐ権限は、差分ではなく到達可能性で見る。 IaCで規模が上がったとき最初に効く発想の切り替えは、「planが緑か」ではなく「分割した信頼境界を、誰が合成して検査しているか」を問うことだった。
更新履歴
- 2026-07-08: 初稿