从非AWS node.js应用程序连接到AWS Elasticsearch



我正在努力解决我正在从事的一个项目的基础设施问题。我正在开发的服务托管在一个临时的容器化平台上,没有稳定的IP—只有一个域名(api.example.com)。我正在使用Elasticsearch进行搜索,因此请求转到/my-search-resource之类的东西,然后使用ES查找要返回的结果。它是用node编写的,并使用支持的elasticsearch驱动程序连接到ES。

我遇到的问题是试图使用AWS Elasticsearch域。这个项目是自启动的,所以我利用了AWS的免费层,尽管其他服务托管/部署在另一个平台上(想想:heroku、GCP等——容器化和瞬时资源)。

由于我不能仅仅将特定IP列入白名单,我不确定我应该做些什么来使服务能够访问该服务。我需要签署每个请求发送到域吗?这并不理想,因为它需要用该功能给ES驱动程序库打猴式补丁。理想情况下,我只想使用用户名&pw连接到域,但我知道IAM不是真正面向的东西,从外部服务。什么好主意吗?这有可能吗?

在我目前的项目中,我们使用正常的elasticsearch NPM包连接AWS Elastic,然后在连接时使用http-aws-es创建特定的AWS连接头。

例如,我们有这样的内容:

const es = require( 'elasticsearch' );
const httpAwsEs = require( 'http-aws-es' );
const esClient = es.Client( { 
  hosts: 'somehostonaws',
  connectionClass: httpAwsEs,
  awsConfig: {
    region: 'some-aws-region',
    accessKey: 'some-aws-access-key',
    secretKey: 'some-aws-secret-key'
  }
} );

这并不需要整个AWS SDK,但它可以让你连接到AWS背后的Elastic。这能解决你的问题吗?

这不是问题的解决方案,而是关于如何处理它的一些想法。我们目前处于同样的困境:我们希望使用AWS,但我们不想与AWS SDK绑定。据我了解,AWS提供了3个选项:

  1. 向公众开放(不可取)
  2. 固定IP(白名单)
  3. AWS认证

选项1不是选项。

选项2给我们带来了一个问题,我们必须教我们用来登录那里的任何东西通过代理,以便请求看起来来自同一个IP地址。我们的设置在Heroku上,我们使用QuotaGuard来解决类似的问题。然而:我检查了我将要用来交互的模块(我们试图在那里记录,要么直接使用温斯顿传输到logstash或elasticsearch),它们不支持代理。也许你的情况有所不同。

选项3目前也不被winston transport支持。这将使我们使用AWS sdk模块并永远与AWS绑定,或者编写我们自己的模块。

相关内容

  • 没有找到相关文章

最新更新