首页 > 解决方案 > 如果我不使用 cognito,如何使用 Nodejs 在 axios 中准确签署 AWS elasticsearch 搜索请求?

问题描述

Web App的目的:用户访问网站,输入他们的数据并选择他们负责的商店并点击提交。然后在后端 dynamoDB 将连接两组数据 - 用户联系人来存储信息。我正在使用 api 网关进行搜索并创建路由 - 除了允许 lambda 与 ES 和 dynamoDB 对话的 iam 角色之外,不涉及身份验证。

1)我没有使用 Cognito 或进行身份验证 - 我不需要它用于这个用例,这是一个调查应用程序。但是,我正在使用 Elasticsearch 来帮助我的自动完成下拉/搜索字段。

2) 我能够进行正常的非签名 axios 调用以获取搜索结果(参见下面的代码 (A1))。Params.url 有 {endpoint}/indexname/_search。这是有效的,因为现在我的端点是敞开的。

我想要完成的事情:我想锁定我的 ES 域,这样它就更安全了。虽然 IAM 角色允许我的 lambda 与 ES 对话,但除非 ES 完全开放,否则我无法执行 (A1) 中显示的搜索功能。我知道我必须签署我的请求,但我对如何使用 aws4 之类的包来完成这一点有点困惑。AWS 站点上显示的示例有点令人困惑,我没有任何运气可以复制它。

我已经用 aws4(见 A2)开始了这个过程,但我不清楚如何让它工作。有人可以给一些指导吗?总结..:a)我如何使用 aws4 或任何其他方法实现签名请求,b)ES 域的策略应该是什么样的?

A1)

axios({
    method: "post",
    url: params.url,
    headers: {
      "Content-Type": "application/json"
    },
    data: {
      query: {
        query_string: {
          default_field: "Building Description",
          query: params.data
        }
      }
    }
  });

A2)

axios(aws4.sign({
    host: process.env.ES_ENDPOINT,
    method: "POST",
    url: `https://${process.env.ES_ENDPOINT}/indexname/_search`,
    path: "/indexname/_search",
}))

标签: javascriptnode.jsamazon-web-serviceselasticsearch

解决方案


最简单的方法是使用 AWS JavaScript 开发工具包进行签名并为其提供有限范围的凭证。

注意:这并不意味着使用 AWS 开发工具包 ElasticSearch 客户端。

在 Lambda 中使用 AWS 开发工具包时,这是为您完成的,但也可以在任何 javascript 环境中完成。虽然我会非常仔细地考虑在客户端使用它,但即使这样也有它的用途。

可以在此处找到为 JavaScript SDK 添加凭据的可能方法。

可以在此处查看使用 AWS JavaScript SDK 向 ES 发出签名请求的示例。

这里有几个基于资源的访问策略的例子。我认为您所追求的将在该页面的下半部分。


推荐阅读