Conftest vs OPA: Policy as Code の比較
両者はライバルではなく関連しています。どちらも Rego 言語を使います。OPA (Open Policy Agent) は汎用のポリシーエンジンで、しばしばサービスとして実行されます。Conftest は OPA 上に構築された CLI で、構造化された設定ファイルを Rego ポリシーに対してテストします。
よくある疑問は Conftest と OPA のどちらを使うかです。Conftest は OPA エンジンをラップして 1 つの仕事を簡単にします。設定ファイル (YAML、JSON、Dockerfile、HCL など) を CI で Rego に対してチェックすることです。OPA はランタイム認可も扱う、より広範なエンジンです。両者の関係を以下に示します。
| Conftest | OPA | |
|---|---|---|
| 何であるか | 設定ファイルをテストする CLI | 汎用ポリシーエンジン + ライブラリ |
| 言語 | Rego | Rego |
| 主な用途 | CI/CD の設定チェック | ランタイム認可 + ポリシー |
| 入力 | YAML/JSON/HCL/Dockerfile/など | 任意の JSON データ / API クエリ |
| デプロイ | CLI ステップとして実行 | server、sidecar、または埋め込み |
| 関係 | OPA 上に構築 | Conftest の基盤 |
エンジン vs CLI ラッパー
OPA は完全なポリシーエンジンで、アプリケーションに埋め込んだり、admission control (Gatekeeper 経由) や API 認可のための server として実行したり、ランタイムでクエリしたりできます。Conftest はそれを開発者にやさしい CLI に絞り込みます。設定ファイルと Rego ポリシーを指定すると、pass または fail を返します。必要なのが CI でのファイルの静的チェックなら、Conftest が使いやすい選択肢です。
ユースケースで選ぶ
pull request をゲートするには Conftest を使います。resource limits が欠けた Kubernetes マニフェスト、root で動く Dockerfile、公開バケットを含む Terraform をブロックします。ランタイムでのポリシー決定、クラスターの admission control、システム横断で再利用可能なポリシーサービスが必要なときは OPA を使います。書いた Rego は両者間で移植可能です。
CI での利用
Conftest は設定ファイルに対する fail-fast なゲートとして自然に収まります。pull request で変更されたマニフェストに対して実行してください。すでに他の場所で OPA を実行している場合、ランタイムポリシーと Conftest の CI チェックの間で Rego を共有すれば、ルールの重複を避けられます。
結論
CI で設定ファイルを Rego に対してテストするなら Conftest を、ランタイム認可や admission control 向けの汎用ポリシーエンジンが必要なら (直接または Gatekeeper 経由で) OPA を選んでください。両者は Rego を共有するため、投資は引き継がれます。