You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS托管OpenSearch的Kibana是否无法置于ALB后对接Okta SSO认证?

问题解答:AWS托管OpenSearch Kibana接入ALB及Okta SSO方案

能否将托管OpenSearch Kibana直接部署在ALB之后?

结论是不能。AWS托管OpenSearch(原ElasticSearch)的Kibana是服务内置的托管组件,默认仅通过OpenSearch域的公网/VPC端点暴露,不支持作为后端资源注册到用户自行创建的ALB目标组,因此无法直接在ALB层转发请求到托管Kibana完成前置身份校验。

可行替代实现方案

  • 方案1:ALB + Lambda代理方案(即你查询到的自定义代理方案)
    具体实现逻辑如下:
    1. 先为ALB开启内置OIDC身份认证能力,对接你的Okta身份源,所有访问请求首先到达ALB,未登录用户会自动跳转至Okta登录页完成OIDC身份校验
    2. ALB校验通过后,将请求转发到已配置为ALB目标组的Lambda函数
    3. Lambda函数作为反向代理,使用被授予了es:ESHttp*访问权限的IAM角色对请求做AWS SigV4签名,再将签名后的请求转发到托管OpenSearch的Kibana端点,最终将Kibana返回的响应透传给前端用户
      开发时需要额外处理Kibana路径重写、Cookie透传、静态资源路径适配等逻辑,避免页面跳转异常。
  • 方案2:Amazon Cognito对接Okta + OpenSearch原生身份认证(官方推荐方案)
    托管OpenSearch原生支持绑定Amazon Cognito作为身份提供商,你可以先将Okta配置为Cognito用户池的OIDC外部身份源,再将Cognito和你的OpenSearch域绑定,无需部署任何自定义代理服务,直接使用OpenSearch自带的身份认证能力即可完成Okta SSO登录,运维成本最低。
  • 方案3:自行部署独立Kibana节点对接托管OpenSearch
    你可以在EC2、EKS等计算资源上自行部署开源版本的Kibana,将数据源配置为你的托管OpenSearch域端点,再把自行部署的Kibana服务注册到ALB后端,直接在ALB层配置Okta OIDC校验即可,该方案可以完全控制Kibana的部署逻辑和接入规则。

Lambda代理方案核心代码示例

以下是Node.js运行时的Lambda核心实现逻辑参考:

const { SignatureV4 } = require('@aws-sdk/signature-v4');
const { HttpRequest } = require('@aws-sdk/protocol-http');
const { defaultProvider } = require('@aws-sdk/credential-provider-node');
const https = require('https');

// 环境变量配置OpenSearch端点和区域
const OPENSEARCH_ENDPOINT = process.env.OPENSEARCH_ENDPOINT;
const REGION = process.env.AWS_REGION;

const signer = new SignatureV4({
  credentials: defaultProvider(),
  region: REGION,
  service: 'es',
  sha256: require('@aws-crypto/sha256-browser').Sha256
});

exports.handler = async (event) => {
  // 构造发往OpenSearch的请求
  const request = new HttpRequest({
    hostname: OPENSEARCH_ENDPOINT,
    path: event.path,
    method: event.httpMethod,
    headers: event.headers,
    body: event.body ? Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf8') : undefined
  });
  // 对请求做SigV4签名
  const signedRequest = await signer.sign(request);
  // 转发请求到OpenSearch并返回响应
  return new Promise((resolve, reject) => {
    const req = https.request(signedRequest, (res) => {
      const chunks = [];
      res.on('data', (chunk) => chunks.push(chunk));
      res.on('end', () => {
        resolve({
          statusCode: res.statusCode,
          headers: res.headers,
          body: Buffer.concat(chunks).toString('base64'),
          isBase64Encoded: true
        });
      });
    });
    req.on('error', reject);
    if (signedRequest.body) req.write(signedRequest.body);
    req.end();
  });
};

内容的提问来源于stack exchange,提问作者wuls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:18:01