2

我想授予从我的Elastic Beanstalk(Ruby on Rails)应用程序访问我的AWS ElasticSearch实例的权限。具体来说,我试图通过logstash-elasticsearch插件管理logstash数据。我的期望是这将是一个标准的用例(基于this blog post),但它似乎不可能。如何从Elastic Beanstalk连接到AWS ElasticSearch实例?

我试过被设置在ES实例访问策略的EB角色的第一件事:

{ 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "arn:aws:iam::XXXX:role/aws-elasticbeanstalk-ec2-role" 
     }, 
     "Action": "es:*", 
     "Resource": "arn:aws:es:us-west-1:XXXXX:domain/YYYY/*" 
    } 

这没有工作,我相信,因为所使用的EC2实例之间进行通信的端口和ES。我考虑的其他选项:

  • 授予访问EC2实例的硬编码IP访问权限的权限。 (难以维持
  • 授予访问的弹性IC地址EC2实例(如何?
  • 授予完全公开访问ES实例(非常不安全
  • 发送某种从Logstash到ES的IAM /用户凭证。

如果我能弄清楚如何设置它,最后一个选项将起作用。


编辑:答案语法:基于以下birryree的答案,这是我获得这项工作:

  • 添加新command2_logstash.config文件(从上面的博客文章)以安装亚马逊logstash插件:/opt/logstash/bin/logstash-plugin install logstash-output-amazon_es
  • 调整我的logstash配置文件以使用amazon_es插件。这或多或少是对elasticsearch的直接替代,尽管我最终明确指定了aws_access_key_idaws_secret_access_key

回答

3

你有的基本政策应该工作,一个完整的策略,授予权限的IAM角色看起来是这样的:

{ 
    "Version": "2012-10-17", 
    "Statement": [{ 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "arn:aws:iam::ACCOUNT:role/ROLE" 
     },  
     "Action": "es:*", 
     "Resource": "arn:aws:es:us-west-1:ACCOUNT:domain/DOMAIN/*" 
    } 
    ] 
} 

当您使用IAM角色/基于用户的策略,但是,您必须发送与Version 4 Signatures签署的Elasticsearch请求。当您使用官方AWS开发工具包时,当您访问AWS ES资源时,他们将透明地执行请求签名。

虽然您使用的是Logstash,但标准的logstash-elasticsearch插件不支持此操作,所以如果您想最大限度地减少允许访问ES集群的人员,那么您可能希望使用AWS Logstash ES输出插件。

Amazon AWS实验室有一个名为logstash-output-amazon_es的插件,它的行为与logstash_elasticsearch的行为基本相同,只是它为每个请求执行签名。

这个插件确实有一些限制,比如不支持Logstash 5。x还是(它只支持Logstash v2.x)。将重要的部分合并到官方的logstash插件源中是一个长达一年的问题,但目前尚不清楚这些问题何时会发生。

+0

这太神奇了。谢谢。我在原始问题中为将来的读者添加了更详细的说明。 –