.. _config_http_cluster_specifier_lua:
Lua cluster specifier
=====================
Overview
--------
The HTTP Lua cluster specifier allows `Lua `_ scripts to select router cluster
during the request flows. `LuaJIT `_ is used as the runtime. Because of this, the
supported Lua version is mostly 5.1 with some 5.2 features. See the `LuaJIT documentation
`_ for more details.
Configuration
-------------
* This filter should be configured with the type URL ``type.googleapis.com/envoy.extensions.router.cluster_specifiers.lua.v3.LuaConfig``.
* :ref:`v3 API reference `
A simple example of configuring Lua cluster specifier is as follow:
.. code-block:: yaml
routes:
- match:
prefix: "/"
route:
inline_cluster_specifier_plugin:
extension:
name: envoy.router.cluster_specifier_plugin.lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.router.cluster_specifiers.lua.v3.LuaConfig
source_code:
inline_string: |
function envoy_on_route(route_handle)
local header_value = route_handle:headers():get("header_key")
if header_value == "fake" then
return "fake_service"
end
return "web_service"
end
default_cluster: web_service
Lua script defined in ``source_code`` will be executed to select router cluster, and just as cluster specifier
plugin in C++, Lua script can also select router cluster based on request headers. If Lua script execute failure,
``default_cluster`` will be used.
Complete example
----------------
A complete example using Docker is available in :repo:`/examples/lua-cluster-specifier`.
Route handle API
----------------
When Envoy loads the script in the configuration, it looks for a global function that the script defines:
.. code-block:: lua
function envoy_on_route(route_handle)
end
During the route path, Envoy will run *envoy_on_route* as a coroutine, passing a handle to the route API.
The following methods on the stream handle are supported:
headers()
^^^^^^^^^
.. code-block:: lua
local headers = handle:headers()
Returns the stream's headers. The headers can be used to match to select a specific cluster.
Returns a :ref:`header object `.
.. _config_lua_cluster_specifier_header_wrapper:
Header object API
-----------------
get()
^^^^^
.. code-block:: lua
headers:get(key)
Gets a header. *key* is a string that supplies the header key. Returns a string that is the header
value or nil if there is no such header. If there are multiple headers in the same case-insensitive
key, their values will be combined with a *,* separator and returned as a string.