我正在努力解决我正在从事的一个项目的基础设施问题。我正在开发的服务托管在一个临时的容器化平台上,没有稳定的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个选项:
- 向公众开放(不可取)
- 固定IP(白名单)
- AWS认证
选项1不是选项。
选项2给我们带来了一个问题,我们必须教我们用来登录那里的任何东西通过代理,以便请求看起来来自同一个IP地址。我们的设置在Heroku上,我们使用QuotaGuard来解决类似的问题。然而:我检查了我将要用来交互的模块(我们试图在那里记录,要么直接使用温斯顿传输到logstash或elasticsearch),它们不支持代理。也许你的情况有所不同。
选项3目前也不被winston transport支持。这将使我们使用AWS sdk模块并永远与AWS绑定,或者编写我们自己的模块。