Фильтр Envoy с помощью скрипта Lua для извлечения данных из другого API

#kubernetes #lua #istio #envoyproxy

#kubernetes #lua #istio #envoyproxy

Вопрос:

У меня есть фильтр Envoy, в котором я добавляю заголовок к каждому HTTP-запросу. Значение заголовка берется из API.

Давайте предположим две конфигурации фильтра. В приведенной ниже конфигурации я добавил жестко запрограммированную версию моего заголовка. Это было проверено в журналах моего целевого приложения, и оно работает.

 apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: lua-filter
spec:
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: ANY
      listener:
        portNumber: 7123
        filterChain:
          filter:
            name: "envoy.http_connection_manager"
            subFilter:
              name: "envoy.router"
    patch:
      operation: INSERT_BEFORE
      value:
       name: envoy.lua
       typed_config:
         "@type": "type.googleapis.com/envoy.config.filter.http.lua.v2.Lua"
         inlineCode: |
            function envoy_on_request(request_handle)
                request_handle:headers():add("authorization", "it works!")
            end
  

На этот раз я хочу, чтобы значение заголовка поступало из моего API. К сожалению, эта настройка не работает, и я понятия не имею, почему. Я проверил скрипт Lua на своем локальном компьютере, и сам скрипт работает, но как только я предоставляю скрипт фильтру, заголовок не добавляется.

  typed_config:
     "@type": "type.googleapis.com/envoy.config.filter.http.lua.v2.Lua"
     inlineCode: |
        function envoy_on_request(request_handle)
          local http = require('socket.http')
          local json = require('json')
          local ltn12 = require "ltn12"
          local reqbody="my request body"
          local respbody = {} 
          local  body, code, headers, status = http.request {
          method = "POST",
          url = "http://my-address",
          source = ltn12.source.string(reqbody),
          headers = 
          {
          ["Accept"] = "*/*",
          ["Accept-Encoding"] = "gzip, deflate",
          ["Accept-Language"] = "en-us",
          ["Content-Type"] = "application/x-www-form-urlencoded",
          ["content-length"] = string.len(reqbody)
          },
          sink = ltn12.sink.table(respbody)
          }
          respbody = table.concat(respbody)
          parsed = json.decode(respbody)
          token = parsed["token-value"]
        request_handle:headers():add("authorization",token)
         end
  

Комментарии:

1. Каков результат envoy с -l debug флагом? Есть ошибки?

2. В документах говорится: Не выполнять операции блокировки из сценариев . http.request блокируется. Возможно, вам лучше использовать внешнюю авторизацию в сети

3. Или используйте request_handle:httpCall из envoy lua Api.