Lua Filter
In this example, we show how a Lua filter can be used with the Envoy proxy. The Envoy proxy configuration includes a Lua filter that contains two functions namely envoy_on_request(request_handle)
and envoy_on_response(response_handle)
as documented here.
Running the Sandboxes
The following documentation runs through the setup of both services.
Step 1: Install Docker
Ensure that you have a recent versions of docker
and docker-compose
.
A simple way to achieve this is via the Docker Desktop.
Step 2: Clone the Envoy repo and start all of our containers
If you have not cloned the Envoy repo, clone it with git clone git@github.com:envoyproxy/envoy
or git clone https://github.com/envoyproxy/envoy.git
Terminal 1
$ pwd
envoy/examples/lua
$ docker-compose pull
$ docker-compose up --build -d
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------------------------
lua_proxy_1 /docker-entrypoint.sh /bin Up 10000/tcp, 0.0.0.0:8000->80/tcp, 0.0.0.0:8001->8001/tcp
lua_web_service_1 node ./index.js Up 0.0.0.0:8080->80/tcp
Step 3: Send a request to the service
The output from the curl
command below should include the headers foo
.
Terminal 1
$ curl -v localhost:8000
Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< x-powered-by: Express
< content-type: application/json; charset=utf-8
< content-length: 544
< etag: W/"220-IhsqVTh4HjcpuJQ3C+rEL1Cw1jA"
< date: Thu, 31 Oct 2019 03:13:24 GMT
< x-envoy-upstream-service-time: 1
< response-body-size: 544 <-- This is added to the response header by our Lua script. --<
< server: envoy
<
{
"path": "/",
"headers": {
"host": "localhost:8000",
"user-agent": "curl/7.64.1",
"accept": "*/*",
"x-forwarded-proto": "http",
"x-request-id": "a78fcce7-2d67-4eeb-890a-73eebb942a17",
"foo": "bar", <-- This is added to the request header by our Lua script. --<
"x-envoy-expected-rq-timeout-ms": "15000",
"content-length": "0"
},
"method": "GET",
"body": "",
"fresh": false,
"hostname": "localhost",
"ip": "::ffff:172.20.0.2",
"ips": [],
"protocol": "http",
"query": {},
"subdomains": [],
"xhr": false,
"os": {
"hostname": "7ca39ead805a"
}
* Connection #0 to host localhost left intact
}* Closing connection 0