我正在努力解决我正在研究的项目的基础架构问题。我正在开发的服务托管在一个没有稳定IP的瞬态容器化平台上 - 只有一个域名(api.example.com)。我正在使用Elasticsearch进行搜索,因此请求会转到/ my-search-resource之类的内容,然后使用ES查找要返回的结果。它是在节点中编写的,并使用支持的elasticsearch驱动程序连接到ES。
我遇到的问题是尝试使用AWS Elasticsearch域。这个项目是自助式的,所以我正在利用AWS的免费套餐,即使其他服务托管/部署在另一个平台上(想想:heroku,GCP等 - 集装箱化和瞬态资源)。
由于我不能将特定IP列入白名单,因此我不确定应该如何使服务能够访问该服务。我需要签署发送到域的每个请求吗?这并不理想,因为它需要使用该功能对ES驱动程序库进行猴子修补。理想情况下,我只想使用用户名& pw连接到域,但我知道IAM并不是真正面向来自外部服务的东西。有任何想法吗?这甚至可能吗?
答案 0 :(得分:11)
在我当前的项目中,我们使用普通的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。这是你问题的解决方案吗?
答案 1 :(得分:0)
这不是问题的解决方案,而是关于如何处理问题的一些想法。我们目前处于相同的状态:我们希望使用AWS,但我们不想与AWS SDK配合使用。据我了解,AWS提供了3个选项:
选项1不是一种选择。
选项2向我们展示了一个问题,即我们必须教授我们用于登录的任何内容以通过代理,以便请求看起来来自相同的IP地址。我们的设置在Heroku上,我们使用QuotaGuard来解决类似的问题。但是:我检查了我将用于交互的模块(我们试图在那里登录,使用winston传输直接使用logstash或elasticsearch)并且它们不提供代理支持。也许这在你的情况下是不同的。
此时winston传输也不支持选项3。这将使我们永远使用aws-sdk模块并与AWS配合或编写我们自己的模块。