Envoy Lua 本地脚本文件

3
我将尝试在envoy的配置文件中实现lua脚本。 我想要的是在本地的lua文件中编写我的lua代码,然后在envoy的配置文件中指定我的脚本文件。 以下是我的YAML文件:
static_resources:
  listeners:
    - address:
        socket_address:
          address: 0.0.0.0
          port_value: 10000
      filter_chains:
        - filters:
          - name: envoy.filters.network.http_connection_manager
            typed_config: 
              '@type': "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
              stat_prefix: http_proxy
              route_config: 
                name: all
                virtual_hosts:
                  - name: allbackend_cluster
                    domains: 
                      - '*'
                    routes:
                      - match: { prefix: "/"}
                        route:
                          cluster: cluster_wackopicko
              http_filters:
                - name: envoy.filters.http.router
                - name: envoy.lua
                  typed_config:
                    "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
                    inline_code: |
                      function envoy_on_response(response_handle)
                        body_size = response_handle:body():length()
                        response_handle:headers():add("response-body-size", tostring(body_size))
                        response_handle:headers():add("foo", "bar")
                      end

  clusters:
    - name: cluster_wackopicko
      connect_timeout: 1s
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: cluster_wackopicko
        endpoints:
        - lb_endpoints:
          - endpoint:
              address:
                socket_address:
                  address: 127.0.0.1
                  port_value: 8081

我需要在这个配置文件中做什么更改,才能将lua代码导出到位于我的Ubuntu服务器上的/envoy/lua/scripts/文件夹中的外部文件?

1个回答

0

Envoy >= 1.23.0

自 Envoy v1.23.0 (以及此 PR) 起,您可以在 default_source_code 中定义您的脚本。请参阅 文档

示例:

-- /envoy/lua/scripts/myscript.lua

function envoy_on_response(response_handle)
    body_size = response_handle:body():length()
    response_handle:headers():add("response-body-size", tostring(body_size))
    response_handle:headers():add("foo", "bar")
end

name: envoy.filters.http.lua
typed_config:
  "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
  default_source_code: 
    filename: /envoy/lua/scripts/myscript.lua

Envoy < 1.23.0

对于旧版本,您可以使用filenamesource_codes。请参见文档

但是,您必须添加inline_code这是一个已知问题

例如:

-- /envoy/lua/scripts/myscript.lua

function add_headers(response_handle)
    body_size = response_handle:body():length()
    response_handle:headers():add("response-body-size", tostring(body_size))
    response_handle:headers():add("foo", "bar")
end

name: envoy.filters.http.lua
typed_config:
  "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
  inline_code: |
    require("envoy.lua.scripts.myscript")

    function envoy_on_response(response_handle)
      add_headers(response_handle)
    end
  source_codes:
    myscript.lua:
      filename: /envoy/lua/scripts/myscript.lua

我按照你说的更改了yaml文件,但是出现了以下错误: Proto约束验证失败(LuaValidationError.InlineCode: 值长度必须至少为1个字符):source_codes { key: "cwaf.lua" value { filename: "/home/radware/lib/envoy_geoip.lua" } - Daniel
@Daniel 我已经更新了我的答案,包括Envoy v1.23.0和Envoy < v1.23.0版本。希望能有所帮助。 - norbjd
当我尝试按照这篇文章安装Envoy时,它总是安装1.18.2.p0版本。https://www.envoyproxy.io/docs/envoy/latest/start/install你有没有安装全新的1.23版本或者升级程序的步骤? - Daniel
仓库中可能存在过时的版本。1.23.0 是相当新的(发布于2022年7月15日)。你用的是Linux(哪个发行版?)还是MacOS?我个人使用Docker镜像来使用最新版本的Envoy。 - norbjd
我正在使用Ubuntu Server 20.04,并尝试常规安装Envoy(而不是在Docker镜像中安装)。 - Daniel
Tetrate存储库中的Envoy软件包已过时 (https://cloudsmith.io/~tetrate/repos/getenvoy-deb-stable/packages/)。恐怕现在唯一的解决方案是自己构建最新版本的Envoy。或者您可以从基于Ubuntu的Docker镜像中提取Envoy使用的二进制文件和其他文件夹,然后将其复制到主机上?(不确定是否有效)。 - norbjd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接