如何从Elastic Beanstalk连接到AWS ElasticSearch实例?

时间:2016-12-21 20:56:35

标签: amazon-web-services amazon-ec2 logstash elastic-beanstalk

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

我尝试的第一件事是在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访问权限的访问权限。 (难以维护
  • 授予对EC2实例的弹性IC地址的访问权限(如何?
  • 授予对ES实例的完全公共访问权限(非常不安全
  • 从Logstash向ES发送某种IAM /用户凭据。

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

编辑:答案语法:根据birryree的答案,以下是我为此付出的努力:

  • 将新的command添加到我的2_logstash.config文件(来自上述博文),以便安装Amazon logstash插件:/opt/logstash/bin/logstash-plugin install logstash-output-amazon_es
  • 调整我的logstash配置文件以使用amazon_es插件。这或多或少是elasticsearch的替代品,但我最终明确指定了aws_access_key_idaws_secret_access_key

1 个答案:

答案 0 :(得分: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 Output插件。

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

这个插件确实有一些限制,例如不支持Logstash 5.x(它只支持Logstash v2.x)。将重要位合并到官方logstash插件源中有一个问题,但不清楚何时会发生这种情况。