OTEL 收集器替换 JSON 配置作为环境变量

问题描述 投票:0回答:1

我希望通过Vault-agent-injector 变异 Webhook 注入敏感配置值,从而确保集群中 otel-collector 部署的安全和自动化。我正在使用一个定制的 otel-collector 二进制文件,它与 google Chronicle 转发器一起提供。

https://github.com/observIQ/bindplane-agent/tree/release/v1.49.0/exporter/chronicleexporter

这是我的配置:

exporters:
  chronicle:
    creds: |
      ${env.CHRONICLE_JSON}
    customer_id: someCustomerId
    endpoint: someChronicleEndpoint
    log_type: CUSTOM_APPLICATION_ACCESS
  debug:
    verbosity: detailed
  elasticsearch:
    api_key: ${env.ES_API_KEY}
    endpoints:
    - someESEndpoint
    password: ${env.ES_PASSWORD}
    user: someESuser
  elasticsearch/log:
    endpoints:
    - someESEndpoint

当收集器替换

CHRONICLE_JSON
的值时,我从收集器处收到
unexpected end of input
错误。这是该环境变量的值,敏感值替换为占位符。

{
  "type": "service_account",
  "project_id": "someProjectID",
  "private_key_id": "11111111111111111",
  "private_key": "-----BEGIN PRIVATE KEY-----\nsomeCert\n-----END PRIVATE KEY-----\n",
  "client_email": "someClientEmail",
  "client_id": "111111111111111111111",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "someCertUrl",
  "universe_domain": "googleapis.com"
}

我知道此配置有效,因为当我手动运行收集器时,导出器会正确转发。我知道我的 Vault 注释正在工作,如

/vault/secrets/otel-collector
所示,我可以看到我的秘密已正确填充,并且我知道我的容器正在正确获取它们,因为环境变量也已填充。

我认为我在这里格式化的内容不正确,或者不完全理解这种替换是如何工作的。似乎正是这个 JSON 值导致了问题,因为只有硬编码的 JSON 值收集器也可以很好地替换 ES 值。

这是注入器模板的秘密文件的内容,同样带有占位符值:

export ES_API_KEY="someAPIKey"
export ES_PASSWORD="somePassword"
export CHRONICLE_JSON='{
  "type": "service_account",
  "project_id": "someProjectID",
  "private_key_id": "11111111111111111",
  "private_key": "-----BEGIN PRIVATE KEY-----\nsomeCert\n-----END PRIVATE KEY-----\n",
  "client_email": "someClientEmail",
  "client_id": "111111111111111111111",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "someCertUrl",
  "universe_domain": "googleapis.com"
}'

我尝试过在一行中格式化 JSON 并转义它等等。但我一生都无法正确替换它。我确实读过 https://github.com/open-telemetry/opentelemetry-collector/issues/5223 但这仍然是一个悬而未决的问题,所以我无法确切地看出我的配置出了什么问题。

如何格式化此环境变量,使其对我的收集器有效?

open-telemetry vault open-telemetry-collector otel
1个回答
0
投票

我最终将 json 作为文件注入,并调整导出器配置以从文件中读取。

vault.hashicorp.com/agent-inject-secret-config.json: "secret/data/development/otel-collector"
vault.hashicorp.com/agent-inject-template-config.json: |
  {{`{{- with secret "secret/data/development/otel-collector" -}}`}}
  {{`{{ .Data.data.CHRONICLE_JSON }}`}}
  {{`{{- end }}`}}
vault.hashicorp.com/agent-inject-secret-envvars: "secret/data/development/otel-collector"
vault.hashicorp.com/agent-inject-template-envvars: |
  {{`{{- with secret "secret/data/development/otel-collector" -}}`}}
  export ES_PASSWORD="{{`{{ .Data.data.ES_PASSWORD }}`}}"
  export ES_API_KEY="{{`{{ .Data.data.ES_API_KEY }}`}}"
  {{`{{- end }}`}}
exporters:
  chronicle:
    creds_file_path: '/vault/secrets/config.json'
© www.soinside.com 2019 - 2024. All rights reserved.