【初心者向け】MacにOPAをインストールしてみる

OPAのインストール方法とVSCodeの拡張機能について紹介します。
2023.07.20

ローカルにOPAをインストールして、ポリシーを書く環境を整えるところまでやってみます。

Open Policy Agent(OPA)とは

OPAを使用することでKubernetesやTerraformに対して、ポリシーを作成して適用できます。

例えば、TerraformでAWSリソースを管理していて、特定のインスタンスタイプの作成を禁止したいとします。

その際に、特定のインスタンスタイプを禁止するポリシーをOPAで作成します。

TerraformのCI上でOPAを実行することで、ポリシー違反を検知できます。

上記はコードレビューで人力でチェックすることも可能ですが、ポリシーとして定義することで属人化せずに自動でチェックを行えます。

Open Policy Agent | Documentation

ブラウザで試せるPlaygroundも用意されているため、カジュアルに触りたい場合はこちらもおすすめです。

The Rego Playground

OPA/Regoの入門に関しては、以下のZenn 本がおすすめです。

OPA/Rego入門

やってみる

以下の環境で試しました。

  • macOS Monterey
  • Open Policy Agent: v0.54.0

OPAインストール

ローカルで使用するためには、OPAのバイナリをダウンロードする必要があります。

Homebrewでインストールすることも可能です。

$ brew install opa
$ opa version
Version: 0.54.0
Build Commit: 
Build Timestamp: 
Build Hostname: 
Go Version: go1.20.5
Platform: darwin/arm64
WebAssembly: unavailable

opa — Homebrew Formulae

エディタにOPAの拡張機能をインストール

私は普段VSCodeを使用しています。

VSCodeはデフォルトでは.regoのファイルにシンタックスチェックは行うことができません。

そのため、拡張機能「Open Policy Agent」をインストールします。

以下のような機能があります。詳細は上記のリンクをご確認ください。

  • ファイル保存時のシンタックスチェック
  • ファイル保存時のフォーマット
  • パッケージの評価
  • パッケージの選択範囲の評価

他のエディターでも拡張機能は用意されているため、お好みでインストールしてください。

Open Policy Agent | Editor and IDE Support

OPAを実行してみる

公式ドキュメントを参考にOPAを実行してみます。

今回はopa evalを使って、作成したポリシーをテストしてみます。

Open Policy Agent | Documentation

input.json(入力データ)とexample.rego(ポリシー)をローカルに用意します。ファイルの中身は、公式ドキュメントの内容をコピーします。

$ touch input.json example.rego

ファイルの準備ができたら、以下のコマンドを実行してポリシーの評価を行います。

$ opa eval -i input.json -d example.rego "data.example.violation[x]"
{
  "result": [
    {
      "expressions": [
        {
          "value": "busybox",
          "text": "data.example.violation[x]",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ],
      "bindings": {
        "x": "busybox"
      }
    },
    {
      "expressions": [
        {
          "value": "ci",
          "text": "data.example.violation[x]",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ],
      "bindings": {
        "x": "ci"
      }
    }
  ]
}

ルールに違反しているcibusyboxが結果として返ってきます。

  • busybox: protocolにtelnetを指定しているため、violationルールに違反
  • ci: protocolにhttpを使用しておりnetworkがpublicのため、violationルールに違反

ちなみに、VSCodeの拡張機能を使うとVSCodeのコマンドで実行結果を自動でoutput.jsonに出力してくれて便利です。 (コマンドパレットを開いて、OPA: Evaluate Package)

おわりに

OPAをローカルに導入する方法でした。

VSCodeの拡張機能のおかげで、ポリシー作成が捗りそうです。

以上、AWS事業本部の佐藤(@chari7311)でした。