Logstash elasticsearch 输出插件 - 从元数据字段填充 api_key 不起作用

Logstash elasticsearch output plugin - Populating api_key from metadata field does not work

我正在使用 logstash 的 elasticsearch 输出插件 post 我的事件到 elasticsearch。我正在使用 api_key 身份验证方法。在我对 api_key 参数值进行硬编码之前,一切正常。例如:

api_key => "xxxxxxxxxxxx:yyyyyyyyyyyyyyyy"

其中 Xs 类似于 id,Ys 类似于使用 create api_key security api.

生成的 api_key

但在我的过滤器中,我将要传递给 api_key 参数的值添加到元数据字段 [@metadata][myapikey] 中。这个想法是在输出插件中使用它,如下所示

output {
   elasticsearch {
            hosts => ["https://localhost:9200"]
            cacert => 'path-to-ca.crt'
            index => "my-index-name"
            api_key => "%{[@metadata][myapikey]}"
            ssl => true
   }
}

根据我的理解,如果我们从像 index => "%{[@metadata][some-index-name]}" 这样的元数据字段中提供 index,这应该可以正常工作。我以前成功地将它用于索引名称。

不确定为什么相同的实现对 api_key 参数不起作用。我已经确保使用 stdout 插件元数据在其中包含正确的值,但是当我 运行 this.

时仍然看到无效的 api_key 值消息

请帮忙。

正在添加完整的管道配置

input {
  generator {
    lines => [
          '{"timestamp" : "26/01/2021", "fruit-ID" : "t6789", "vegetable-ID" : "Veg1-1002", "Status" : "OK", "myapikey" : "3p4oIUr-Qxxxxxxx-rA"}'
        ]
    count => 1
    codec => "json"
  }
}

filter {
    
        mutate { 
            add_field => { "[@metadata][myapikey]" => "xxxxxxxxxxx-%{myapikey}" }
            remove_field => ["myapikey"]                    
        }
    
}

output {
    elasticsearch {
            hosts => ["https://localhost:9200"]
            cacert => 'path-to-ca.crt'
            index => "my-index-name"
            api_key => "%{[@metadata][myapikey]}"
            ssl => true
  }
}

我想是因为api_key设置不支持sprintf format

supports that format, api_key doesn'tindex 设置相反,Logstash 将原始值 %{[@metadata][myapikey]}(未解析)作为 API 键发送这显然失败了。

我认为这个设计决定背后的主要原因是 API 键,就像密码一样,不应该是在每个文档中移动的字段。