OPAのVisual Studio Code拡張機能

OPAにはVSCode用の拡張機能があります!

marketplace.visualstudio.com

機能

できるようになることは次のとおり(2019/03/31時点)

  • 保存時に構文チェック(現時点でエディタ上で表示はされません)
  • OPAのpackageを評価
  • 選択中の箇所を評価
  • 選択中の箇所を部分評価(Partial Evaluation)
  • 選択中の箇所を評価して、トレースを表示
  • 選択中の箇所を評価してプロファイルを表示
  • ワークスペース内のテストを実行
  • ワークスペース内のカバレッジ表示の切り替え
  • 選択中の箇所のカバレッジ表示切り替え

準備するもの

OPAのバイナリを忘れずに!

opa コマンドが叩けることが前提になっているので、ちゃんとインストールしておきましょう。

github.com

opaPATH を通しておくか、VSCodeの設定で Opa: Path にバイナリへのパスを直接指定することもできます!

お試し

拡張機能ページでGIFの紹介アニメーションがあるんですけど、サラッとどんどん進んじゃうので、一個一個見ていきます!

まず下の内容で simple.rego を書きます。

package http.authz

default allow = false

allow {
  input.method = "GET"
  input.path = ["salary", user]
  input.user = user
}

文でこのポリシーを言い表すと

  • デフォルトは許可しない
  • 下が全て満たされていれば許可
    • 入力 method"GET"
    • 入力 path["salary", user] である
    • 入力 userpathuser と一致

となります。

ワークスペースのルートに input.json を置くと、その中身をOPAの入力としてお試し実行することができます。 まずは次の内容にしてみましょう!

{
  "user": "bob",
  "method": "GET",
  "path": ["salary", "bob"]
}

bobbob 自身の salary を見ようとしてるので、これは許可されるはずです!

f:id:kenev:20190331115415p:plain

Regoの allow の部分をvscodeで選択して Cmd + Shift + p して、OPA: Evaluate Selection すると、この部分だけ評価できます。 やってみましょう。

f:id:kenev:20190331115632p:plain

期待通り、この結果は true となります!

では、 pathbob から alice に変えてみるとどうなるでしょ。

{
  "user": "bob",
  "method": "GET",
  "path": ["salary", "alice"]
}

もう一度 allow を選択して実行すると次の通り。

f:id:kenev:20190331120019p:plain

自分の salary じゃなくなってるので false になってますね!

次はルールのBodyを選択して評価します!

f:id:kenev:20190331120658p:plain

input.methodGET なので結果は true ですね!もう一行増やして実行してみましょう。

f:id:kenev:20190331120950p:plain

この結果の output.json は、複数行関わった場合に何を基準にしているかちょっとわかっていないです。 予想としては ["salary", "alice"] = ["salary", user] になって、 useralice が代入されているのかなと思っています。そしてその結果が output.json に出ているのではないかと。(この評価方法が正しいかは別途確認したいです)

では最終行も含めて実行してみましょう!

f:id:kenev:20190331122143p:plain

これは最終的に "bob" = "alice" しようとして、 true にならないので、結果は空っぽになります。

input.jsonpathalice から bob に戻しましょう!

{
  "user": "bob",
  "method": "GET",
  "path": ["salary", "bob"]
}

そして実行してみると次のとおり!

f:id:kenev:20190331123356p:plain

何かしら戻り値が返ってくるのがわかります。 上でも返ってきたのと同様 user に関するJSONなのですが、なぜこの値になるのかは現段階でちょっとわからないです。 allow を選択して実行すると直感的な true が返ってくるのですが。。。

おわりに

本記事ではOPAのVSCode拡張機能を紹介しました! 個人的にかなりうれしいのは下の2項目です。

まだまだ使いこなせていないのでこの記事もわかったことが増え次第更新していきたいです!