编译为WASM模块的Rego策略是否支持http.send内置函数?
OPA WASM中
http.send函数的运行验证 OPA WASM文档指出http.send这类内置函数并非WASM原生支持,但实际测试中,我成功编译并运行了包含该函数的Rego策略生成的WASM模块。
测试用例
Rego策略(policy.rego)
package example result contains response if { request := { "method": "GET", "url": "https://httpbin.org/get", "headers": {"Accept": "application/json"}, } response := http.send(request) }
输入数据(data.json)
{}
三种编译与执行方式
1. OPA命令行工具
执行脚本(script.sh):
curl -L -o opa https://openpolicyagent.org/downloads/v1.3.0/opa_linux_amd64 chmod +x ./opa ./opa build -t wasm -e example/result policy.rego ./opa eval --bundle bundle.tar.gz --input data.json 'data.example.result' > result.json
结果:执行成功,生成result.json。
2. golang-opa-wasm库
核心代码(main.go):
package main import ( "context" "fmt" "os" "github.com/open-policy-agent/golang-opa-wasm" ) func main() { ctx := context.Background() wasmBytes, err := os.ReadFile("./policy.wasm") if err != nil { panic(err) } vm, err := opa.NewVM(wasmBytes) if err != nil { panic(err) } defer vm.Close() input := []byte(`{}`) if err := vm.SetInput(input); err != nil { panic(err) } result, err := vm.Eval(ctx, "data.example.result") if err != nil { panic(err) } fmt.Println(result) }
执行脚本(script.sh):
curl -L -o opa https://openpolicyagent.org/downloads/v1.3.0/opa_linux_amd64 chmod +x ./opa ./opa build -t wasm -e example/result policy.rego tar -xf bundle.tar.gz policy.wasm go mod init opa-wasm-test go get github.com/open-policy-agent/golang-opa-wasm go run main.go > output.txt
结果:执行成功,生成output.txt。
3. OPA官方Go库
核心代码(main.go):
package main import ( "context" "fmt" "os" "github.com/open-policy-agent/opa/rego" "github.com/open-policy-agent/opa/storage" "github.com/open-policy-agent/opa/storage/inmem" ) func main() { ctx := context.Background() store := inmem.NewFromObject(map[string]interface{}{}) query, err := rego.New( rego.Query("data.example.result"), rego.Load([]string{"policy.rego"}, nil), rego.Store(store), ).PrepareForEval(ctx) if err != nil { panic(err) } input := map[string]interface{}{} rs, err := query.Eval(ctx, rego.EvalInput(input)) if err != nil { panic(err) } fmt.Println(rs) }
执行脚本(script.sh):
go mod init opa-test go get github.com/open-policy-agent/opa go run main.go > output.txt
结果:执行成功,生成output.txt。
内容的提问来源于stack exchange,提问作者Tarang
相关产品推荐
相关产品推荐

